Compare commits
838 Commits
ver_0_4
...
ver_3_0_0_
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
21bd4c662d | ||
|
|
47d9d091d1 | ||
|
|
da2ea09e84 | ||
|
|
9c71bdbcef | ||
|
|
318f9518b1 | ||
|
|
19e9fb5f67 | ||
|
|
41833c1f29 | ||
|
|
4e2f950e41 | ||
|
|
ebe3f39ea1 | ||
|
|
c6521d0b48 | ||
|
|
74b5c9f0e3 | ||
|
|
4bfebe1563 | ||
|
|
2ac4e65827 | ||
|
|
b7a135db10 | ||
|
|
d4c460fd3d | ||
|
|
8f0ac35381 | ||
|
|
a9a3229c22 | ||
|
|
5da622ff88 | ||
|
|
32f33f5150 | ||
|
|
242013f3b0 | ||
|
|
e46deb505f | ||
|
|
5d443fd1be | ||
|
|
d53152858c | ||
|
|
aefb31fb58 | ||
|
|
0be8219b9c | ||
|
|
cbb8bc5d77 | ||
|
|
6969dcbfec | ||
|
|
9e463ddddf | ||
|
|
5ec034c475 | ||
|
|
1694e648fc | ||
|
|
16aa96ebf4 | ||
|
|
43d06e184d | ||
|
|
3ff432034a | ||
|
|
0325bb1f25 | ||
|
|
b9aebf7e9e | ||
|
|
e1e693a7c8 | ||
|
|
c8c548fe97 | ||
|
|
ddf971ed54 | ||
|
|
61e8f47986 | ||
|
|
3ce9f403e6 | ||
|
|
3741010044 | ||
|
|
badfb12243 | ||
|
|
0713a6457c | ||
|
|
9abe744dac | ||
|
|
b4974aeacd | ||
|
|
688a0de498 | ||
|
|
7cef8465fa | ||
|
|
532279d2b8 | ||
|
|
d67ffc3a6c | ||
|
|
c6776b1755 | ||
|
|
49566977ad | ||
|
|
daf512e33e | ||
|
|
74816fc043 | ||
|
|
c88e37e9b5 | ||
|
|
c1c448f3df | ||
|
|
4f168a538b | ||
|
|
d94630af35 | ||
|
|
999dd1f468 | ||
|
|
c3d5631c3c | ||
|
|
9dae6b20d7 | ||
|
|
4005640a2b | ||
|
|
ca446faacf | ||
|
|
240539bd24 | ||
|
|
08e335f39c | ||
|
|
a9cc14b265 | ||
|
|
9505f119b3 | ||
|
|
683edf1668 | ||
|
|
d9c52c1a88 | ||
|
|
0f1a76a564 | ||
|
|
15cd354bae | ||
|
|
91d67ed0ae | ||
|
|
0740a7bd5e | ||
|
|
84493a99b4 | ||
|
|
f730fa3325 | ||
|
|
4b1007cb66 | ||
|
|
436f7442b6 | ||
|
|
3af05ebba5 | ||
|
|
c7db0371aa | ||
|
|
53860aaa46 | ||
|
|
829a4bf16a | ||
|
|
a83bc1bcb2 | ||
|
|
af65bb3a2b | ||
|
|
f2d9f6be27 | ||
|
|
ecea4ef4a4 | ||
|
|
e4e099510a | ||
|
|
de28ff96c2 | ||
|
|
6692ddcf1f | ||
|
|
ba7a105eb1 | ||
|
|
b9fb232859 | ||
|
|
6f54cb429e | ||
|
|
ae3398b11a | ||
|
|
e97693d12d | ||
|
|
435bb7dbe2 | ||
|
|
70bc5e78e9 | ||
|
|
a163e5b82c | ||
|
|
5eb66fe442 | ||
|
|
b6cf462b16 | ||
|
|
ead15a1cde | ||
|
|
9c19c70029 | ||
|
|
0862047241 | ||
|
|
6cfce1916d | ||
|
|
1e37bfa8ce | ||
|
|
87197067a0 | ||
|
|
8264f68f6c | ||
|
|
3e21357e8d | ||
|
|
ee5953d743 | ||
|
|
46f941b416 | ||
|
|
225e12e979 | ||
|
|
912ba274a6 | ||
|
|
18f59db2b9 | ||
|
|
f0ca1a5fa3 | ||
|
|
446e5a13f7 | ||
|
|
e8a9d18445 | ||
|
|
6256f33079 | ||
|
|
b5c4bd99bf | ||
|
|
56dae91c8a | ||
|
|
0661b1307a | ||
|
|
cd112f4925 | ||
|
|
14bf6b84d3 | ||
|
|
5c22a29e40 | ||
|
|
f1806f227b | ||
|
|
025e7b72b5 | ||
|
|
97b398051f | ||
|
|
e21d8516fb | ||
|
|
2972c70177 | ||
|
|
50b4274f68 | ||
|
|
75dc93f2c0 | ||
|
|
73fd627815 | ||
|
|
9e84141983 | ||
|
|
bd6591db7b | ||
|
|
515e876491 | ||
|
|
6105046ae9 | ||
|
|
f0eb0a9ded | ||
|
|
a227db586b | ||
|
|
04eafd3e61 | ||
|
|
3b25711e1f | ||
|
|
63687b5f8f | ||
|
|
cac2224fa1 | ||
|
|
44da7544b7 | ||
|
|
13478343cd | ||
|
|
a7aeae0aa2 | ||
|
|
876fb9946b | ||
|
|
e5853962b5 | ||
|
|
3eaa2ae230 | ||
|
|
cd1acd023e | ||
|
|
e2a314b553 | ||
|
|
102a2a03e8 | ||
|
|
8be0f9e06f | ||
|
|
40239ea078 | ||
|
|
47032cbb4a | ||
|
|
11dbeb2741 | ||
|
|
5242d16e02 | ||
|
|
428c007543 | ||
|
|
d0fbfdea86 | ||
|
|
b3fb18eee6 | ||
|
|
7d470fd0e8 | ||
|
|
295e6fb283 | ||
|
|
9e545e8cf8 | ||
|
|
182589745f | ||
|
|
bdfc430564 | ||
|
|
2da37f06ea | ||
|
|
eb5a492eb9 | ||
|
|
e79f031cb7 | ||
|
|
86909ae236 | ||
|
|
69861e7660 | ||
|
|
5054b1b5b5 | ||
|
|
a2496a536d | ||
|
|
f4ebe6a102 | ||
|
|
b10b922aa0 | ||
|
|
a8673cc076 | ||
|
|
2dd1cdc281 | ||
|
|
ccd03ae6d2 | ||
|
|
7e0771e065 | ||
|
|
e9fd3731a9 | ||
|
|
a5f242c28f | ||
|
|
43d1718618 | ||
|
|
d64f0d4a5e | ||
|
|
4a13ee8991 | ||
|
|
8764916086 | ||
|
|
78b0b77e38 | ||
|
|
8a7376f6df | ||
|
|
c9a36f12e6 | ||
|
|
8199e2a973 | ||
|
|
e1f3fb3a44 | ||
|
|
52275e92af | ||
|
|
5d9eec0992 | ||
|
|
cd9c637ba5 | ||
|
|
0bc405792a | ||
|
|
8fb36625bc | ||
|
|
674eca23b9 | ||
|
|
cfc1ead848 | ||
|
|
c41ffdfd2d | ||
|
|
df4708383b | ||
|
|
497c81a0c6 | ||
|
|
2c2f4a9ea1 | ||
|
|
feffa6d47e | ||
|
|
3bb33fa8d4 | ||
|
|
30a73c035a | ||
|
|
5c44fc0b28 | ||
|
|
a54b446dae | ||
|
|
631010ed3f | ||
|
|
8506638e5c | ||
|
|
c0f3a8eb2b | ||
|
|
662d870ad7 | ||
|
|
08746d6b10 | ||
|
|
bc8c8a6061 | ||
|
|
d09e5de229 | ||
|
|
1df1bda641 | ||
|
|
e8612e3779 | ||
|
|
a58d060310 | ||
|
|
a77c539f38 | ||
|
|
b5107b5634 | ||
|
|
6c880bb7b3 | ||
|
|
9297c70d11 | ||
|
|
bfafdc99d9 | ||
|
|
ab111a8e93 | ||
|
|
c2ce3d81e1 | ||
|
|
fb9813af51 | ||
|
|
4fb63d8a7b | ||
|
|
77982188bd | ||
|
|
8748932460 | ||
|
|
6c88df1ac0 | ||
|
|
cacb0777b7 | ||
|
|
bdf5a80868 | ||
|
|
ad1f1933e2 | ||
|
|
d7fe49a028 | ||
|
|
e802ccdc6e | ||
|
|
af2a881142 | ||
|
|
0ccf5409ca | ||
|
|
2529305803 | ||
|
|
bb8fb9d01a | ||
|
|
665f33a482 | ||
|
|
e5f948acda | ||
|
|
c28bbd5728 | ||
|
|
262fa5a3cd | ||
|
|
a58b774443 | ||
|
|
6deceb6bd1 | ||
|
|
808d3fd5c6 | ||
|
|
b82d3b82d9 | ||
|
|
cb8d780d70 | ||
|
|
01cd78c75d | ||
|
|
e7b289c399 | ||
|
|
a9b28c2270 | ||
|
|
5b059e6286 | ||
|
|
2c84636b7f | ||
|
|
2aba8dd8f1 | ||
|
|
41d68936b0 | ||
|
|
cb750624f9 | ||
|
|
bf3a37195b | ||
|
|
1e37f80368 | ||
|
|
5f9c2d3e62 | ||
|
|
c88449151e | ||
|
|
9c4f031581 | ||
|
|
3cac59adf4 | ||
|
|
77bcf720d3 | ||
|
|
e6b4c607e0 | ||
|
|
cbeb41c728 | ||
|
|
101aaa0a68 | ||
|
|
2233511fad | ||
|
|
8efa868ca3 | ||
|
|
e738d502ef | ||
|
|
2a7d5b51d9 | ||
|
|
67c4f160aa | ||
|
|
6d87313283 | ||
|
|
98e07690be | ||
|
|
c0bc769be9 | ||
|
|
01d9b0f291 | ||
|
|
2539692016 | ||
|
|
3a3fc548ca | ||
|
|
84d6cd18fb | ||
|
|
2d7b94e5a7 | ||
|
|
98eceb7c57 | ||
|
|
be92ec0379 | ||
|
|
34d4ec66a3 | ||
|
|
35c8ed6038 | ||
|
|
dd10a88ee2 | ||
|
|
71f0947988 | ||
|
|
d7cd3ff9e7 | ||
|
|
2567d6a5c9 | ||
|
|
5831d9e4ae | ||
|
|
690bc6bfa0 | ||
|
|
5f0e73bcb4 | ||
|
|
b1a7b67ae7 | ||
|
|
f0539d51ff | ||
|
|
1af34e3e25 | ||
|
|
0510dbfafc | ||
|
|
ca35689475 | ||
|
|
2ac1cc2308 | ||
|
|
0eebef47b0 | ||
|
|
29ef1301fb | ||
|
|
cfd5c5d9d7 | ||
|
|
347e1f9f59 | ||
|
|
2575320ec5 | ||
|
|
6c8ec356ec | ||
|
|
6e0712b189 | ||
|
|
906b1cb52f | ||
|
|
1eff8f8224 | ||
|
|
6a1f6d43cf | ||
|
|
8ab37354ff | ||
|
|
64340bf92e | ||
|
|
f0d490539e | ||
|
|
808464a7d0 | ||
|
|
3b8b70f760 | ||
|
|
cb58701af2 | ||
|
|
f05fbae8fc | ||
|
|
f1589d2ffe | ||
|
|
2d1df6c0e4 | ||
|
|
158596cede | ||
|
|
6c7df418af | ||
|
|
4e666d63b3 | ||
|
|
d1674dade2 | ||
|
|
ecb26a8b68 | ||
|
|
03785c4365 | ||
|
|
58c1d01b4a | ||
|
|
dc48aa08ba | ||
|
|
53f9cc8c3d | ||
|
|
0db888ef88 | ||
|
|
2ee8817103 | ||
|
|
71b0e7c60f | ||
|
|
740707539e | ||
|
|
ba088bf717 | ||
|
|
aa58a2ba56 | ||
|
|
ca9caf6e12 | ||
|
|
5a983c9600 | ||
|
|
d02c6ab450 | ||
|
|
4284cb8ea0 | ||
|
|
0743d4bce9 | ||
|
|
66ce0da9bc | ||
|
|
3e4f700a70 | ||
|
|
7518408d89 | ||
|
|
c5caffc75e | ||
|
|
086fea0349 | ||
|
|
f436c9f69c | ||
|
|
a153913d29 | ||
|
|
5189871fde | ||
|
|
daa0162639 | ||
|
|
4e6a452c87 | ||
|
|
a70a895a29 | ||
|
|
84bc3f5269 | ||
|
|
27f2bd1b26 | ||
|
|
38c63a3086 | ||
|
|
2c5301b676 | ||
|
|
1b85820314 | ||
|
|
3855c92564 | ||
|
|
ba85dc670b | ||
|
|
6221228d1f | ||
|
|
a901d9a61c | ||
|
|
0a0fac4ddb | ||
|
|
0e16cfecf6 | ||
|
|
838eb71a15 | ||
|
|
e373b1f74e | ||
|
|
b03e292d95 | ||
|
|
2139cb0212 | ||
|
|
35392a8c5c | ||
|
|
b7fab49da2 | ||
|
|
d0061b4ec9 | ||
|
|
2ffa82aff9 | ||
|
|
1c33f38323 | ||
|
|
4bb41fc368 | ||
|
|
c666fe30d8 | ||
|
|
1813e60cec | ||
|
|
4ae8f31c8f | ||
|
|
df466ac2eb | ||
|
|
846b3201b7 | ||
|
|
a2ab73c24a | ||
|
|
98e6693525 | ||
|
|
fed85592cb | ||
|
|
2b4a296128 | ||
|
|
c1b0e81b6c | ||
|
|
9a0915f3a1 | ||
|
|
a9481c86d2 | ||
|
|
5f0148dd72 | ||
|
|
dedefde79f | ||
|
|
8c421d333a | ||
|
|
97fbd36c6a | ||
|
|
e81344c357 | ||
|
|
33450039c7 | ||
|
|
5849f4ce3d | ||
|
|
70f20d2330 | ||
|
|
48e9b0b030 | ||
|
|
11db00b66c | ||
|
|
89dc775392 | ||
|
|
6d5f27fd3a | ||
|
|
e1ab8a43ba | ||
|
|
081325c68d | ||
|
|
004de3d29b | ||
|
|
8b5ba1e959 | ||
|
|
149e97c2d6 | ||
|
|
60cb2b8c20 | ||
|
|
a714c46fba | ||
|
|
692ccd0e97 | ||
|
|
e0aa0835cd | ||
|
|
845a0c4121 | ||
|
|
57a6ec56e3 | ||
|
|
4d53aa41e2 | ||
|
|
214534b211 | ||
|
|
5ac0d946a7 | ||
|
|
bd908a6952 | ||
|
|
400e94ea27 | ||
|
|
1d286d8388 | ||
|
|
bf79dd333f | ||
|
|
c882e63dad | ||
|
|
710e7afbe6 | ||
|
|
e51c9c1da2 | ||
|
|
b17f04e762 | ||
|
|
a6d16bdfc9 | ||
|
|
b6377596f8 | ||
|
|
b5d1210f72 | ||
|
|
af038c491b | ||
|
|
4af016ea4f | ||
|
|
a2d94315c3 | ||
|
|
e87e076b6a | ||
|
|
dfbc7cfd07 | ||
|
|
696efaad82 | ||
|
|
b435382a5e | ||
|
|
ea65ed57af | ||
|
|
f3058e4e9c | ||
|
|
75b570af95 | ||
|
|
840d8a48ba | ||
|
|
b5fec8dbde | ||
|
|
123dc84f05 | ||
|
|
98ceee3212 | ||
|
|
ab08aa1de1 | ||
|
|
e8c0a78e67 | ||
|
|
0c583b7838 | ||
|
|
7515cb0ab0 | ||
|
|
fc4d9cac24 | ||
|
|
8d496beceb | ||
|
|
ce1fac9e86 | ||
|
|
659d38b0db | ||
|
|
56a4238632 | ||
|
|
4c9f9d9876 | ||
|
|
533104ce55 | ||
|
|
06fd442dce | ||
|
|
8955e25c4f | ||
|
|
f543768c7b | ||
|
|
4c33cfecff | ||
|
|
2070f9b9e0 | ||
|
|
069695f570 | ||
|
|
ad300684c3 | ||
|
|
98d120717a | ||
|
|
1ebe34ce90 | ||
|
|
9565c908c6 | ||
|
|
85f36d3831 | ||
|
|
77aca4b628 | ||
|
|
7602c30d96 | ||
|
|
c5b2894d23 | ||
|
|
508a86b563 | ||
|
|
01faf96ccb | ||
|
|
3edb813da7 | ||
|
|
8cae0c74fb | ||
|
|
feefe2dcee | ||
|
|
7a40aa02ed | ||
|
|
5d9ac88750 | ||
|
|
93c54da5ba | ||
|
|
d9c87bdfbd | ||
|
|
6bbc902c75 | ||
|
|
79a4a55265 | ||
|
|
67081eed26 | ||
|
|
be37a24fc9 | ||
|
|
269d2b7be9 | ||
|
|
749ad55af1 | ||
|
|
866d28a36d | ||
|
|
1a3b3ae009 | ||
|
|
b5edc85a56 | ||
|
|
bb9e6f5101 | ||
|
|
9d37614f66 | ||
|
|
669989434c | ||
|
|
fb44b0b4b1 | ||
|
|
09f80eeed7 | ||
|
|
e5c81896aa | ||
|
|
7ad7d1e338 | ||
|
|
1b0c212a95 | ||
|
|
0dc9174c83 | ||
|
|
70197f35ee | ||
|
|
5c0cefefba | ||
|
|
54633a7b99 | ||
|
|
cde34cfc99 | ||
|
|
41dac34246 | ||
|
|
b1e0261216 | ||
|
|
84b1160c23 | ||
|
|
0cededc7ba | ||
|
|
0b932064ed | ||
|
|
c4c0cbb597 | ||
|
|
24662f2352 | ||
|
|
d460c5a473 | ||
|
|
87063bc4d3 | ||
|
|
948921930b | ||
|
|
dc494ff038 | ||
|
|
a98e163c7c | ||
|
|
e6428abc0b | ||
|
|
9597095b50 | ||
|
|
905272a3bc | ||
|
|
5da4035b03 | ||
|
|
435af3cf82 | ||
|
|
afc53b176b | ||
|
|
8624b0d63a | ||
|
|
1ac5cdd110 | ||
|
|
1be0292e78 | ||
|
|
523deb988a | ||
|
|
4ae815c6f9 | ||
|
|
d46b124674 | ||
|
|
df9a335052 | ||
|
|
038a6c7714 | ||
|
|
301d14acf0 | ||
|
|
c5a0e40065 | ||
|
|
b8c03fa9c1 | ||
|
|
3da742fa1d | ||
|
|
a1199f6ff0 | ||
|
|
4dc43891df | ||
|
|
7aede0a35e | ||
|
|
8b0239fdde | ||
|
|
ab632849bf | ||
|
|
cec6e00384 | ||
|
|
3656c6e42a | ||
|
|
b93278fa93 | ||
|
|
ff37bab36d | ||
|
|
f3783daf05 | ||
|
|
8c01484a5d | ||
|
|
d8994dc737 | ||
|
|
88890649bf | ||
|
|
d46842bd8e | ||
|
|
c240cfc854 | ||
|
|
81f5534a6a | ||
|
|
e60a1a6931 | ||
|
|
72e8f46633 | ||
|
|
d7c0959d27 | ||
|
|
862e8b6006 | ||
|
|
c9b47de8d1 | ||
|
|
0dd90a24dd | ||
|
|
9cfc0bcd64 | ||
|
|
1820299dcf | ||
|
|
acbfa7484b | ||
|
|
67fd776431 | ||
|
|
c04dd5b3b5 | ||
|
|
b8b2d337d5 | ||
|
|
8b0ffdf079 | ||
|
|
eb8328c36d | ||
|
|
2ab9bb0053 | ||
|
|
fae8e8396f | ||
|
|
cdccde0c7d | ||
|
|
ee829539c2 | ||
|
|
832679ac4f | ||
|
|
45af60459f | ||
|
|
2586fc9309 | ||
|
|
01cafebf89 | ||
|
|
9d530e2a62 | ||
|
|
c130b9a49e | ||
|
|
c10bf98500 | ||
|
|
83fb73389a | ||
|
|
f9933dcb4f | ||
|
|
74ccc599fe | ||
|
|
362acb9217 | ||
|
|
a3038adbd0 | ||
|
|
8015e59161 | ||
|
|
7a94ddcc26 | ||
|
|
4e73ff2bae | ||
|
|
257eb48e70 | ||
|
|
cf1564d598 | ||
|
|
e83380c7c5 | ||
|
|
799a06b63a | ||
|
|
b55e15a568 | ||
|
|
6b3edc3232 | ||
|
|
f65332f9cc | ||
|
|
3416928233 | ||
|
|
4d262872c8 | ||
|
|
795ae41d68 | ||
|
|
2e17b5c64a | ||
|
|
ddca296e2a | ||
|
|
af5d1d6c03 | ||
|
|
2f07667560 | ||
|
|
1fac4cb13c | ||
|
|
aa8c86ddcd | ||
|
|
83751acf91 | ||
|
|
01dc21e338 | ||
|
|
0b8f6db97a | ||
|
|
23dd87c294 | ||
|
|
9a19d3a6f6 | ||
|
|
ba6e02ea5e | ||
|
|
1426f7656d | ||
|
|
53ebeacc09 | ||
|
|
bd6cc8d7f4 | ||
|
|
19018f364e | ||
|
|
be0391bfa8 | ||
|
|
bfc36df82b | ||
|
|
5134f4163c | ||
|
|
4939a18a6c | ||
|
|
8aee915872 | ||
|
|
eeac8fd9a2 | ||
|
|
07db467827 | ||
|
|
8bed2081b9 | ||
|
|
f0e0b9063c | ||
|
|
41907297f8 | ||
|
|
2e0392a6db | ||
|
|
3c4b8911f5 | ||
|
|
3db7164f9f | ||
|
|
cfe3c34ab6 | ||
|
|
ceac50e33e | ||
|
|
b71ba01d32 | ||
|
|
5cc00d443c | ||
|
|
4edb3115e5 | ||
|
|
33435d89e4 | ||
|
|
f5c93b3413 | ||
|
|
59fbe71c56 | ||
|
|
4f6b5f0883 | ||
|
|
23eb3b596d | ||
|
|
55b2a27f40 | ||
|
|
5e46120b52 | ||
|
|
4b70bfa7c8 | ||
|
|
c530e25e02 | ||
|
|
409065375e | ||
|
|
32ccc2857f | ||
|
|
c1025cb76f | ||
|
|
1f6a738cda | ||
|
|
8f10a4f16e | ||
|
|
50d9fdefb3 | ||
|
|
d777d98396 | ||
|
|
75e7b0c6b0 | ||
|
|
9fc965d095 | ||
|
|
10b4611e81 | ||
|
|
f416f7cc49 | ||
|
|
50d9070f36 | ||
|
|
14db80441c | ||
|
|
6193e661f5 | ||
|
|
3e69394cca | ||
|
|
88cdcebe2d | ||
|
|
20024f8c50 | ||
|
|
40caf6cc0e | ||
|
|
2d3b28b973 | ||
|
|
325b087bd1 | ||
|
|
0703a5f777 | ||
|
|
c4a4749bcf | ||
|
|
1fd0facbe0 | ||
|
|
bc9ab17f2d | ||
|
|
22fd4f73a9 | ||
|
|
4de346fa39 | ||
|
|
e14c749f66 | ||
|
|
c0f1872f04 | ||
|
|
70944f0589 | ||
|
|
d2b4c85d37 | ||
|
|
a4cc2f5514 | ||
|
|
fa8f91d508 | ||
|
|
7966400cf2 | ||
|
|
3227540322 | ||
|
|
183f8bde3a | ||
|
|
62133dfedf | ||
|
|
eb833c69e3 | ||
|
|
53d96a2e32 | ||
|
|
efc1682877 | ||
|
|
8846bb2f0f | ||
|
|
558c80aa84 | ||
|
|
f905638e5b | ||
|
|
d1636f0fe9 | ||
|
|
1d1193c459 | ||
|
|
4a2e62be2d | ||
|
|
137cc84ca6 | ||
|
|
e744df1dca | ||
|
|
378dc6bc19 | ||
|
|
3f2f722dab | ||
|
|
25f57d65a5 | ||
|
|
f5dba96839 | ||
|
|
3a1d04eb38 | ||
|
|
adac25b3dd | ||
|
|
9b2229e3eb | ||
|
|
bf040dffa9 | ||
|
|
86a12cd2a6 | ||
|
|
bfcb56f06d | ||
|
|
9a4a336c78 | ||
|
|
6696eeeb9d | ||
|
|
4da90c4f9b | ||
|
|
88f31110a7 | ||
|
|
afab6191b2 | ||
|
|
7ce87ebd3d | ||
|
|
d8e1e932ae | ||
|
|
089430de17 | ||
|
|
dce0a40ebb | ||
|
|
2347edad82 | ||
|
|
0ab5eb2bf1 | ||
|
|
d314ffe897 | ||
|
|
1162dc3a7b | ||
|
|
0967634043 | ||
|
|
133355bc9d | ||
|
|
76c734dc01 | ||
|
|
3128e3e5f6 | ||
|
|
c9ebd5ae28 | ||
|
|
b6efcd86dd | ||
|
|
a0323aacd2 | ||
|
|
258b7551ff | ||
|
|
7a023554eb | ||
|
|
b557c9d890 | ||
|
|
8dae0aad96 | ||
|
|
902383cab7 | ||
|
|
a1eb6e5831 | ||
|
|
3656d4c514 | ||
|
|
e899f76249 | ||
|
|
d38bfcbbf7 | ||
|
|
0f654f5aaa | ||
|
|
6cab3ad6b3 | ||
|
|
6685e4dd77 | ||
|
|
2b42f25d1e | ||
|
|
85359ddf59 | ||
|
|
1e198a8d8e | ||
|
|
6bd545d307 | ||
|
|
bc53167731 | ||
|
|
9a5135b9e1 | ||
|
|
8193143459 | ||
|
|
61ac00d7fb | ||
|
|
7944613d42 | ||
|
|
ff07325a05 | ||
|
|
afe5436749 | ||
|
|
ade9d7ef32 | ||
|
|
6a397d7c72 | ||
|
|
933bbaf00b | ||
|
|
1bd53dda51 | ||
|
|
5595fea427 | ||
|
|
31661b1374 | ||
|
|
780965728e | ||
|
|
a7570d9e58 | ||
|
|
b6989e8ada | ||
|
|
f9f4daea94 | ||
|
|
ab175a747c | ||
|
|
2a10991980 | ||
|
|
95d3d45e66 | ||
|
|
d808fc1e6f | ||
|
|
e8f81b17fa | ||
|
|
db871c590c | ||
|
|
de464b2e6a | ||
|
|
e0acc5ce90 | ||
|
|
a1f913d91e | ||
|
|
d19b71073d | ||
|
|
ed66350c27 | ||
|
|
51d57b39f5 | ||
|
|
68524eb337 | ||
|
|
58f8ed29c7 | ||
|
|
3b96232e13 | ||
|
|
19b5d34c10 | ||
|
|
5bb4252cf0 | ||
|
|
8191d5f957 | ||
|
|
1c458c9ca9 | ||
|
|
36f84e357e | ||
|
|
c1b7d7dfc0 | ||
|
|
bbd45f82ab | ||
|
|
02f3e91c5d | ||
|
|
d5afa9f592 | ||
|
|
dceec4f537 | ||
|
|
51b09605df | ||
|
|
dc00c7d907 | ||
|
|
c6df2928a1 | ||
|
|
86bf9fd360 | ||
|
|
505de8c6dc | ||
|
|
70744f3df2 | ||
|
|
96393d5781 | ||
|
|
598c075670 | ||
|
|
ac8eef8f73 | ||
|
|
f5eb4e8bb6 | ||
|
|
abb7fe7f3c | ||
|
|
440bb002b6 | ||
|
|
6dd3f4b21a | ||
|
|
1278117b05 | ||
|
|
5c6c75b42e | ||
|
|
d78e5d6656 | ||
|
|
094c2d548d | ||
|
|
4913ac6cdd | ||
|
|
ac9efcf8ba | ||
|
|
6b4444d97a | ||
|
|
607d5f04bd | ||
|
|
b46aa416a0 | ||
|
|
800aa0b4f0 | ||
|
|
a0e0be2d68 | ||
|
|
3fa47dc2e6 | ||
|
|
25141d3c8e | ||
|
|
1f02aeaec4 | ||
|
|
5d4aada8f5 | ||
|
|
3bd7f78277 | ||
|
|
3994706465 | ||
|
|
12bf18ac02 | ||
|
|
5c6a8f3c45 | ||
|
|
ddddb703aa | ||
|
|
5ef4c78f8a | ||
|
|
05a7f104a4 | ||
|
|
da1183b4fa | ||
|
|
a51ad7ee88 | ||
|
|
df3e0e3b3a | ||
|
|
c156584417 | ||
|
|
74e649a033 | ||
|
|
342a45a424 | ||
|
|
7076c236ea | ||
|
|
0d90383ea3 | ||
|
|
fe59f88dd3 | ||
|
|
2f4704b18d | ||
|
|
c8c94bbd8b | ||
|
|
054e27e827 | ||
|
|
766f14d2bf | ||
|
|
4e52756a41 | ||
|
|
55fc398ddf | ||
|
|
a5e8e6c7cd | ||
|
|
bb8762835f | ||
|
|
7c8b1a8853 | ||
|
|
be8140a142 | ||
|
|
f7c57860b7 | ||
|
|
c44fc3ddbe | ||
|
|
c2fd3bd3a4 | ||
|
|
dfff2624ac | ||
|
|
91c40fddb6 | ||
|
|
cafeb36418 | ||
|
|
fa56c7b332 | ||
|
|
a52f1f3d37 | ||
|
|
476053c539 | ||
|
|
0530c5d9e9 | ||
|
|
b982e95c42 | ||
|
|
de286cbfa0 | ||
|
|
a94c685c6d | ||
|
|
58feb21dec | ||
|
|
81f0b821e3 | ||
|
|
ea8275677b | ||
|
|
c0891ec8c0 | ||
|
|
9dd38845a6 | ||
|
|
0d8aa25e63 | ||
|
|
f57c9333da | ||
|
|
f060b67b4a | ||
|
|
c59e13ac35 | ||
|
|
a49d1522b0 | ||
|
|
39e618f761 | ||
|
|
3d812e0eae | ||
|
|
4f1ac32865 | ||
|
|
d176570b1d | ||
|
|
393fb71b1a | ||
|
|
bd1be7e258 | ||
|
|
e296e93b23 | ||
|
|
bd457307ff | ||
|
|
f988cecc4d | ||
|
|
d2f67b2db2 | ||
|
|
c4a4c3d5e6 | ||
|
|
fa38fdbc2b | ||
|
|
2e03e3faca | ||
|
|
e448915e0b | ||
|
|
37836bedac | ||
|
|
a60663b238 |
@@ -1,3 +1,8 @@
|
||||
All code from version 0.7 on
|
||||
Copyright (c) 2003-2009 Max Baker and SNMP::Info Developers
|
||||
All rights reserved.
|
||||
|
||||
Original Code
|
||||
Copyright (c) 2002,2003 Regents of the University of California
|
||||
All rights reserved.
|
||||
|
||||
|
||||
508
ChangeLog
508
ChangeLog
@@ -1,13 +1,502 @@
|
||||
SNMP::Info - Perl5 OO Interface to Network Devices and SNMP MIBs
|
||||
ChangeLog $Id$
|
||||
SNMP::Info - Friendly OO-style interface to Network devices using SNMP.
|
||||
|
||||
version 3.00
|
||||
|
||||
[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 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)
|
||||
+ Added Q-BRIDGE-MIB support to SNMP::Info::Bridge
|
||||
+ Added Aironet AP4800 to Layer3::Aironet class
|
||||
+ Added C3500XL devices to the Layer2::C2900 class
|
||||
+ Added Cisco 3750 (37xxstack) to Layer3::C6500 class
|
||||
+ Added Cisco Catalyst 4000 to Layer3::C6500 class
|
||||
+ Added Cisco Catalyst 2970 to Layer3::C6500 Class
|
||||
* Made Cisco Commuinty string indexing a boolean method for clarification
|
||||
* Added VLAN info for HP devices using Q-BRIDGE-MIB
|
||||
* Fixed warning about uninitialized value in CiscoStats line 92
|
||||
* Added for more serial# checking for L2 and L3
|
||||
* Fixed warning in Layer2::Bay about non numeric port line 199
|
||||
Contributions from Dmitry Sergienko:
|
||||
+ Added Cisco Aironet BR500 and AP1200 to L2::Aironet Class
|
||||
* Fixed the Port name alias for Catalyst 2900 devices
|
||||
+ Added Support For ZyXEL DSLAMs and Allied Telesys Switches
|
||||
|
||||
version 0.7 (08/14/03)
|
||||
* Added Class for Catalyst 6500 Series - Layer3::C6500
|
||||
* Added CiscoVTP support to 3550,2900, and Catalyst classes
|
||||
* Extracted VLAN stuff from Layer2::Catalyst to SNMP::Info::CiscoVTP
|
||||
* Extracted CISCO-STACK-MIB from Layer2::Catalyst to SNMP::Info::CiscoStack
|
||||
* Added 2950's to the Layer2::C2900 class
|
||||
* Added 3548's and 350x's to the Layer3::C3550 class
|
||||
* Broke out 3550's into separate device types (3550-24, 3550-48)
|
||||
* Added T1,dual T1, and T3 , ATM over OC-12 ... to the SPEED_MAP
|
||||
* Fixed speed map -- OC-1 -> OC-3
|
||||
* Fixed Bug where Catalyst Switch running IOS would report CatOS as os()
|
||||
|
||||
version 0.6 (06/18/03)
|
||||
* Minor Bug Fix. SNMP::Info::Layer2::Bay and SNMP::Info::Layer2::C1900
|
||||
didn't return 1 and failed to load on some versions of Perl.
|
||||
|
||||
version 0.5 (06/10/03)
|
||||
* Added ability to get paritial tables. For example to get the
|
||||
IP routing table for 128.114.* you can do
|
||||
$ipr = $dev->ipr_dest('128.114');
|
||||
* Added IP Routing Table entries from RFC1213 to SNMP::Info
|
||||
* minor bug fixes
|
||||
|
||||
version 0.4 (04/29/03)
|
||||
* BIG CHANGE ! Internal Data structure has changed.
|
||||
* Added clear_cache() method
|
||||
* Added NO_SUCH support for snmpget (TABLE) calls to get SNMP MIB II data
|
||||
from SNMP Version 1 devices.
|
||||
* Methods load_all() and all() have changed their return value. Sorry but the API had to change.
|
||||
* New object methods snmp_comm(), snmp_ver(), store(), class(), nosuch() to make it more OO happy.
|
||||
* Methods load_all() and all() have changed their return value. Sorry but
|
||||
the API had to change.
|
||||
* New object methods snmp_comm(), snmp_ver(), store(), class(), nosuch()
|
||||
to make it more OO happy.
|
||||
* Globals are now cached
|
||||
* Added new argument 'AutoSpecify' to new() to auto-connect with subclass
|
||||
detected in device_type()
|
||||
@@ -20,15 +509,15 @@ version 0.4 (04/29/03)
|
||||
|
||||
version 0.3 (03/06/03)
|
||||
* Fixed HP model() warning
|
||||
* Added error checking for responses of NOSUCHOBJECT and NOSUCHINSTANCE in _global
|
||||
and _load_attr
|
||||
* Added error checking for responses of NOSUCHOBJECT and NOSUCHINSTANCE
|
||||
in _global and _load_attr
|
||||
* Added more debugging
|
||||
* Added info and munging for c_capabilities in SNMP::Info::CD
|
||||
Thanks to Martin Lorensen <martin@lorensen.dk>
|
||||
Thanks to Martin Lorensen <martin /at- lorensen.dk>
|
||||
* Removed requirement for SNMP in the Makefile.PL and moved it to t/prereq.t
|
||||
so that the Module will install via CPAN without trying to install the old
|
||||
4.2.0 version of SNMP on CPAN. Will now fail in the test phase.
|
||||
Thanks again to Martin Lorensen <martin@lorensen.dk>
|
||||
Thanks again to Martin Lorensen <martin /at- lorensen.dk>
|
||||
* Moved tests from test.pl to t/*
|
||||
|
||||
version 0.2 (02/19/03)
|
||||
@@ -38,7 +527,8 @@ version 0.2 (02/19/03)
|
||||
* Added Spanning Tree Protocol (STP) methods to SNMP::Info::Bridge
|
||||
* Removed HP Specific MIBS in SNMP::Info::Layer2 and cleaned up model()
|
||||
* Added poke for Bay 450 Switches
|
||||
* Mapped HP Part Numbers to model numbers J4812A => 2512 in SNMP::Info::Layer2::HP
|
||||
* Mapped HP Part Numbers to model numbers J4812A => 2512 in
|
||||
SNMP::Info::Layer2::HP
|
||||
|
||||
version 0.1 (12/30/02)
|
||||
* Initial Release
|
||||
|
||||
29
DEVELOP
Normal file
29
DEVELOP
Normal file
@@ -0,0 +1,29 @@
|
||||
SNMP::Info Developer Guidelines
|
||||
|
||||
Coding Guidelines:
|
||||
- tab-width of 4, no tab characters
|
||||
- keep POD documentation up-to-date
|
||||
- always update ChangeLog before committing
|
||||
- always update DeviceMatrix.txt before committing
|
||||
- check-in required mibs to netdisco-mibs and release new package if needed
|
||||
|
||||
Release and Testing Instructions:
|
||||
- Please see misc/RELEASE in Netdisco
|
||||
( http://netdisco.cvs.sourceforge.net/viewvc/netdisco/misc/RELEASE?view=markup )
|
||||
and follow all testing and release guidelines
|
||||
|
||||
FAQ:
|
||||
- Do I have to update the version number and timestamp in modified files before committing?
|
||||
-> No. These are RCS tags that are automatically updated by CVS when you commit
|
||||
|
||||
- Should I add changes at the top of the ChangeLog?
|
||||
-> Yes. The changelog is created one commit at a time. If there isn't a
|
||||
section for the current version, then add one at the top and put your
|
||||
changes after. You can leave the date field for the release empty ().
|
||||
|
||||
- What should I change the $VERSION to?
|
||||
-> If you are the first person to get to a file after a release, update it
|
||||
to either release++ or "release++ dash cvs".
|
||||
Example: File is marked 2.01, change it to 2.02-cvs with your new changes.
|
||||
Example: File is marked 2.02-cvs, no change until packaging for release when the -cvs is removed.
|
||||
TODO: Is there still an odd/even scheme as introduced by Eric?
|
||||
1032
DeviceMatrix.txt
Normal file
1032
DeviceMatrix.txt
Normal file
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.00_003';
|
||||
|
||||
%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.00_003';
|
||||
|
||||
%MIBS = ( 'ADSL-LINE-MIB' => 'adslLineType' );
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
# ADSL-LINE-MIB::adslAtucChanTable
|
||||
'adsl_atuc_interleave_delay' => 'adslAtucChanInterleaveDelay',
|
||||
'adsl_atuc_curr_tx_rate' => 'adslAtucChanCurrTxRate',
|
||||
'adsl_atuc_prev_tx_rate' => 'adslAtucChanPrevTxRate',
|
||||
'adsl_atuc_crc_block_len' => 'adslAtucChanCrcBlockLength',
|
||||
|
||||
# ADSL-LINE-MIB::adslAturChanTable
|
||||
'adsl_atur_interleave_delay' => 'adslAturChanInterleaveDelay',
|
||||
'adsl_atur_curr_tx_rate' => 'adslAturChanCurrTxRate',
|
||||
'adsl_atur_prev_tx_rate' => 'adslAturChanPrevTxRate',
|
||||
'adsl_atur_crc_block_len' => 'adslAturChanCrcBlockLength',
|
||||
);
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::AdslLine - SNMP Interface to the F<ADSL-LINE-MIB>
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Alexander Hartmaier
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $info = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $info->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::AdslLine is a subclass of SNMP::Info that provides
|
||||
information about the adsl interfaces of a device.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
none.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<ADSL-LINE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
=over
|
||||
|
||||
=item none
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 ATUC channel table (C<adslAtucChanTable>)
|
||||
|
||||
This table provides one row for each ATUC channel.
|
||||
ADSL channel interfaces are those C<ifEntries> where C<ifType>
|
||||
is equal to adslInterleave(124) or adslFast(125).
|
||||
|
||||
=over
|
||||
|
||||
=item $info->adsl_atuc_interleave_delay()
|
||||
|
||||
(C<adslAtucChanInterleaveDelay>)
|
||||
|
||||
=item $info->adsl_atuc_curr_tx_rate()
|
||||
|
||||
(C<adslAtucChanCurrTxRate>)
|
||||
|
||||
=item $info->adsl_atuc_prev_tx_rate()
|
||||
|
||||
(C<adslAtucChanPrevTxRate>)
|
||||
|
||||
=item $info->adsl_atuc_crc_block_len()
|
||||
|
||||
(C<adslAtucChanCrcBlockLength>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 ATUR channel table (C<adslAturChanTable>)
|
||||
|
||||
This table provides one row for each ATUR channel.
|
||||
ADSL channel interfaces are those C<ifEntries> where C<ifType>
|
||||
is equal to adslInterleave(124) or adslFast(125).
|
||||
|
||||
=over
|
||||
|
||||
=item $info->adsl_atur_interleave_delay()
|
||||
|
||||
(C<adslAturChanInterleaveDelay>)
|
||||
|
||||
=item $info->adsl_atur_curr_tx_rate()
|
||||
|
||||
(C<adslAturChanCurrTxRate>)
|
||||
|
||||
=item $info->adsl_atur_prev_tx_rate()
|
||||
|
||||
(C<adslAturChanPrevTxRate>)
|
||||
|
||||
=item $info->adsl_atur_crc_block_len()
|
||||
|
||||
(C<adslAturChanCrcBlockLength>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
1822
Info/Airespace.pm
Normal file
1822
Info/Airespace.pm
Normal file
File diff suppressed because it is too large
Load Diff
825
Info/Bridge.pm
825
Info/Bridge.pm
File diff suppressed because it is too large
Load Diff
363
Info/CDP.pm
363
Info/CDP.pm
@@ -1,134 +1,163 @@
|
||||
# SNMP::Info::CDP
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Changes since Version 0.7 Copyright (c) 2004 Max Baker
|
||||
# All rights reserved.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CDP;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use Carp;
|
||||
|
||||
@SNMP::Info::CDP::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CDP::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CDP::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MIBS_V1 %MUNGE $INIT/;
|
||||
# Debug
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
use vars qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MUNGE $INIT/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
# Five data structures required by SNMP::Info
|
||||
$INIT = 0;
|
||||
%MIBS = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' );
|
||||
%MIBS_V1 = ( 'CISCO-CDP-MIB-V1SMI' => 'cdpGlobalRun' );
|
||||
%MIBS = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' );
|
||||
|
||||
# Notice we dont inherit the default GLOBALS and FUNCS
|
||||
# only the default MUNGE.
|
||||
%GLOBALS = (
|
||||
'cdp_run' => 'cdpGlobalRun',
|
||||
'cdp_interval' => 'cdpGlobalMessageInterval',
|
||||
'cdp_holdtime' => 'cdpGlobalHoldTime',
|
||||
'cdp_id' => 'cdpGlobalDeviceId',
|
||||
);
|
||||
'cdp_run' => 'cdpGlobalRun',
|
||||
'cdp_interval' => 'cdpGlobalMessageInterval',
|
||||
'cdp_holdtime' => 'cdpGlobalHoldTime',
|
||||
'cdp_gid' => 'cdpGlobalDeviceId',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
'c_index' => 'cdpCacheIfIndex',
|
||||
'c_proto' => 'cdpCacheAddressType',
|
||||
'c_ip' => 'cdpCacheAddress',
|
||||
'c_ver' => 'cdpCacheVersion',
|
||||
'c_id' => 'cdpCacheDeviceId',
|
||||
'c_port' => 'cdpCacheDevicePort',
|
||||
'c_platform' => 'cdpCachePlatform',
|
||||
'c_capabilities' => 'cdpCacheCapabilities',
|
||||
'c_domain' => 'cdpCacheVTPMgmtDomain',
|
||||
'c_vlan' => 'cdpCacheNativeVLAN',
|
||||
'c_duplex' => 'cdpCacheDuplex'
|
||||
);
|
||||
%FUNCS = (
|
||||
'cdp_index' => 'cdpCacheIfIndex',
|
||||
'cdp_proto' => 'cdpCacheAddressType',
|
||||
'cdp_addr' => 'cdpCacheAddress',
|
||||
'cdp_ver' => 'cdpCacheVersion',
|
||||
'cdp_id' => 'cdpCacheDeviceId',
|
||||
'cdp_port' => 'cdpCacheDevicePort',
|
||||
'cdp_platform' => 'cdpCachePlatform',
|
||||
'cdp_capabilities' => 'cdpCacheCapabilities',
|
||||
'cdp_domain' => 'cdpCacheVTPMgmtDomain',
|
||||
'cdp_vlan' => 'cdpCacheNativeVLAN',
|
||||
'cdp_duplex' => 'cdpCacheDuplex',
|
||||
'cdp_power' => 'cdpCachePowerConsumption',
|
||||
'cdp_pri_mgmt_type'=> 'cdpCachePrimaryMgmtAddrType',
|
||||
'cdp_pri_mgmt_addr'=> 'cdpCachePrimaryMgmtAddr',
|
||||
'cdp_sec_mgmt_type'=> 'cdpCacheSecondaryMgmtAddrType',
|
||||
'cdp_sec_mgmt_addr'=> 'cdpCacheSecondaryMgmtAddr',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'c_capabilities' => \&munge_caps,
|
||||
'c_ip' => \&SNMP::Info::munge_ip
|
||||
);
|
||||
'cdp_capabilities' => \&SNMP::Info::munge_caps,
|
||||
'cdp_platform' => \&SNMP::Info::munge_null,
|
||||
'cdp_domain' => \&SNMP::Info::munge_null,
|
||||
'cdp_port' => \&SNMP::Info::munge_null,
|
||||
'cdp_id' => \&SNMP::Info::munge_null,
|
||||
'cdp_ver' => \&SNMP::Info::munge_null,
|
||||
'cdp_ip' => \&SNMP::Info::munge_ip,
|
||||
'cdp_power' => \&munge_power,
|
||||
|
||||
);
|
||||
|
||||
sub munge_caps {
|
||||
my $caps = shift;
|
||||
return undef unless defined $caps;
|
||||
|
||||
my $bits = substr(unpack("B*",$caps),-7);
|
||||
return $bits;
|
||||
|
||||
|
||||
sub munge_power {
|
||||
my $power = shift;
|
||||
my $decimal = substr( $power, -3 );
|
||||
$power =~ s/$decimal$/\.$decimal/;
|
||||
return $power;
|
||||
}
|
||||
|
||||
sub hasCDP {
|
||||
my $cdp = shift;
|
||||
|
||||
my $ver = $cdp->{_version};
|
||||
|
||||
|
||||
# SNMP v1 clients dont have the globals
|
||||
if (defined $ver and $ver == 1){
|
||||
my $c_ip = $cdp->c_ip();
|
||||
if ( defined $ver and $ver == 1 ) {
|
||||
my $cdp_ip = $cdp->cdp_ip();
|
||||
|
||||
# See if anything in cdp cache, if so we have cdp
|
||||
return 1 if (defined $c_ip and scalar(keys %$c_ip)) ;
|
||||
return undef;
|
||||
return 1 if ( defined $cdp_ip and scalar( keys %$cdp_ip ) );
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
return $cdp->cdp_run();
|
||||
}
|
||||
|
||||
sub c_if {
|
||||
my $cdp = shift;
|
||||
sub cdp_if {
|
||||
my $cdp = shift;
|
||||
|
||||
# See if by some miracle Cisco implemented the cdpCacheIfIndex entry
|
||||
my $c_index = $cdp->c_index();
|
||||
return $c_index if defined $c_index;
|
||||
my $cdp_index = $cdp->cdp_index();
|
||||
return $cdp_index if defined $cdp_index;
|
||||
|
||||
# Nope, didn't think so. Now we fake it.
|
||||
my $c_ip = $cdp->c_ip();
|
||||
unless (defined $c_ip){
|
||||
$cdp->{error} = "SNMP::Info::CDP::c_if() - Device doesn't have c_ip() data. Can't fake c_index()";
|
||||
$DEBUG and carp($cdp->error(1));
|
||||
return undef;
|
||||
my $cdp_ip = $cdp->cdp_ip();
|
||||
unless ( defined $cdp_ip ) {
|
||||
$cdp->error_throw(
|
||||
"SNMP::Info::CDP:cdp_if() - Device doesn't have cdp_ip() data. Can't fake cdp_index()"
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
my %c_if;
|
||||
foreach my $key (keys %$c_ip){
|
||||
next unless defined $key;
|
||||
my $iid = $key;
|
||||
# Truncate .1 from cdp cache entry
|
||||
$iid =~ s/\.\d+$//;
|
||||
$c_if{$key} = $iid;
|
||||
my %cdp_if;
|
||||
foreach my $key ( keys %$cdp_ip ) {
|
||||
next unless defined $key;
|
||||
my $iid = $key;
|
||||
|
||||
# Truncate .1 from cdp cache entry
|
||||
$iid =~ s/\.\d+$//;
|
||||
$cdp_if{$key} = $iid;
|
||||
}
|
||||
|
||||
return \%c_if;
|
||||
return \%cdp_if;
|
||||
}
|
||||
|
||||
sub cdp_ip {
|
||||
my $cdp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $cdp_addr = $cdp->cdp_addr($partial) || {};
|
||||
my $cdp_proto = $cdp->cdp_proto($partial) || {};
|
||||
|
||||
my %cdp_ip;
|
||||
foreach my $key ( keys %$cdp_addr ) {
|
||||
my $addr = $cdp_addr->{$key};
|
||||
my $proto = $cdp_proto->{$key};
|
||||
next unless defined $addr;
|
||||
next if ( defined $proto and $proto ne 'ip' );
|
||||
|
||||
my $ip = join( '.', unpack( 'C4', $addr ) );
|
||||
$cdp_ip{$key} = $ip;
|
||||
}
|
||||
return \%cdp_ip;
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -136,11 +165,11 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CDP - Perl5 Interface to Cisco Discovery Protocol (CDP) using SNMP
|
||||
SNMP::Info::CDP - SNMP Interface to Cisco Discovery Protocol (CDP) using SNMP
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -159,15 +188,15 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
# Print out a map of device ports with CDP neighbors:
|
||||
my $interfaces = $cdp->interfaces();
|
||||
my $c_if = $cdp->c_if();
|
||||
my $c_ip = $cdp->c_ip();
|
||||
my $c_port = $cdp->c_port();
|
||||
my $cdp_if = $cdp->cdp_if();
|
||||
my $cdp_ip = $cdp->cdp_ip();
|
||||
my $cdp_port = $cdp->cdp_port();
|
||||
|
||||
foreach my $cdp_key (keys %$c_ip){
|
||||
my $iid = $c_if->{$cdp_key};
|
||||
foreach my $cdp_key (keys %$cdp_ip){
|
||||
my $iid = $cdp_if->{$cdp_key};
|
||||
my $port = $interfaces->{$iid};
|
||||
my $neighbor = $c_ip->{$cdp_key};
|
||||
my $neighbor_port = $c_port->{$cdp_key};
|
||||
my $neighbor = $cdp_ip->{$cdp_key};
|
||||
my $neighbor_port = $cdp_port->{$cdp_key};
|
||||
print "Port : $port connected to $neighbor / $neighbor_port\n";
|
||||
}
|
||||
|
||||
@@ -176,10 +205,12 @@ Max Baker (C<max@warped.org>)
|
||||
SNMP::Info::CDP is a subclass of SNMP::Info that provides an object oriented
|
||||
interface to CDP information through SNMP.
|
||||
|
||||
CDP is a Layer 2 protocol that supplies topology information of devices that also speak CDP,
|
||||
mostly switches and routers. CDP is implemented in Cisco and some HP devices.
|
||||
CDP is a Layer 2 protocol that supplies topology information of devices that
|
||||
also speak CDP, mostly switches and routers. CDP is implemented in Cisco and
|
||||
some HP devices.
|
||||
|
||||
Create or use a device subclass that inherits this class. Do not use directly.
|
||||
Create or use a device subclass that inherits this class. Do not use
|
||||
directly.
|
||||
|
||||
Each device implements a subset of the global and cache entries.
|
||||
Check the return value to see if that data is held by the device.
|
||||
@@ -192,7 +223,7 @@ None.
|
||||
|
||||
=over
|
||||
|
||||
=item CISCO-CDP-MIB
|
||||
=item F<CISCO-CDP-MIB>
|
||||
|
||||
=back
|
||||
|
||||
@@ -212,30 +243,31 @@ Accounts for SNMP version 1 devices which may have CDP but not cdp_run()
|
||||
|
||||
=item $cdp->cdp_run()
|
||||
|
||||
Is CDP enabled on this device? Note that a lot of Cisco devices that implement
|
||||
CDP don't implement this value. @#%$!
|
||||
Is CDP enabled on this device? Note that a lot of Cisco devices that
|
||||
implement CDP don't implement this value. @#%$!
|
||||
|
||||
(B<cdpGlobalRun>)
|
||||
(C<cdpGlobalRun>)
|
||||
|
||||
=item $cdp->cdp_interval()
|
||||
|
||||
Interval in seconds at which CDP messages are generated.
|
||||
|
||||
(B<cdpGlobalMessageInterval>)
|
||||
(C<cdpGlobalMessageInterval>)
|
||||
|
||||
=item $cdp->cdp_holdtime()
|
||||
|
||||
Time in seconds that CDP messages are kept.
|
||||
|
||||
(B<cdpGlobalHoldTime>)
|
||||
(C<cdpGlobalHoldTime>)
|
||||
|
||||
=item $cdp->cdp_id()
|
||||
=item $cdp->cdp_gid()
|
||||
|
||||
Returns CDP device ID.
|
||||
|
||||
This is the device id broadcast via CDP to other devices, and is what is retrieved from remote devices with $cdp->id().
|
||||
This is the device id broadcast via CDP to other devices, and is what is
|
||||
retrieved from remote devices with $cdp->id().
|
||||
|
||||
(B<cdpGlobalDeviceId>)
|
||||
(C<cdpGlobalDeviceId>)
|
||||
|
||||
=back
|
||||
|
||||
@@ -248,7 +280,7 @@ to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $cdp->c_capabilities()
|
||||
=item $cdp->cdp_capabilities()
|
||||
|
||||
Returns Device Functional Capabilities. Results are munged into an ascii
|
||||
binary string, 7 digits long, MSB. Each digit represents a bit from the
|
||||
@@ -262,115 +294,148 @@ From L<http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm#1884
|
||||
|
||||
=item (0x40) - Provides level 1 functionality.
|
||||
|
||||
=item (0x20) - The bridge or switch does not forward IGMP Report packets on nonrouter ports.
|
||||
=item (0x20) - The bridge or switch does not forward IGMP Report packets on
|
||||
non router ports.
|
||||
|
||||
=item (0x10) - Sends and receives packets for at least one network layer protocol. If the device is routing the protocol, this bit should not be set.
|
||||
=item (0x10) - Sends and receives packets for at least one network layer
|
||||
protocol. If the device is routing the protocol, this bit should not be set.
|
||||
|
||||
=item (0x08) - Performs level 2 switching. The difference between this bit and bit 0x02 is that a switch does not run the Spanning-Tree Protocol. This device is assumed to be deployed in a physical loop-free topology.
|
||||
=item (0x08) - Performs level 2 switching. The difference between this bit
|
||||
and bit 0x02 is that a switch does not run the Spanning-Tree Protocol. This
|
||||
device is assumed to be deployed in a physical loop-free topology.
|
||||
|
||||
=item (0x04) - Performs level 2 source-route bridging. A source-route bridge would set both this bit and bit 0x02.
|
||||
=item (0x04) - Performs level 2 source-route bridging. A source-route bridge
|
||||
would set both this bit and bit 0x02.
|
||||
|
||||
=item (0x02) - Performs level 2 transparent bridging.
|
||||
|
||||
=item (0x01) - Performs level 3 routing for at least one network layer protocol.
|
||||
=item (0x01) - Performs level 3 routing for at least one network layer
|
||||
protocol.
|
||||
|
||||
=back
|
||||
|
||||
Thanks to Martin Lorensen C<martin -at- lorensen.dk> for a pointer to this information.
|
||||
Thanks to Martin Lorensen C<martin -at- lorensen.dk> for a pointer to this
|
||||
information.
|
||||
|
||||
(B<cdpCacheCapabilities>)
|
||||
(C<cdpCacheCapabilities>)
|
||||
|
||||
=item $cdp->c_domain()
|
||||
=item $cdp->cdp_domain()
|
||||
|
||||
Returns remote VTP Management Domain as defined in CISCO-VTP-MIB::managementDomainName
|
||||
Returns remote VTP Management Domain as defined in
|
||||
C<CISCO-VTP-MIB::managementDomainName>
|
||||
|
||||
(B<cdpCacheVTPMgmtDomain>)
|
||||
(C<cdpCacheVTPMgmtDomain>)
|
||||
|
||||
=item $cdp->c_duplex()
|
||||
=item $cdp->cdp_duplex()
|
||||
|
||||
Returns the port duplex status from remote devices.
|
||||
|
||||
(B<cdpCacheDuplex>)
|
||||
(C<cdpCacheDuplex>)
|
||||
|
||||
=item $cdp->c_id()
|
||||
=item $cdp->cdp_id()
|
||||
|
||||
Returns remote device id string
|
||||
|
||||
(B<cdpCacheDeviceId>)
|
||||
(C<cdpCacheDeviceId>)
|
||||
|
||||
=item $cdp->c_if()
|
||||
=item $cdp->cdp_if()
|
||||
|
||||
Returns the mapping to the SNMP Interface Table.
|
||||
|
||||
Note that a lot devices don't implement $cdp->c_index(), So if it isn't around,
|
||||
we fake it.
|
||||
Note that a lot devices don't implement $cdp->cdp_index(), So if it isn't
|
||||
around, we fake it.
|
||||
|
||||
In order to map the cdp table entry back to the interfaces() entry, we truncate the last number
|
||||
off of it :
|
||||
In order to map the cdp table entry back to the interfaces() entry, we
|
||||
truncate the last number off of it :
|
||||
|
||||
# it exists, yay.
|
||||
my $c_index = $device->c_index();
|
||||
return $c_index if defined $c_index;
|
||||
my $cdp_index = $device->cdp_index();
|
||||
return $cdp_index if defined $cdp_index;
|
||||
|
||||
# if not, let's fake it
|
||||
my $c_ip = $device->c_ip();
|
||||
my $cdp_ip = $device->cdp_ip();
|
||||
|
||||
my %c_if
|
||||
foreach my $key (keys %$c_ip){
|
||||
my %cdp_if
|
||||
foreach my $key (keys %$cdp_ip){
|
||||
$iid = $key;
|
||||
## Truncate off .1 from cdp response
|
||||
$iid =~ s/\.\d+$//;
|
||||
$c_if{$key} = $iid;
|
||||
$cdp_if{$key} = $iid;
|
||||
}
|
||||
|
||||
return \%c_if;
|
||||
return \%cdp_if;
|
||||
|
||||
|
||||
=item $cdp->c_index()
|
||||
=item $cdp->cdp_index()
|
||||
|
||||
Returns the mapping to the SNMP2 Interface table for CDP Cache Entries.
|
||||
|
||||
Most devices don't implement this, so you probably want to use $cdp->c_if() instead.
|
||||
Most devices don't implement this, so you probably want to use $cdp->cdp_if()
|
||||
instead.
|
||||
|
||||
See c_if() entry.
|
||||
See cdp_if() entry.
|
||||
|
||||
(B<cdpCacheIfIndex>)
|
||||
(C<cdpCacheIfIndex>)
|
||||
|
||||
=item $cdp->c_ip()
|
||||
=item $cdp->cdp_ip()
|
||||
|
||||
Returns remote IP address
|
||||
If $cdp->cdp_proto() is supported, returns remote IPV4 address only. Otherwise
|
||||
it will return all addresses.
|
||||
|
||||
(B<cdpCacheAddress>)
|
||||
(C<cdpCacheAddress>)
|
||||
|
||||
=item $cdp->c_platform()
|
||||
=item $cdp->cdp_addr()
|
||||
|
||||
Returns remote address
|
||||
|
||||
(C<cdpCacheAddress>)
|
||||
|
||||
=item $cdp->cdp_platform()
|
||||
|
||||
Returns remote platform id
|
||||
|
||||
(B<cdpCachePlatform>)
|
||||
(C<cdpCachePlatform>)
|
||||
|
||||
=item $cdp->c_port()
|
||||
=item $cdp->cdp_port()
|
||||
|
||||
Returns remote port ID
|
||||
|
||||
(B<cdpDevicePort>)
|
||||
(C<cdpDevicePort>)
|
||||
|
||||
=item $cdp->c_proto()
|
||||
=item $cdp->cdp_proto()
|
||||
|
||||
Returns remote address type received. Usually IP.
|
||||
|
||||
(B<cdpCacheAddressType>)
|
||||
(C<cdpCacheAddressType>)
|
||||
|
||||
=item $cdp->c_ver()
|
||||
=item $cdp->cdp_ver()
|
||||
|
||||
Returns remote hardware version
|
||||
|
||||
(B<cdpCacheVersion>)
|
||||
(C<cdpCacheVersion>)
|
||||
|
||||
=item $cdp->c_vlan()
|
||||
=item $cdp->cdp_vlan()
|
||||
|
||||
Returns the remote interface native VLAN.
|
||||
|
||||
(B<cdpCacheNativeVLAN>)
|
||||
(C<cdpCacheNativeVLAN>)
|
||||
|
||||
=item $cdp->cdp_power()
|
||||
|
||||
Returns the amount of power consumed by remote device in milliwatts munged
|
||||
for decimal placement.
|
||||
|
||||
(C<cdpCachePowerConsumption>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 Data Munging Callback Subroutines
|
||||
|
||||
=over
|
||||
|
||||
=item $cdp->munge_power()
|
||||
|
||||
Inserts a decimal at the proper location.
|
||||
|
||||
=back
|
||||
|
||||
|
||||
473
Info/CiscoConfig.pm
Normal file
473
Info/CiscoConfig.pm
Normal file
@@ -0,0 +1,473 @@
|
||||
# SNMP::Info::CiscoConfig
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoConfig;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::CiscoConfig::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoConfig::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%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.00_003';
|
||||
|
||||
%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.00_003';
|
||||
|
||||
%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.00_003';
|
||||
|
||||
%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.00_003';
|
||||
|
||||
%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.00_003';
|
||||
|
||||
%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
|
||||
637
Info/CiscoStack.pm
Normal file
637
Info/CiscoStack.pm
Normal file
@@ -0,0 +1,637 @@
|
||||
# SNMP::Info::CiscoStack
|
||||
# $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::CiscoStack;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::CiscoStack::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoStack::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = ( 'CISCO-STACK-MIB' => 'ciscoStackMIB', );
|
||||
|
||||
%GLOBALS = (
|
||||
'sysip' => 'sysIpAddr',
|
||||
'netmask' => 'sysNetMask',
|
||||
'broadcast' => 'sysBroadcast',
|
||||
'serial1' => 'chassisSerialNumber',
|
||||
'serial2' => 'chassisSerialNumberString',
|
||||
'model1' => 'chassisModel',
|
||||
'ps1_type' => 'chassisPs1Type',
|
||||
'ps1_status' => 'chassisPs1Status',
|
||||
'ps2_type' => 'chassisPs2Type',
|
||||
'ps2_status' => 'chassisPs2Status',
|
||||
'slots' => 'chassisNumSlots',
|
||||
'fan' => 'chassisFanStatus',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# CISCO-STACK-MIB::moduleEntry
|
||||
# These are blades in a catalyst device
|
||||
'm_type' => 'moduleType',
|
||||
'm_model' => 'moduleModel',
|
||||
'm_serial' => 'moduleSerialNumber',
|
||||
'm_serial_string' => 'moduleSerialNumberString',
|
||||
'm_status' => 'moduleStatus',
|
||||
'm_name' => 'moduleName',
|
||||
'm_ports' => 'moduleNumPorts',
|
||||
'm_ports_status' => 'modulePortStatus',
|
||||
'm_hwver' => 'moduleHwVersion',
|
||||
'm_fwver' => 'moduleFwVersion',
|
||||
'm_swver' => 'moduleSwVersion',
|
||||
|
||||
# Router Blades :
|
||||
'm_ip' => 'moduleIPAddress',
|
||||
'm_sub1' => 'moduleSubType',
|
||||
'm_sub2' => 'moduleSubType2',
|
||||
|
||||
# CISCO-STACK-MIB::portEntry
|
||||
'p_name' => 'portName',
|
||||
'p_type' => 'portType',
|
||||
'p_status' => 'portOperStatus',
|
||||
'p_status2' => 'portAdditionalStatus',
|
||||
'p_speed' => 'portAdminSpeed',
|
||||
'p_duplex' => 'portDuplex',
|
||||
'p_port' => 'portIfIndex',
|
||||
'p_rx_flow_control' => 'portOperRxFlowControl',
|
||||
'p_tx_flow_control' => 'portOperTxFlowControl',
|
||||
'p_rx_flow_control_admin' => 'portAdminRxFlowControl',
|
||||
'p_tx_flow_control_admin' => 'portAdminTxFlowControl',
|
||||
'p_oidx' => 'portCrossIndex',
|
||||
|
||||
# CISCO-STACK-MIB::PortCpbEntry
|
||||
'p_speed_admin' => 'portCpbSpeed',
|
||||
'p_duplex_admin' => 'portCpbDuplex',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'm_ports_status' => \&munge_port_status,
|
||||
'p_duplex_admin' => \&SNMP::Info::munge_bits,
|
||||
);
|
||||
|
||||
%PORTSTAT = (
|
||||
1 => 'other',
|
||||
2 => 'ok',
|
||||
3 => 'minorFault',
|
||||
4 => 'majorFault'
|
||||
);
|
||||
|
||||
# Changes binary byte describing each port into ascii, and returns
|
||||
# an ascii list separated by spaces.
|
||||
sub munge_port_status {
|
||||
my $status = shift;
|
||||
my @vals = map( $PORTSTAT{$_}, unpack( 'C*', $status ) );
|
||||
return join( ' ', @vals );
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $stack = shift;
|
||||
my $serial1 = $stack->serial1();
|
||||
my $serial2 = $stack->serial2();
|
||||
|
||||
return $serial1 if defined $serial1;
|
||||
return $serial2 if defined $serial2;
|
||||
return;
|
||||
}
|
||||
|
||||
# Rules for older CatOS devices using CiscoStack
|
||||
#
|
||||
# You can configure Ethernet and Fast Ethernet interfaces to either full
|
||||
# duplex or half duplex.
|
||||
#
|
||||
# You cannot configure the duplex mode on Gigabit Ethernet ports (they are
|
||||
# always in full-duplex mode).
|
||||
#
|
||||
# If you set the port speed to auto, duplex mode is automatically set to auto.
|
||||
#
|
||||
# For operational duplex if portCpbDuplex is all zeros the port is a gigabit
|
||||
# port and duplex is always full. If the port is not operational and auto
|
||||
# return value will be undef since we don't know the operational status.
|
||||
#
|
||||
# Newer devices use ETHERLIKE-MIB to report operational duplex, this will be
|
||||
# checked in the device class.
|
||||
|
||||
sub i_duplex {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $p_port = $stack->p_port() || {};
|
||||
my $p_duplex = $stack->p_duplex() || {};
|
||||
my $p_duplex_cap = $stack->p_duplex_admin() || {};
|
||||
|
||||
my $i_duplex = {};
|
||||
foreach my $port ( keys %$p_duplex ) {
|
||||
my $iid = $p_port->{$port};
|
||||
next unless defined $iid;
|
||||
next if ( defined $partial and $iid !~ /^$partial$/ );
|
||||
|
||||
# Test for gigabit
|
||||
if ( defined $p_duplex_cap->{$port} and $p_duplex_cap->{$port} == 0 ) {
|
||||
$i_duplex->{$iid} = 'full';
|
||||
}
|
||||
|
||||
# Auto is not a valid operational state
|
||||
elsif ( $p_duplex->{$port} eq 'auto' ) {
|
||||
next;
|
||||
}
|
||||
else {
|
||||
$i_duplex->{$iid} = $p_duplex->{$port};
|
||||
}
|
||||
}
|
||||
return $i_duplex;
|
||||
}
|
||||
|
||||
# For administrative duplex if portCpbDuplex is all zeros the port is a gigabit
|
||||
# port and duplex is always full. If portAdminSpeed is set to auto then the
|
||||
# duplex will be auto, otherwise use portDuplex.
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $p_port = $stack->p_port() || {};
|
||||
my $p_duplex = $stack->p_duplex() || {};
|
||||
my $p_duplex_cap = $stack->p_duplex_admin() || {};
|
||||
my $p_speed = $stack->p_speed() || {};
|
||||
|
||||
my $i_duplex_admin = {};
|
||||
foreach my $port ( keys %$p_duplex ) {
|
||||
my $iid = $p_port->{$port};
|
||||
next unless defined $iid;
|
||||
next if ( defined $partial and $iid !~ /^$partial$/ );
|
||||
|
||||
# Test for gigabit
|
||||
if ( defined $p_duplex_cap->{$port} and $p_duplex_cap->{$port} == 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;
|
||||
}
|
||||
|
||||
my $p_port = $stack->p_port() || {};
|
||||
my %reverse_p_port = reverse %$p_port;
|
||||
|
||||
$duplex = lc($duplex);
|
||||
|
||||
return 0 unless defined $duplexes{$duplex};
|
||||
|
||||
$iid = $reverse_p_port{$iid};
|
||||
|
||||
return $stack->set_p_duplex( $duplexes{$duplex}, $iid );
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoStack - SNMP Interface to data from F<CISCO-STACK-MIB> and
|
||||
F<CISCO-PORT-SECURITY-MIB>
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $ciscostats = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $ciscostats->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::CiscoStack is a subclass of SNMP::Info that provides
|
||||
an interface to the C<CISCO-STACK-MIB>. This MIB is used across
|
||||
the Catalyst family under CatOS and IOS.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
none.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-STACK-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
=over
|
||||
|
||||
=item $stack->broadcast()
|
||||
|
||||
(C<sysBroadcast>)
|
||||
|
||||
=item $stack->fan()
|
||||
|
||||
(C<chassisFanStatus>)
|
||||
|
||||
=item $stack->model()
|
||||
|
||||
(C<chassisModel>)
|
||||
|
||||
=item $stack->netmask()
|
||||
|
||||
(C<sysNetMask>)
|
||||
|
||||
=item $stack->ps1_type()
|
||||
|
||||
(C<chassisPs1Type>)
|
||||
|
||||
=item $stack->ps2_type()
|
||||
|
||||
(C<chassisPs2Type>)
|
||||
|
||||
=item $stack->ps1_status()
|
||||
|
||||
(C<chassisPs1Status>)
|
||||
|
||||
=item $stack->ps2_status()
|
||||
|
||||
(C<chassisPs2Status>)
|
||||
|
||||
=item $stack->serial()
|
||||
|
||||
(C<chassisSerialNumberString>) or (C<chassisSerialNumber>)
|
||||
|
||||
=item $stack->slots()
|
||||
|
||||
(C<chassisNumSlots>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 Interface Tables
|
||||
|
||||
=over
|
||||
|
||||
=item $stack->i_physical()
|
||||
|
||||
Returns a map to IID for ports that are physical ports, not vlans, etc.
|
||||
|
||||
=item $stack->i_type()
|
||||
|
||||
Crosses p_port() with p_type() and returns the results.
|
||||
|
||||
Overrides with C<ifType> if p_type() isn't available.
|
||||
|
||||
=item $stack->i_duplex()
|
||||
|
||||
Returns reference to hash of iid to current link duplex setting.
|
||||
|
||||
First checks for fixed gigabit ports which are always full duplex. Next, if
|
||||
the port is not operational and reported port duplex (C<portDuplex>) is auto
|
||||
then the operational duplex can not be determined. Otherwise it uses the
|
||||
reported port duplex (C<portDuplex>).
|
||||
|
||||
=item $stack->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of iid to administrative duplex setting.
|
||||
|
||||
First checks for fixed gigabit ports which are always full duplex. Next checks
|
||||
the port administrative speed (C<portAdminSpeed>) which if set to
|
||||
autonegotiate then the duplex will also autonegotiate, otherwise it uses the
|
||||
reported port duplex (C<portDuplex>).
|
||||
|
||||
=item $stack->i_speed_admin()
|
||||
|
||||
Returns reference to hash of iid to administrative speed setting.
|
||||
|
||||
C<portAdminSpeed>
|
||||
|
||||
=item $stack->set_i_speed_admin(speed, ifIndex)
|
||||
|
||||
Sets port speed, must be supplied with speed and port C<ifIndex>
|
||||
|
||||
Speed choices are 'auto', '10', '100', '1000'
|
||||
|
||||
Crosses $stack->p_port() with $stack->p_duplex() to
|
||||
utilize port C<ifIndex>.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$stack->interfaces()};
|
||||
$stack->set_i_speed_admin('auto', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't change port speed. ",$stack->error(1);
|
||||
|
||||
=item $stack->set_i_duplex_admin(duplex, ifIndex)
|
||||
|
||||
Sets port duplex, must be supplied with duplex and port C<ifIndex>
|
||||
|
||||
Speed choices are 'auto', 'half', 'full'
|
||||
|
||||
Crosses $stack->p_port() with $stack->p_duplex() to
|
||||
utilize port C<ifIndex>.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$stack->interfaces()};
|
||||
$stack->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't change port duplex. ",$stack->error(1);
|
||||
|
||||
=back
|
||||
|
||||
=head2 Module table
|
||||
|
||||
This table holds configuration information for each of the blades installed in
|
||||
the Catalyst device.
|
||||
|
||||
=over
|
||||
|
||||
=item $stack->m_type()
|
||||
|
||||
(C<moduleType>)
|
||||
|
||||
=item $stack->m_model()
|
||||
|
||||
(C<moduleModel>)
|
||||
|
||||
=item $stack->m_serial()
|
||||
|
||||
(C<moduleSerialNumber>)
|
||||
|
||||
=item $stack->m_status()
|
||||
|
||||
(C<moduleStatus>)
|
||||
|
||||
=item $stack->m_name()
|
||||
|
||||
(C<moduleName>)
|
||||
|
||||
=item $stack->m_ports()
|
||||
|
||||
(C<moduleNumPorts>)
|
||||
|
||||
=item $stack->m_ports_status()
|
||||
|
||||
Returns a list of space separated status strings for the ports.
|
||||
|
||||
To see the status of port 4 :
|
||||
|
||||
@ports_status = split(' ', $stack->m_ports_status() );
|
||||
$port4 = $ports_status[3];
|
||||
|
||||
(C<modulePortStatus>)
|
||||
|
||||
=item $stack->m_ports_hwver()
|
||||
|
||||
(C<moduleHwVersion>)
|
||||
|
||||
=item $stack->m_ports_fwver()
|
||||
|
||||
(C<moduleFwVersion>)
|
||||
|
||||
=item $stack->m_ports_swver()
|
||||
|
||||
(C<moduleSwVersion>)
|
||||
|
||||
=item $stack->m_ports_ip()
|
||||
|
||||
(C<moduleIPAddress>)
|
||||
|
||||
=item $stack->m_ports_sub1()
|
||||
|
||||
(C<moduleSubType>)
|
||||
|
||||
=item $stack->m_ports_sub2()
|
||||
|
||||
(C<moduleSubType2>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Modules - Router Blades
|
||||
|
||||
=over
|
||||
|
||||
=item $stack->m_ip()
|
||||
|
||||
(C<moduleIPAddress>)
|
||||
|
||||
=item $stack->m_sub1()
|
||||
|
||||
(C<moduleSubType>)
|
||||
|
||||
=item $stack->m_sub2()
|
||||
|
||||
(C<moduleSubType2>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Port Entry Table (C<CISCO-STACK-MIB::portTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $stack->p_name()
|
||||
|
||||
(C<portName>)
|
||||
|
||||
=item $stack->p_type()
|
||||
|
||||
(C<portType>)
|
||||
|
||||
=item $stack->p_status()
|
||||
|
||||
(C<portOperStatus>)
|
||||
|
||||
=item $stack->p_status2()
|
||||
|
||||
(C<portAdditionalStatus>)
|
||||
|
||||
=item $stack->p_speed()
|
||||
|
||||
(C<portAdminSpeed>)
|
||||
|
||||
=item $stack->p_duplex()
|
||||
|
||||
(C<portDuplex>)
|
||||
|
||||
=item $stack->p_port()
|
||||
|
||||
(C<portIfIndex>)
|
||||
|
||||
=item $stack->p_rx_flow_control()
|
||||
|
||||
Can be either C<on> C<off> or C<disagree>
|
||||
|
||||
"Indicates the receive flow control operational status of the port. If the
|
||||
port could not agree with the far end on a link protocol, its operational
|
||||
status will be disagree(3)."
|
||||
|
||||
C<portOperRxFlowControl>
|
||||
|
||||
=item $stack->p_tx_flow_control()
|
||||
|
||||
Can be either C<on> C<off> or C<disagree>
|
||||
|
||||
"Indicates the transmit flow control operational status of the port. If the
|
||||
port could not agree with the far end on a link protocol, its operational
|
||||
status will be disagree(3)."
|
||||
|
||||
C<portOperTxFlowControl>
|
||||
|
||||
=item $stack->p_rx_flow_control_admin()
|
||||
|
||||
Can be either C<on> C<off> or C<desired>
|
||||
|
||||
"Indicates the receive flow control administrative status set on the port. If
|
||||
the status is set to on(1), the port will require the far end to send flow
|
||||
control. If the status is set to off(2), the port will not allow far end to
|
||||
send flow control. If the status is set to desired(3), the port will allow
|
||||
the far end to send the flow control."
|
||||
|
||||
C<portAdminRxFlowControl>
|
||||
|
||||
=item $stack->p_tx_flow_control_admin()
|
||||
|
||||
Can be either C<on> C<off> or C<desired>
|
||||
|
||||
"Indicates the transmit flow control administrative status set on the port.
|
||||
If the status is set to on(1), the port will send flow control to the far end. If
|
||||
the status is set to off(2), the port will not send flow control to the far
|
||||
end. If the status is set to desired(3), the port will send flow control to
|
||||
the far end if the far end supports it."
|
||||
|
||||
C<portAdminTxFlowControl>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Port Capability Table (C<CISCO-STACK-MIB::portCpbTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $stack->p_speed_admin()
|
||||
|
||||
(C<portCpbSpeed>)
|
||||
|
||||
=item $stack->p_duplex_admin()
|
||||
|
||||
(C<portCpbDuplex>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 Data Munging Callback Subroutines
|
||||
|
||||
=over
|
||||
|
||||
=item $stack->munge_port_status()
|
||||
|
||||
Munges binary byte describing each port into ascii, and returns an ascii
|
||||
list separated by spaces.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
@@ -1,106 +1,234 @@
|
||||
# SNMP::Info::CiscoStats
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Changes since Version 0.7 Copyright (c) 2008-2009 Max Baker and SNMP::Info Developers
|
||||
# All rights reserved.
|
||||
#
|
||||
# Copyright (c) 2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoStats;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
|
||||
@SNMP::Info::CiscoStats::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoStats::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoStats::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$INIT = 0;
|
||||
%MIBS = (
|
||||
'RFC1213-MIB' => 'sysDescr',
|
||||
'CISCO-PROCESS-MIB' => 'cpmCPUTotal5sec',
|
||||
'CISCO-MEMORY-POOL-MIB' => 'ciscoMemoryPoolUsed'
|
||||
);
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
'SNMPv2-MIB' => 'sysDescr',
|
||||
'CISCO-PROCESS-MIB' => 'cpmCPUTotal5sec',
|
||||
'CISCO-MEMORY-POOL-MIB' => 'ciscoMemoryPoolUsed',
|
||||
'OLD-CISCO-SYSTEM-MIB' => 'writeMem',
|
||||
'CISCO-PRODUCTS-MIB' => 'sysName',
|
||||
'ENTITY-MIB' => 'entPhysicalSoftwareRev',
|
||||
'CISCO-IMAGE-MIB' => 'ciscoImageString',
|
||||
|
||||
# some older catalysts live here
|
||||
'CISCO-STACK-MIB' => 'wsc1900sysID',
|
||||
'CISCO-ENTITY-VENDORTYPE-OID-MIB' => 'cevChassis',
|
||||
'CISCO-FLASH-MIB' => 'ciscoFlashDeviceSize',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
'description' => 'sysDescr',
|
||||
# We will use the numeric OID's so that we don't require people
|
||||
# to install v1 MIBs, which can conflict.
|
||||
# OLD-CISCO-CPU-MIB:avgBusyPer
|
||||
'ios_cpu' => '1.3.6.1.4.1.9.2.1.56.0',
|
||||
'ios_cpu_1min' => '1.3.6.1.4.1.9.2.1.57.0',
|
||||
'ios_cpu_5min' => '1.3.6.1.4.1.9.2.1.58.0',
|
||||
# CISCO-PROCESS-MIB
|
||||
'cat_cpu' => 'cpmCPUTotal5sec.9',
|
||||
'cat_cpu_1min' => 'cpmCPUTotal1min.9',
|
||||
'cat_cpu_5min' => 'cpmCPUTotal5min.9',
|
||||
# CISCO-MEMORY-POOL-MIB
|
||||
'mem_free' => 'ciscoMemoryPoolFree.1',
|
||||
'mem_used' => 'ciscoMemoryPoolUsed.1',
|
||||
);
|
||||
'description' => 'sysDescr',
|
||||
'ent_physical_software_rev' => 'entPhysicalSoftwareRev.1',
|
||||
|
||||
%FUNCS = (
|
||||
);
|
||||
# We will use the numeric OID's so that we don't require people
|
||||
# to install v1 MIBs, which can conflict.
|
||||
# OLD-CISCO-CPU-MIB:avgBusyPer
|
||||
'ios_cpu' => '1.3.6.1.4.1.9.2.1.56.0',
|
||||
'ios_cpu_1min' => '1.3.6.1.4.1.9.2.1.57.0',
|
||||
'ios_cpu_5min' => '1.3.6.1.4.1.9.2.1.58.0',
|
||||
|
||||
%MUNGE = (
|
||||
);
|
||||
# CISCO-PROCESS-MIB
|
||||
'cat_cpu' => 'cpmCPUTotal5sec.9',
|
||||
'cat_cpu_1min' => 'cpmCPUTotal1min.9',
|
||||
'cat_cpu_5min' => 'cpmCPUTotal5min.9',
|
||||
|
||||
# OLD-CISCO-SYSTEM-MIB
|
||||
'write_mem' => 'writeMem',
|
||||
'rom_id' => 'romId',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolTable
|
||||
'cisco_mem_free' => 'ciscoMemoryPoolFree',
|
||||
'cisco_mem_used' => 'ciscoMemoryPoolUsed',
|
||||
|
||||
# CISCO-FLASH-MIB::ciscoFlashDeviceTable
|
||||
'cisco_flash_size' => 'ciscoFlashDeviceSize',
|
||||
);
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub os {
|
||||
my $l2 = shift;
|
||||
my $descr = $l2->description();
|
||||
my $descr = $l2->description() || '';
|
||||
|
||||
return 'catalyst' if ($descr =~ /catalyst/i);
|
||||
return 'ios' if ($descr =~ /IOS/);
|
||||
return undef;
|
||||
# order here matters - there are Catalysts that run IOS and have catalyst
|
||||
# in their description field, as well as Catalysts that run IOS-XE.
|
||||
return 'ios-xe' if ( $descr =~ /IOS-XE/ );
|
||||
return 'ios' if ( $descr =~ /IOS/ );
|
||||
return 'catalyst' if ( $descr =~ /catalyst/i );
|
||||
return 'css' if ( $descr =~ /Content Switch SW/ );
|
||||
return 'css-sca' if ( $descr =~ /Cisco Systems Inc CSS-SCA-/ );
|
||||
return 'pix' if ( $descr =~ /Cisco PIX Security Appliance/ );
|
||||
return 'asa' if ( $descr =~ /Cisco Adaptive Security Appliance/ );
|
||||
return 'san-os' if ( $descr =~ /Cisco SAN-OS/ );
|
||||
|
||||
if ( $descr =~ /Application Control Engine Service Module/ ) {
|
||||
# Only the admin context implements the entity MIB
|
||||
return 'ace-admin' if defined $l2->ent_physical_software_rev();
|
||||
return 'ace-context';
|
||||
}
|
||||
|
||||
# Pre-version 3 FWSMs
|
||||
return 'fwsm' if ( $descr =~ /Cisco Secure FWSM Firewall/ );
|
||||
|
||||
# Version 3+ FWSMs (currently untested against version 4)
|
||||
if ( $descr =~ /Firewall Services Module/ ) {
|
||||
|
||||
my $model = $l2->model();
|
||||
|
||||
if ( defined $model && $model eq "WsSvcFwm1sc" ) {
|
||||
# Only the admin context implements the entity MIB
|
||||
return 'fwsm-admin' if defined $l2->ent_physical_software_rev();
|
||||
return 'fwsm-context';
|
||||
}
|
||||
|
||||
# Non context mode FWSM
|
||||
return 'fwsm';
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $l2 = shift;
|
||||
my $os = $l2->os();
|
||||
my $descr = $l2->description();
|
||||
|
||||
|
||||
# Older Catalysts
|
||||
if ($os eq 'catalyst' and $descr =~ m/V(\d{1}\.\d{2}\.\d{2})/){
|
||||
if ( defined $os
|
||||
and $os eq 'catalyst'
|
||||
and defined $descr
|
||||
and $descr =~ m/V(\d{1}\.\d{2}\.\d{2})/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
# Newer Catalysts and IOS devices
|
||||
if ($descr =~ m/Version (\d+\.\d+\([^)]+\)[^,\s]*)(,|\s)+/ ){
|
||||
if ( defined $os
|
||||
and $os eq 'css'
|
||||
and defined $descr
|
||||
and $descr =~ m/Content Switch SW Version ([0-9\.\(\)]+) with SNMPv1\/v2c Agent/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os eq 'css-sca'
|
||||
and defined $descr
|
||||
and $descr =~ m/Cisco Systems Inc CSS-SCA-2FE-K9, ([0-9\.\(\)]+) Release / )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os eq 'pix'
|
||||
and defined $descr
|
||||
and $descr =~ m/Cisco PIX Security Appliance Version ([0-9\.\(\)]+)/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os eq 'asa'
|
||||
and defined $descr
|
||||
and $descr =~ m/Cisco Adaptive Security Appliance Version ([0-9\.\(\)]+)/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os =~ /^ace/ )
|
||||
{
|
||||
return $l2->ent_physical_software_rev();
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os =~ /^fwsm/
|
||||
and defined $descr
|
||||
and $descr =~ m/Version (\d+\.\d+(\(\d+\)){0,1})/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
|
||||
# Newer Catalysts and IOS devices
|
||||
if ( defined $descr
|
||||
and $descr =~ m/Version (\d+\.\d+\([^)]+\)[^,\s]*)(,|\s)+/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
# Generic fallback: try to determine running image from CISCO-IMAGE-MIB
|
||||
my $image_info = $l2->ciscoImageString() || {};
|
||||
foreach my $row (keys %$image_info) {
|
||||
my $info_string = $image_info->{$row};
|
||||
if ($info_string =~ /CW_VERSION\$([^\$]+)\$/) {
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub os_bin {
|
||||
my $self = shift;
|
||||
my $rom_id = $self->rom_id();
|
||||
if ($rom_id =~ m/Version ([^,]+),/) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub cpu {
|
||||
my $self = shift;
|
||||
my $self = shift;
|
||||
my $ios_cpu = $self->ios_cpu();
|
||||
return $ios_cpu if defined $ios_cpu;
|
||||
my $cat_cpu = $self->cat_cpu();
|
||||
@@ -108,7 +236,7 @@ sub cpu {
|
||||
}
|
||||
|
||||
sub cpu_1min {
|
||||
my $self = shift;
|
||||
my $self = shift;
|
||||
my $ios_cpu_1min = $self->ios_cpu_1min();
|
||||
return $ios_cpu_1min if defined $ios_cpu_1min;
|
||||
my $cat_cpu_1min = $self->cat_cpu_1min();
|
||||
@@ -116,19 +244,69 @@ sub cpu_1min {
|
||||
}
|
||||
|
||||
sub cpu_5min {
|
||||
my $self = shift;
|
||||
my $self = shift;
|
||||
my $ios_cpu_5min = $self->ios_cpu_5min();
|
||||
return $ios_cpu_5min if defined $ios_cpu_5min;
|
||||
my $cat_cpu_5min = $self->cat_cpu_5min();
|
||||
return $cat_cpu_5min;
|
||||
}
|
||||
|
||||
sub mem_free {
|
||||
my $self = shift;
|
||||
|
||||
my $mem_free;
|
||||
|
||||
my $cisco_mem_free = $self->cisco_mem_free() || {};
|
||||
|
||||
foreach my $mem_free_val ( values %$cisco_mem_free ) {
|
||||
$mem_free += $mem_free_val;
|
||||
}
|
||||
|
||||
return $mem_free;
|
||||
}
|
||||
|
||||
sub mem_used {
|
||||
my $self = shift;
|
||||
|
||||
my $mem_used;
|
||||
|
||||
my $cisco_mem_used = $self->cisco_mem_used() || {};
|
||||
|
||||
foreach my $mem_used_val ( values %$cisco_mem_used ) {
|
||||
$mem_used += $mem_used_val;
|
||||
}
|
||||
|
||||
return $mem_used;
|
||||
}
|
||||
|
||||
sub mem_total {
|
||||
my $self = shift;
|
||||
my $mem_free = $self->mem_free();
|
||||
my $mem_used = $self->mem_used();
|
||||
return undef unless defined $mem_free and defined $mem_used;
|
||||
return $mem_free + $mem_used;
|
||||
|
||||
my $mem_total;
|
||||
|
||||
my $cisco_mem_free = $self->cisco_mem_free() || {};
|
||||
my $cisco_mem_used = $self->cisco_mem_used() || {};
|
||||
|
||||
foreach my $mem_entry ( keys %$cisco_mem_free ) {
|
||||
my $mem_free = $cisco_mem_free->{$mem_entry} || 0;
|
||||
my $mem_used = $cisco_mem_used->{$mem_entry} || 0;
|
||||
$mem_total += ( $mem_free + $mem_used );
|
||||
}
|
||||
return $mem_total;
|
||||
}
|
||||
|
||||
sub flashmem_total {
|
||||
my $self = shift;
|
||||
|
||||
my $flashmem_total;
|
||||
|
||||
my $flash_sizes = $self->cisco_flash_size;
|
||||
|
||||
foreach my $flash_index ( keys %$flash_sizes ) {
|
||||
$flashmem_total += $flash_sizes->{$flash_index};
|
||||
}
|
||||
|
||||
return $flashmem_total;
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -136,23 +314,24 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoStats - Perl5 Interface to CPU and Memory stats for Cisco Devices
|
||||
SNMP::Info::CiscoStats - Perl5 Interface to CPU and Memory stats for Cisco
|
||||
Devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Eric Miller, Max Baker, Sam Stickland
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $ciscostats = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $ciscostats->class();
|
||||
@@ -160,24 +339,38 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::CiscoStats is a subclass of SNMP::Info that provides cpu, memory, os and
|
||||
version information about Cisco Devices.
|
||||
SNMP::Info::CiscoStats is a subclass of SNMP::Info that provides cpu, memory,
|
||||
os and version information about Cisco Devices.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
none.
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item CISCO-PROCESS-MIB
|
||||
=item F<CISCO-PRODUCTS-MIB>
|
||||
|
||||
=item CISCO-MEMORY-POOL-MIB
|
||||
=item F<CISCO-PROCESS-MIB>
|
||||
|
||||
=item RFC1213-MIB
|
||||
=item F<CISCO-MEMORY-POOL-MIB>
|
||||
|
||||
=item F<SNMPv2-MIB>
|
||||
|
||||
=item F<OLD-CISCO-SYSTEM-MIB>
|
||||
|
||||
=item F<CISCO-STACK-MIB>
|
||||
|
||||
=item F<CISCO-ENTITY-VENDORTYPE-OID-MIB>
|
||||
|
||||
=item F<CISCO-FLASH-MIB>
|
||||
|
||||
=item F<ENTITY-MIB>
|
||||
|
||||
=item F<CISCO-IMAGE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
@@ -203,67 +396,138 @@ Returns ios_cpu_5min() or cat_cpu5min(), whichever is available.
|
||||
|
||||
Returns mem_free() + mem_used()
|
||||
|
||||
=item $ciscostats->vendor()
|
||||
|
||||
'cisco'
|
||||
|
||||
=item $ciscostats->os()
|
||||
|
||||
Trys to parse if device is running IOS or CatOS from description()
|
||||
Tries to parse if device is running 'IOS', 'CatOS', 'IOS-XE' or something else
|
||||
from description()
|
||||
|
||||
Available values:
|
||||
|
||||
'ios' for Cisco IOS
|
||||
'ios-xe' for Cisco IOS XE
|
||||
'pix' for Cisco PIX
|
||||
'asa' for Cisco ASA
|
||||
'fwsm' for Single-mode FWSM
|
||||
'fwsm-admin' for Admin context of multi-context FWSM
|
||||
'fwsm-context' for Standard context of multi-context FWSM
|
||||
'ace-admin' for Admin context of ACE module
|
||||
'ace-context' for Standard context of ACE module (NB: No OS version
|
||||
detection is available, but will be the same as it's
|
||||
'ace admin')
|
||||
'css' for Cisco Content Switch
|
||||
'css-sca' for Cisco Content Switch Secure Content Acceleration
|
||||
'san-os' for Cisco SAN-OS
|
||||
|
||||
=item $ciscostats->os_ver()
|
||||
|
||||
Trys to parse device operating system version from description()
|
||||
Tries to parse device operating system version from description(), falls back
|
||||
to parsing C<CISCO-IMAGE-MIB::ciscoImageString> if needed
|
||||
|
||||
=item $ciscostats->os_bin()
|
||||
|
||||
Tries to parse C<ROMMON> version from rom_id() string
|
||||
|
||||
=item $ciscostats->ios_cpu()
|
||||
|
||||
Current CPU usage in percents of device.
|
||||
Current CPU usage in percent.
|
||||
|
||||
B<1.3.6.1.4.1.9.2.1.56.0> =
|
||||
B<OLD-CISCO-CPU-MIB:avgBusyPer>
|
||||
C<1.3.6.1.4.1.9.2.1.56.0> =
|
||||
C<OLD-CISCO-CPU-MIB:avgBusyPer>
|
||||
|
||||
=item $ciscostats->ios_cpu_1min()
|
||||
|
||||
Average CPU Usage in percents of device over last minute.
|
||||
Average CPU Usage in percent over the last minute.
|
||||
|
||||
B<1.3.6.1.4.1.9.2.1.57.0>
|
||||
C<1.3.6.1.4.1.9.2.1.57.0>
|
||||
|
||||
=item $ciscostats->ios_cpu_5min()
|
||||
|
||||
Average CPU Usage in percents of device over last 5 minutes.
|
||||
Average CPU Usage in percent over the last 5 minutes.
|
||||
|
||||
B<1.3.6.1.4.1.9.2.1.58.0>
|
||||
C<1.3.6.1.4.1.9.2.1.58.0>
|
||||
|
||||
=item $ciscostats->cat_cpu()
|
||||
|
||||
Current CPU usage in percents of device.
|
||||
Current CPU usage in percent.
|
||||
|
||||
B<CISCO-PROCESS-MIB::cpmCPUTotal5sec.9>
|
||||
C<CISCO-PROCESS-MIB::cpmCPUTotal5sec.9>
|
||||
|
||||
=item $ciscostats->cat_cpu_1min()
|
||||
|
||||
Average CPU Usage in percents of device over last minute.
|
||||
Average CPU Usage in percent over the last minute.
|
||||
|
||||
B<CISCO-PROCESS-MIB::cpmCPUTotal1min.9>
|
||||
C<CISCO-PROCESS-MIB::cpmCPUTotal1min.9>
|
||||
|
||||
=item $ciscostats->cat_cpu_5min()
|
||||
|
||||
Average CPU Usage in percents of device over last 5 minutes.
|
||||
Average CPU Usage in percent over the last 5 minutes.
|
||||
|
||||
B<CISCO-PROCESS-MIB::cpmCPUTotal5min.9>
|
||||
C<CISCO-PROCESS-MIB::cpmCPUTotal5min.9>
|
||||
|
||||
=item $ciscostats->mem_free()
|
||||
|
||||
Main DRAM free in device. In bytes.
|
||||
Main DRAM free of the device in bytes.
|
||||
|
||||
B<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolFree.1>
|
||||
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolFree>
|
||||
|
||||
=item $ciscostats->mem_used()
|
||||
|
||||
Main DRAM used in device. In bytes.
|
||||
Main DRAM used of the device in bytes.
|
||||
|
||||
B<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolUsed.1>
|
||||
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolUsed>
|
||||
|
||||
=item $ciscostats->mem_total()
|
||||
|
||||
Main DRAM of the device in bytes.
|
||||
|
||||
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolFree> +
|
||||
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolUsed>
|
||||
|
||||
=item $ciscostats->flashmem_total()
|
||||
|
||||
Flash memory of the device in bytes.
|
||||
|
||||
C<CISCO-FLASH-MIB::ciscoFlashDeviceSize>
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
None.
|
||||
=head2 Cisco Memory Pool Table (C<ciscoMemoryPoolTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $ciscostats->cisco_mem_free()
|
||||
|
||||
The number of bytes from the memory pool that are currently unused on the
|
||||
managed device.
|
||||
|
||||
(C<ciscoMemoryPoolFree>)
|
||||
|
||||
=item $ciscostats->cisco_mem_used()
|
||||
|
||||
The number of bytes from the memory pool that are currently in use by
|
||||
applications on the managed device.
|
||||
|
||||
(C<ciscoMemoryPoolUsed>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Cisco Flash Device Table (C<ciscoFlashDeviceTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $ciscostats->cisco_flash_size()
|
||||
|
||||
Total size of the Flash device. For a removable device, the size will be
|
||||
zero if the device has been removed.
|
||||
|
||||
(C<ciscoFlashDeviceSize>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
355
Info/CiscoStpExtensions.pm
Normal file
355
Info/CiscoStpExtensions.pm
Normal file
@@ -0,0 +1,355 @@
|
||||
# SNMP::Info::CiscoStpExtensions
|
||||
#
|
||||
# Copyright (c)2009 Carlos Vicente
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the author nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoStpExtensions;
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use SNMP::Info::Bridge;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT $INIT/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
@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
|
||||
860
Info/CiscoVTP.pm
Normal file
860
Info/CiscoVTP.pm
Normal file
@@ -0,0 +1,860 @@
|
||||
# SNMP::Info::CiscoVTP
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoVTP;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::CiscoVTP::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoVTP::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
'CISCO-VTP-MIB' => 'vtpVlanName',
|
||||
'CISCO-VLAN-MEMBERSHIP-MIB' => 'vmMembershipEntry',
|
||||
'CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB' => 'cviRoutedVlanIfIndex',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
'vtp_version' => 'vtpVersion',
|
||||
'vtp_maxstore' => 'vtpMaxVlanStorage',
|
||||
'vtp_notify' => 'vtpNotificationsEnabled',
|
||||
'vtp_notify_create' => 'vtpVlanCreatedNotifEnabled',
|
||||
'vtp_notify_delete' => 'vtpVlanDeletedNotifEnabled',
|
||||
'vtp_trunk_set_serial' => 'vlanTrunkPortSetSerialNo',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# CISCO-VTP-MIB::managementDomainTable
|
||||
'vtp_d_index' => 'managementDomainIndex',
|
||||
'vtp_d_name' => 'managementDomainName',
|
||||
'vtp_d_mode' => 'managementDomainLocalMode',
|
||||
'vtp_d_rev' => 'managementDomainConfigRevNumber',
|
||||
'vtp_d_updater' => 'managementDomainLastUpdater',
|
||||
'vtp_d_last' => 'managementDomainLastChange',
|
||||
'vtp_d_status' => 'managementDomainRowStatus',
|
||||
'vtp_d_tftp' => 'managementDomainTftpServer',
|
||||
'vtp_d_tftp_path' => 'managementDomainTftpPathname',
|
||||
'vtp_d_pruning' => 'managementDomainPruningState',
|
||||
'vtp_d_ver' => 'managementDomainVersionInUse',
|
||||
|
||||
# CISCO-VTP-MIB::vtpVlanTable
|
||||
'v_state' => 'vtpVlanState',
|
||||
'v_type' => 'vtpVlanType',
|
||||
'v_name' => 'vtpVlanName',
|
||||
'v_mtu' => 'vtpVlanMtu',
|
||||
'v_said' => 'vtpVlanDot10Said',
|
||||
'v_ring' => 'vtpVlanRingNumber',
|
||||
'v_bridge' => 'vtpVlanBridgeNumber',
|
||||
'v_stp' => 'vtpVlanStpType',
|
||||
'v_parent' => 'vtpVlanParentVlan',
|
||||
'v_trans1' => 'vtpVlanTranslationalVlan1',
|
||||
'v_trans2' => 'vtpVlanTranslationalVlan2',
|
||||
'v_btype' => 'vtpVlanBridgeType',
|
||||
'v_hop_are' => 'vtpVlanAreHopCount',
|
||||
'v_hop_ste' => 'vtpVlanSteHopCount',
|
||||
'v_crf' => 'vtpVlanIsCRFBackup',
|
||||
'v_type_ext' => 'vtpVlanTypeExt',
|
||||
'v_if' => 'vtpVlanIfIndex',
|
||||
|
||||
# CISCO-VLAN-MEMBERSHIP-MIB::vmMembershipTable
|
||||
'i_vlan_type' => 'vmVlanType',
|
||||
'i_vlan2' => 'vmVlan',
|
||||
'i_vlan_stat' => 'vmPortStatus',
|
||||
'i_vlan_1' => 'vmVlans',
|
||||
'i_vlan_2' => 'vmVlans2k',
|
||||
'i_vlan_3' => 'vmVlans3k',
|
||||
'i_vlan_4' => 'vmVlans4k',
|
||||
|
||||
# CISCO-VLAN-MEMBERSHIP-MIB::vmVoiceVlanTable
|
||||
'i_voice_vlan' => 'vmVoiceVlanId',
|
||||
|
||||
# CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB
|
||||
'v_cvi_if' => 'cviRoutedVlanIfIndex',
|
||||
|
||||
# CISCO-VTP-MIB::vlanTrunkPortTable
|
||||
'vtp_trunk_mgmt_dom' => 'vlanTrunkPortManagementDomain',
|
||||
'vtp_trunk_encaps_t' => 'vlanTrunkPortEncapsulationType',
|
||||
'vtp_trunk_vlans' => 'vlanTrunkPortVlansEnabled',
|
||||
'vtp_trunk_vlans_2k' => 'vlanTrunkPortVlansEnabled2k',
|
||||
'vtp_trunk_vlans_3k' => 'vlanTrunkPortVlansEnabled3k',
|
||||
'vtp_trunk_vlans_4k' => 'vlanTrunkPortVlansEnabled4k',
|
||||
'vtp_trunk_native' => 'vlanTrunkPortNativeVlan',
|
||||
'i_pvid' => 'vlanTrunkPortNativeVlan',
|
||||
'vtp_trunk_rstat' => 'vlanTrunkPortRowStatus',
|
||||
'vtp_trunk_dyn' => 'vlanTrunkPortDynamicState',
|
||||
'vtp_trunk_dyn_stat' => 'vlanTrunkPortDynamicStatus',
|
||||
'vtp_trunk_vtp' => 'vlanTrunkPortVtpEnabled',
|
||||
'vtp_trunk_encaps' => 'vlanTrunkPortEncapsulationOperType',
|
||||
|
||||
# TODO Add these tables if someone wants them..
|
||||
# vtpEditControlTable
|
||||
# vtpVlanEditTable
|
||||
# vtpStatsTable
|
||||
);
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
sub v_index {
|
||||
my $vtp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $v_name = $vtp->v_name($partial);
|
||||
my %v_index;
|
||||
foreach my $idx ( keys %$v_name ) {
|
||||
my ( $mgmtdomain, $vlan ) = split( /\./, $idx );
|
||||
$v_index{$idx} = $vlan;
|
||||
}
|
||||
return \%v_index;
|
||||
}
|
||||
|
||||
sub i_vlan {
|
||||
my $vtp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $port_vlan = $vtp->vtp_trunk_native($partial) || {};
|
||||
my $i_vlan = $vtp->i_vlan2($partial) || {};
|
||||
my $trunk_dyn_stat = $vtp->vtp_trunk_dyn_stat($partial) || {};
|
||||
|
||||
my %i_vlans;
|
||||
|
||||
# Get access ports
|
||||
foreach my $port ( keys %$i_vlan ) {
|
||||
my $vlan = $i_vlan->{$port};
|
||||
next unless defined $vlan;
|
||||
|
||||
$i_vlans{$port} = $vlan;
|
||||
}
|
||||
|
||||
# Get trunk ports
|
||||
foreach my $port ( keys %$port_vlan ) {
|
||||
my $vlan = $port_vlan->{$port};
|
||||
next unless defined $vlan;
|
||||
my $stat = $trunk_dyn_stat->{$port};
|
||||
if ( defined $stat and $stat =~ /^trunking/ ) {
|
||||
$i_vlans{$port} = $vlan;
|
||||
}
|
||||
}
|
||||
|
||||
# Check in CISCO-VLAN-IFTABLE-RELATION-MIB
|
||||
# Is this only for Aironet??? If so, it needs
|
||||
# to be removed from this class
|
||||
|
||||
my $v_cvi_if = $vtp->v_cvi_if();
|
||||
if ( defined $v_cvi_if ) {
|
||||
|
||||
# Translate vlan.physical_interface -> iid
|
||||
# to iid -> vlan
|
||||
foreach my $i ( keys %$v_cvi_if ) {
|
||||
my ( $vlan, $phys ) = split( /\./, $i );
|
||||
my $iid = $v_cvi_if->{$i};
|
||||
|
||||
$i_vlans{$iid} = $vlan;
|
||||
}
|
||||
}
|
||||
|
||||
return \%i_vlans;
|
||||
}
|
||||
|
||||
sub i_vlan_membership {
|
||||
my $vtp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ports_vlans = $vtp->vtp_trunk_vlans($partial) || {};
|
||||
my $ports_vlans_2k = $vtp->vtp_trunk_vlans_2k($partial) || {};
|
||||
my $ports_vlans_3k = $vtp->vtp_trunk_vlans_3k($partial) || {};
|
||||
my $ports_vlans_4k = $vtp->vtp_trunk_vlans_4k($partial) || {};
|
||||
my $vtp_vlans = $vtp->v_state();
|
||||
my $i_vlan = $vtp->i_vlan2($partial) || {};
|
||||
my $trunk_dyn_stat = $vtp->vtp_trunk_dyn_stat($partial) || {};
|
||||
|
||||
my $i_vlan_membership = {};
|
||||
|
||||
# Get access ports
|
||||
foreach my $port ( keys %$i_vlan ) {
|
||||
my $vlan = $i_vlan->{$port};
|
||||
next unless defined $vlan;
|
||||
my $stat = $trunk_dyn_stat->{$port};
|
||||
if ( defined $stat and $stat =~ /notTrunking/ ) {
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan );
|
||||
}
|
||||
}
|
||||
|
||||
# Get trunk ports
|
||||
|
||||
my %oper_vlans;
|
||||
foreach my $iid ( keys %$vtp_vlans ) {
|
||||
my $vlan = 0;
|
||||
my $vtp_dom = 0;
|
||||
my $state = $vtp_vlans->{$iid};
|
||||
next unless defined $state;
|
||||
next if $state !~ /operational/;
|
||||
if ( $iid =~ /(\d+)\.(\d+)/ ) {
|
||||
$vtp_dom = $1;
|
||||
$vlan = $2;
|
||||
}
|
||||
$oper_vlans{$vlan}++;
|
||||
}
|
||||
|
||||
foreach my $port ( keys %$ports_vlans ) {
|
||||
my $stat = $trunk_dyn_stat->{$port};
|
||||
if ( defined $stat and $stat =~ /^trunking/ ) {
|
||||
my $k = 0;
|
||||
my $list1 = $ports_vlans->{$port} || '0';
|
||||
my $list2 = $ports_vlans_2k->{$port} || '0';
|
||||
my $list3 = $ports_vlans_3k->{$port} || '0';
|
||||
my $list4 = $ports_vlans_4k->{$port} || '0';
|
||||
foreach my $list ( "$list1", "$list2", "$list3", "$list4" ) {
|
||||
my $offset = 1024 * $k++;
|
||||
next unless $list;
|
||||
my $vlanlist = [ split( //, unpack( "B*", $list ) ) ];
|
||||
foreach my $vlan ( keys %oper_vlans ) {
|
||||
next if (($vlan < $offset) or ($vlan - $offset > 1024));
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan )
|
||||
if ( @$vlanlist[ $vlan - $offset ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
sub set_i_pvid {
|
||||
my $vtp = shift;
|
||||
my ( $vlan_id, $ifindex ) = @_;
|
||||
|
||||
return unless ( $vtp->_validate_vlan_param( $vlan_id, $ifindex ) );
|
||||
|
||||
my $native_vlan = $vtp->vtp_trunk_native($ifindex);
|
||||
if ( defined $native_vlan ) {
|
||||
|
||||
print
|
||||
"Changing native VLAN from $native_vlan->{$ifindex} to $vlan_id on IfIndex: $ifindex\n"
|
||||
if $vtp->debug();
|
||||
|
||||
my $rv = $vtp->set_vtp_trunk_native( $vlan_id, $ifindex );
|
||||
unless ($rv) {
|
||||
$vtp->error_throw(
|
||||
"Unable to change native VLAN to $vlan_id on IfIndex: $ifindex"
|
||||
);
|
||||
return;
|
||||
}
|
||||
return $rv;
|
||||
}
|
||||
$vtp->error_throw("Can't find ifIndex: $ifindex - Is it a trunk port?");
|
||||
return;
|
||||
}
|
||||
|
||||
sub set_i_vlan {
|
||||
my $vtp = shift;
|
||||
my ( $vlan_id, $ifindex ) = @_;
|
||||
|
||||
return unless ( $vtp->_validate_vlan_param( $vlan_id, $ifindex ) );
|
||||
|
||||
my $i_vlan = $vtp->i_vlan2($ifindex);
|
||||
if ( defined $i_vlan ) {
|
||||
|
||||
print
|
||||
"Changing VLAN from $i_vlan->{$ifindex} to $vlan_id on IfIndex: $ifindex\n"
|
||||
if $vtp->debug();
|
||||
|
||||
my $rv = $vtp->set_i_vlan2( $vlan_id, $ifindex );
|
||||
unless ($rv) {
|
||||
$vtp->error_throw(
|
||||
"Unable to change VLAN to $vlan_id on IfIndex: $ifindex");
|
||||
return;
|
||||
}
|
||||
return $rv;
|
||||
}
|
||||
$vtp->error_throw("Can't find ifIndex: $ifindex - Is it an access port?");
|
||||
return;
|
||||
}
|
||||
|
||||
sub set_add_i_vlan_tagged {
|
||||
my $vtp = shift;
|
||||
my ( $vlan_id, $ifindex ) = @_;
|
||||
|
||||
return unless ( $vtp->_validate_vlan_param( $vlan_id, $ifindex ) );
|
||||
|
||||
print "Adding VLAN: $vlan_id to ifIndex: $ifindex\n" if $vtp->debug();
|
||||
|
||||
my $trunk_serial = $vtp->load_vtp_trunk_set_serial();
|
||||
my $trunk_members = $vtp->vtp_trunk_vlans($ifindex);
|
||||
|
||||
unless ( defined $trunk_members ) {
|
||||
$vtp->error_throw(
|
||||
"Can't find ifIndex: $ifindex - Is it a trunk port?");
|
||||
return;
|
||||
}
|
||||
|
||||
my @member_list = split( //, unpack( "B*", $trunk_members->{$ifindex} ) );
|
||||
|
||||
print "Original vlan list for ifIndex: $ifindex: @member_list \n"
|
||||
if $vtp->debug();
|
||||
$member_list[$vlan_id] = '1';
|
||||
print "Modified vlan list for ifIndex: $ifindex: @member_list \n"
|
||||
if $vtp->debug();
|
||||
my $new_list = pack( "B*", join( '', @member_list ) );
|
||||
|
||||
#Add VLAN to member list
|
||||
my $list_rv = $vtp->set_vtp_trunk_vlans( $new_list, $ifindex );
|
||||
unless ($list_rv) {
|
||||
$vtp->error_throw(
|
||||
"Unable to add VLAN: $vlan_id to ifIndex: $ifindex member list");
|
||||
return;
|
||||
}
|
||||
|
||||
#Make sure no other SNMP manager was making modifications at the same time.
|
||||
my $serial_rv = $vtp->set_vtp_trunk_set_serial($trunk_serial);
|
||||
unless ($serial_rv) {
|
||||
$vtp->error_throw(
|
||||
"Unable to increment trunk set serial number - check configuration!"
|
||||
);
|
||||
return;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub set_remove_i_vlan_tagged {
|
||||
my $vtp = shift;
|
||||
my ( $vlan_id, $ifindex ) = @_;
|
||||
|
||||
return unless ( $vtp->_validate_vlan_param( $vlan_id, $ifindex ) );
|
||||
|
||||
print "Removing VLAN: $vlan_id from ifIndex: $ifindex\n" if $vtp->debug();
|
||||
|
||||
my $trunk_serial = $vtp->load_vtp_trunk_set_serial();
|
||||
my $trunk_members = $vtp->vtp_trunk_vlans($ifindex);
|
||||
|
||||
unless ( defined $trunk_members ) {
|
||||
$vtp->error_throw(
|
||||
"Can't find ifIndex: $ifindex - Is it a trunk port?");
|
||||
return;
|
||||
}
|
||||
|
||||
my @member_list = split( //, unpack( "B*", $trunk_members->{$ifindex} ) );
|
||||
|
||||
print "Original vlan list for ifIndex: $ifindex: @member_list \n"
|
||||
if $vtp->debug();
|
||||
$member_list[$vlan_id] = '0';
|
||||
print "Modified vlan list for ifIndex: $ifindex: @member_list \n"
|
||||
if $vtp->debug();
|
||||
my $new_list = pack( "B*", join( '', @member_list ) );
|
||||
|
||||
#Remove VLAN to member list
|
||||
my $list_rv = $vtp->set_vtp_trunk_vlans( $new_list, $ifindex );
|
||||
unless ($list_rv) {
|
||||
$vtp->error_throw(
|
||||
"Error: Unable to remove VLAN: $vlan_id from ifIndex: $ifindex member list"
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
#Make sure no other manager was making modifications at the same time.
|
||||
my $serial_rv = $vtp->set_vtp_trunk_set_serial($trunk_serial);
|
||||
unless ($serial_rv) {
|
||||
$vtp->error_throw(
|
||||
"Error: Unable to increment trunk set serial number - check configuration!"
|
||||
);
|
||||
return;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
#
|
||||
# These are internal methods and are not documented. Do not use directly.
|
||||
#
|
||||
sub _validate_vlan_param {
|
||||
my $vtp = shift;
|
||||
my ( $vlan_id, $ifindex ) = @_;
|
||||
|
||||
# VID and ifIndex should both be numeric
|
||||
unless (defined $vlan_id
|
||||
and defined $ifindex
|
||||
and $vlan_id =~ /^\d+$/
|
||||
and $ifindex =~ /^\d+$/ )
|
||||
{
|
||||
$vtp->error_throw("Invalid parameter");
|
||||
return;
|
||||
}
|
||||
|
||||
# Check that ifIndex exists on device
|
||||
my $index = $vtp->interfaces($ifindex);
|
||||
|
||||
unless ( exists $index->{$ifindex} ) {
|
||||
$vtp->error_throw("ifIndex $ifindex does not exist");
|
||||
return;
|
||||
}
|
||||
|
||||
#Check that VLAN exists on device
|
||||
my $vtp_vlans = $vtp->v_state();
|
||||
my $vlan_exists = 0;
|
||||
|
||||
foreach my $iid ( keys %$vtp_vlans ) {
|
||||
my $vlan = 0;
|
||||
my $vtp_dom = 0;
|
||||
my $state = $vtp_vlans->{$iid};
|
||||
next unless defined $state;
|
||||
next if $state !~ /operational/;
|
||||
if ( $iid =~ /(\d+)\.(\d+)/ ) {
|
||||
$vtp_dom = $1;
|
||||
$vlan = $2;
|
||||
}
|
||||
|
||||
$vlan_exists = 1 if ( $vlan_id eq $vlan );
|
||||
}
|
||||
unless ($vlan_exists) {
|
||||
$vtp->error_throw(
|
||||
"VLAN $vlan_id does not exist or is not operational");
|
||||
return;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoVTP - SNMP Interface to Cisco's VLAN Management MIBs
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $vtp = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $vtp->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::CiscoVTP is a subclass of SNMP::Info that provides
|
||||
information about a Cisco device's VLAN and VTP Domain membership.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-VTP-MIB>
|
||||
|
||||
=item F<CISCO-VLAN-MEMBERSHIP-MIB>
|
||||
|
||||
=item F<CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB>
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
=over
|
||||
|
||||
=item $vtp->vtp_version()
|
||||
|
||||
(C<vtpVersion>)
|
||||
|
||||
=item $vtp->vtp_maxstore()
|
||||
|
||||
(C<vtpMaxVlanStorage>)
|
||||
|
||||
=item $vtp->vtp_notify()
|
||||
|
||||
(C<vtpNotificationsEnabled>)
|
||||
|
||||
=item $vtp->vtp_notify_create()
|
||||
|
||||
(C<vtpVlanCreatedNotifEnabled>)
|
||||
|
||||
=item $vtp->vtp_notify_delete()
|
||||
|
||||
(C<vtpVlanDeletedNotifEnabled>)
|
||||
|
||||
=item $vtp->vtp_trunk_set_serial()
|
||||
|
||||
(C<vlanTrunkPortSetSerialNo>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
Your device will only implement a subset of these methods.
|
||||
|
||||
=over
|
||||
|
||||
=item $vtp->i_vlan()
|
||||
|
||||
Returns a mapping between C<ifIndex> and assigned VLAN ID for access ports
|
||||
and the default VLAN ID for trunk ports.
|
||||
|
||||
=item $vtp->i_vlan_membership()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
IDs. These are the VLANs which are members of enabled VLAN list for the port.
|
||||
|
||||
Example:
|
||||
my $interfaces = $vtp->interfaces();
|
||||
my $vlans = $vtp->i_vlan_membership();
|
||||
|
||||
foreach my $iid (sort keys %$interfaces) {
|
||||
my $port = $interfaces->{$iid};
|
||||
my $vlan = join(',', sort(@{$vlans->{$iid}}));
|
||||
print "Port: $port VLAN: $vlan\n";
|
||||
}
|
||||
|
||||
=back
|
||||
|
||||
=head2 VLAN Table (C<CISCO-VTP-MIB::vtpVlanTable>)
|
||||
|
||||
See L<ftp://ftp.cisco.com/pub/mibs/supportlists/wsc5000/wsc5000-communityIndexing.html>
|
||||
for a good treaty of how to connect to the VLANs
|
||||
|
||||
=over
|
||||
|
||||
=item $vtp->v_index()
|
||||
|
||||
(C<vtpVlanIndex>)
|
||||
|
||||
=item $vtp->v_state()
|
||||
|
||||
(C<vtpVlanState>)
|
||||
|
||||
=item $vtp->v_type()
|
||||
|
||||
(C<vtpVlanType>)
|
||||
|
||||
=item $vtp->v_name()
|
||||
|
||||
(C<vtpVlanName>)
|
||||
|
||||
=item $vtp->v_mtu()
|
||||
|
||||
(C<vtpVlanMtu>)
|
||||
|
||||
=item $vtp->v_said()
|
||||
|
||||
(C<vtpVlanDot10Said>)
|
||||
|
||||
=item $vtp->v_ring()
|
||||
|
||||
(C<vtpVlanRingNumber>)
|
||||
|
||||
=item $vtp->v_bridge()
|
||||
|
||||
(C<vtpVlanBridgeNumber>)
|
||||
|
||||
=item $vtp->v_stp()
|
||||
|
||||
(C<vtpVlanStpType>)
|
||||
|
||||
=item $vtp->v_parent()
|
||||
|
||||
(C<vtpVlanParentVlan>)
|
||||
|
||||
=item $vtp->v_trans1()
|
||||
|
||||
(C<vtpVlanTranslationalVlan1>)
|
||||
|
||||
=item $vtp->v_trans2()
|
||||
|
||||
(C<vtpVlanTranslationalVlan2>)
|
||||
|
||||
=item $vtp->v_btype()
|
||||
|
||||
(C<vtpVlanBridgeType>)
|
||||
|
||||
=item $vtp->v_hop_are()
|
||||
|
||||
(C<vtpVlanAreHopCount>)
|
||||
|
||||
=item $vtp->v_hop_ste()
|
||||
|
||||
(C<vtpVlanSteHopCount>)
|
||||
|
||||
=item $vtp->v_crf()
|
||||
|
||||
(C<vtpVlanIsCRFBackup>)
|
||||
|
||||
=item $vtp->v_type_ext()
|
||||
|
||||
(C<vtpVlanTypeExt>)
|
||||
|
||||
=item $vtp->v_if()
|
||||
|
||||
(C<vtpVlanIfIndex>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 VLAN Membership Table (C<CISCO-VLAN-MEMBERSHIP-MIB::vmMembershipTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $vtp->i_vlan_type()
|
||||
|
||||
Static, Dynamic, or multiVlan.
|
||||
|
||||
(C<vmVlanType>)
|
||||
|
||||
=item $vtp->i_vlan2()
|
||||
|
||||
The VLAN that an access port is assigned to.
|
||||
|
||||
(C<vmVlan>)
|
||||
|
||||
=item $vtp->i_vlan_stat()
|
||||
|
||||
Inactive, active, shutdown.
|
||||
|
||||
(C<vmPortStatus>)
|
||||
|
||||
=item $vtp->i_vlan_1()
|
||||
|
||||
Each bit represents a VLAN. This is 0 through 1023
|
||||
|
||||
(C<vmVlans>)
|
||||
|
||||
=item $vtp->i_vlan_2()
|
||||
|
||||
Each bit represents a VLAN. This is 1024 through 2047
|
||||
|
||||
(C<vmVlans2k>)
|
||||
|
||||
=item $vtp->i_vlan_3()
|
||||
|
||||
Each bit represents a VLAN. This is 2048 through 3071
|
||||
|
||||
(C<vmVlans3k>)
|
||||
|
||||
=item $vtp->i_vlan_4()
|
||||
|
||||
Each bit represents a VLAN. This is 3072 through 4095
|
||||
|
||||
(C<vmVlans4k>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 VLAN Membership Voice VLAN Table
|
||||
(C<CISCO-VLAN-MEMBERSHIP-MIB::vmVoiceVlanTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $vtp->i_voice_vlan()
|
||||
|
||||
(C<vmVoiceVlanId>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Management Domain Table (C<CISCO-VTP-MIB::managementDomainTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $vtp->vtp_d_index()
|
||||
|
||||
(C<managementDomainIndex>)
|
||||
|
||||
=item $vtp->vtp_d_name()
|
||||
|
||||
(C<managementDomainName>)
|
||||
|
||||
=item $vtp->vtp_d_mode()
|
||||
|
||||
(C<managementDomainLocalMode>)
|
||||
|
||||
=item $vtp->vtp_d_rev()
|
||||
|
||||
(C<managementDomainConfigRevNumber>)
|
||||
|
||||
=item $vtp->vtp_d_updater()
|
||||
|
||||
(C<managementDomainLastUpdater>)
|
||||
|
||||
=item $vtp->vtp_d_last()
|
||||
|
||||
(C<managementDomainLastChange>)
|
||||
|
||||
=item $vtp->vtp_d_status()
|
||||
|
||||
(C<managementDomainRowStatus>)
|
||||
|
||||
=item $vtp->vtp_d_tftp()
|
||||
|
||||
(C<managementDomainTftpServer>)
|
||||
|
||||
=item $vtp->vtp_d_tftp_path()
|
||||
|
||||
(C<managementDomainTftpPathname>)
|
||||
|
||||
=item $vtp->vtp_d_pruning()
|
||||
|
||||
(C<managementDomainPruningState>)
|
||||
|
||||
=item $vtp->vtp_d_ver()
|
||||
|
||||
(C<managementDomainVersionInUse>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 VLAN Trunk Port Table (C<CISCO-VTP-MIB::vlanTrunkPortTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $vtp->vtp_trunk_mgmt_dom()
|
||||
|
||||
(C<vlanTrunkPortManagementDomain>)
|
||||
|
||||
=item $vtp->vtp_trunk_encaps_t()
|
||||
|
||||
(C<vlanTrunkPortEncapsulationType>)
|
||||
|
||||
=item $vtp->vtp_trunk_vlans()
|
||||
|
||||
(C<vlanTrunkPortVlansEnabled>)
|
||||
|
||||
=item $vtp->vtp_trunk_vlans_2k()
|
||||
|
||||
(C<vlanTrunkPortVlansEnabled2k>)
|
||||
|
||||
=item $vtp->vtp_trunk_vlans_3k()
|
||||
|
||||
(C<vlanTrunkPortVlansEnabled3k>)
|
||||
|
||||
=item $vtp->vtp_trunk_vlans_4k()
|
||||
|
||||
(C<vlanTrunkPortVlansEnabled4k>)
|
||||
|
||||
=item $vtp->vtp_trunk_native()
|
||||
|
||||
(C<vlanTrunkPortNativeVlan>)
|
||||
|
||||
=item $vtp->i_pvid()
|
||||
|
||||
(C<vlanTrunkPortNativeVlan>)
|
||||
|
||||
=item $vtp->vtp_trunk_rstat()
|
||||
|
||||
(C<vlanTrunkPortRowStatus>)
|
||||
|
||||
=item $vtp->vtp_trunk_dyn()
|
||||
|
||||
(C<vlanTrunkPortDynamicState>)
|
||||
|
||||
=item $vtp->vtp_trunk_dyn_stat()
|
||||
|
||||
(C<vlanTrunkPortDynamicStatus>)
|
||||
|
||||
=item $vtp->vtp_trunk_vtp()
|
||||
|
||||
(C<vlanTrunkPortVtpEnabled>)
|
||||
|
||||
=item $vtp->vtp_trunk_encaps()
|
||||
|
||||
(C<vlanTrunkPortEncapsulationOperType>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 SET METHODS
|
||||
|
||||
These are methods that provide SNMP set functionality for overridden methods
|
||||
or provide a simpler interface to complex set operations. See
|
||||
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
|
||||
operations.
|
||||
|
||||
=over
|
||||
|
||||
=item $vtp->set_i_vlan ( vlan, ifIndex )
|
||||
|
||||
Changes an access (untagged) port VLAN, must be supplied with the numeric
|
||||
VLAN ID and port C<ifIndex>. This method should only be used on end station
|
||||
(non-trunk) ports.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$vtp->interfaces()};
|
||||
$vtp->set_i_vlan('2', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't change port VLAN. ",$vtp->error(1);
|
||||
|
||||
=item $vtp->set_i_pvid ( pvid, ifIndex )
|
||||
|
||||
Sets port default VLAN, must be supplied with the numeric VLAN ID and
|
||||
port C<ifIndex>. This method should only be used on trunk ports.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$vtp->interfaces()};
|
||||
$vtp->set_i_pvid('2', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't change port default VLAN. ",$vtp->error(1);
|
||||
|
||||
=item $vtp->set_add_i_vlan_tagged ( vlan, ifIndex )
|
||||
|
||||
Adds the VLAN to the enabled VLANs list of the port, must be supplied with the
|
||||
numeric VLAN ID and port C<ifIndex>.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$vtp->interfaces()};
|
||||
$vtp->set_add_i_vlan_tagged('2', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't add port to egress list. ",$vtp->error(1);
|
||||
|
||||
=item $vtp->set_remove_i_vlan_tagged ( vlan, ifIndex )
|
||||
|
||||
Removes the VLAN from the enabled VLANs list of the port, must be supplied
|
||||
with the numeric VLAN ID and port C<ifIndex>.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$vtp->interfaces()};
|
||||
$vtp->set_remove_i_vlan_tagged('2', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't add port to egress list. ",$vtp->error(1);
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
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.00_003';
|
||||
|
||||
%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,75 +1,102 @@
|
||||
# SNMP::Info::Entity
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Entity;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
|
||||
@SNMP::Info::Entity::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::Entity::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::Entity::EXPORT_OK = qw//;
|
||||
|
||||
$INIT = 0;
|
||||
%MIBS = ('ENTITY-MIB' => 'entPhysicalSerialNum');
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
%GLOBALS = (
|
||||
);
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%FUNCS = (
|
||||
'e_class' => 'entPhysicalClass',
|
||||
'e_descr' => 'entPhysicalDescr',
|
||||
'e_fwver' => 'entPhysicalFirmwareRev',
|
||||
'e_hwver' => 'entPhysicalHardwareRev',
|
||||
'e_map' => 'entAliasMappingIdentifier',
|
||||
'e_model' => 'entPhysicalModelName',
|
||||
'e_name' => 'entPhysicalName',
|
||||
'e_parent' => 'entPhysicalContainedIn',
|
||||
'e_serial' => 'entPhysicalSerialNum',
|
||||
'e_swver' => 'entPhysicalSoftwareRev',
|
||||
'e_type' => 'entPhysicalVendorType',
|
||||
);
|
||||
%MIBS = ( 'ENTITY-MIB' => 'entPhysicalSerialNum' );
|
||||
|
||||
%MUNGE = (
|
||||
);
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
'e_alias' => 'entPhysicalAlias',
|
||||
'e_class' => 'entPhysicalClass',
|
||||
'e_descr' => 'entPhysicalDescr',
|
||||
'e_fwver' => 'entPhysicalFirmwareRev',
|
||||
'e_fru' => 'entPhysicalIsFRU',
|
||||
'e_hwver' => 'entPhysicalHardwareRev',
|
||||
'e_id' => 'entPhysicalAssetID',
|
||||
'e_map' => 'entAliasMappingIdentifier',
|
||||
'e_model' => 'entPhysicalModelName',
|
||||
'e_name' => 'entPhysicalName',
|
||||
'e_parent' => 'entPhysicalContainedIn',
|
||||
'e_pos' => 'entPhysicalParentRelPos',
|
||||
'e_serial' => 'entPhysicalSerialNum',
|
||||
'e_swver' => 'entPhysicalSoftwareRev',
|
||||
'e_type' => 'entPhysicalVendorType',
|
||||
'e_vendor' => 'entPhysicalMfgName',
|
||||
);
|
||||
|
||||
%MUNGE = ( 'e_type' => \&SNMP::Info::munge_e_type, );
|
||||
|
||||
# entPhysicalIndex is not-accessible. Create to facilitate emulation methods
|
||||
# in other classes
|
||||
|
||||
sub e_index {
|
||||
my $entity = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# Force use of MIB leaf to avoid inheritance issues in psuedo classes
|
||||
my $e_descr = $entity->entPhysicalDescr($partial);
|
||||
|
||||
return unless ($e_descr);
|
||||
|
||||
my %e_index;
|
||||
|
||||
foreach my $iid ( keys %$e_descr ) {
|
||||
$e_index{$iid} = $iid;
|
||||
}
|
||||
return \%e_index;
|
||||
}
|
||||
|
||||
sub e_port {
|
||||
my $entity = shift;
|
||||
my $e_map = $entity->e_map();
|
||||
my $entity = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $e_map = $entity->e_map($partial);
|
||||
|
||||
my %e_port;
|
||||
|
||||
foreach my $e_id (keys %$e_map) {
|
||||
foreach my $e_id ( keys %$e_map ) {
|
||||
my $id = $e_id;
|
||||
$id =~ s/\.0$//;
|
||||
|
||||
@@ -81,15 +108,18 @@ sub e_port {
|
||||
|
||||
return \%e_port;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Entity - Perl5 Interface to SNMP data stored in ENTITY-MIB.
|
||||
SNMP::Info::Entity - SNMP Interface to data stored in F<ENTITY-MIB>. RFC 2737
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -97,7 +127,6 @@ Max Baker (C<max@warped.org>)
|
||||
my $entity = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
@@ -109,11 +138,15 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
ENTITY-MIB is used by some Layer 2 devices like HP Switches and Aironet Access Points
|
||||
F<ENTITY-MIB> is used by Layer 2 devices from Brocade, Cisco, HP,
|
||||
and more.
|
||||
|
||||
See RFC 2737 for full details.
|
||||
|
||||
Create or use a device subclass that inherit this class. Do not use directly.
|
||||
|
||||
For debugging purposes you can call this class directly as you would SNMP::Info
|
||||
For debugging purposes you can call this class directly as you would
|
||||
SNMP::Info
|
||||
|
||||
my $entity = new SNMP::Info::Entity (...);
|
||||
|
||||
@@ -125,7 +158,7 @@ none.
|
||||
|
||||
=over
|
||||
|
||||
=item ENTITY-MIB
|
||||
=item F<ENTITY-MIB>
|
||||
|
||||
=back
|
||||
|
||||
@@ -144,43 +177,85 @@ to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $entity->e_index()
|
||||
|
||||
Index
|
||||
|
||||
(C<entPhysicalIndex>)
|
||||
|
||||
=item $entity->e_alias()
|
||||
|
||||
Human entered, not usually used.
|
||||
|
||||
(C<entPhysicalAlias>)
|
||||
|
||||
=item $entity->e_class()
|
||||
|
||||
Stack, Module, Container, Port ...
|
||||
|
||||
(C<entPhysicalClass>)
|
||||
|
||||
=item $entity->e_descr()
|
||||
|
||||
Human Friendly
|
||||
|
||||
(C<entPhysicalClass>)
|
||||
|
||||
=item $entity->e_fwver()
|
||||
|
||||
(C<entPhysicalFirmwareRev>)
|
||||
|
||||
=item $entity->e_fru()
|
||||
|
||||
BOOLEAN. Is a Field Replaceable unit?
|
||||
|
||||
(C<entPhysicalFRU>)
|
||||
|
||||
=item $entity->e_hwver()
|
||||
|
||||
(C<entPhysicalHardwareRev>)
|
||||
|
||||
=item $entity->e_id()
|
||||
|
||||
This is human entered and not normally used.
|
||||
|
||||
(C<entPhysicalAssetID>)
|
||||
|
||||
=item $entity->e_map()
|
||||
|
||||
See MIB.
|
||||
|
||||
(C<entAliasMappingIdentifier>)
|
||||
|
||||
=item $entity->e_model()
|
||||
|
||||
Model Name of Entity.
|
||||
|
||||
(C<entPhysicalModelName>)
|
||||
|
||||
=item $entity->e_name()
|
||||
|
||||
More computer friendly name of entity. Parse me.
|
||||
|
||||
(C<entPhysicalName>)
|
||||
|
||||
=item $entity->e_parent()
|
||||
|
||||
0 if root.
|
||||
|
||||
(C<entPhysicalContainedIn>)
|
||||
|
||||
=item $entity->e_port()
|
||||
|
||||
Maps EntityTable entries to the Interface Table (IfTable) using
|
||||
Maps Entity Table entries to the Interface Table (C<IfTable>) using
|
||||
$entity->e_map()
|
||||
|
||||
=item $entity->e_pos()
|
||||
|
||||
The relative position among all entities sharing the same parent.
|
||||
|
||||
(C<entPhysicalParentRelPos>)
|
||||
|
||||
=item $entity->e_serial()
|
||||
|
||||
(C<entPhysicalSerialNum>)
|
||||
@@ -191,8 +266,17 @@ $entity->e_map()
|
||||
|
||||
=item $entity->e_type()
|
||||
|
||||
This is an OID, which gets munged into the object name if the right
|
||||
MIB is loaded.
|
||||
|
||||
(C<entPhysicalVendorType>)
|
||||
|
||||
=item $entity->e_vendor()
|
||||
|
||||
Vendor of Module.
|
||||
|
||||
(C<entPhysicalMfgName>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,79 +1,86 @@
|
||||
# SNMP::Info::EtherLike
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::EtherLike;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
|
||||
@SNMP::Info::EtherLike::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::EtherLike::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::EtherLike::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$INIT = 0;
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
# Same info in both rfc1398 and this?
|
||||
%MIBS = ('ETHERLIKE-MIB' => 'etherMIB' );
|
||||
%MIBS = ( 'EtherLike-MIB' => 'etherMIB' );
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
# EtherLike StatsTable
|
||||
'el_chipset' => 'dot3StatsEtherChipSet',
|
||||
'el_coll_excess' => 'dot3StatsExcessiveCollisions',
|
||||
'el_coll_late' => 'dot3StatsLateCollisions',
|
||||
'el_coll_mult' => 'dot3StatsMultipleCollisionFrames',
|
||||
'el_coll_single' => 'dot3StatsSingleCollisionFrames',
|
||||
'el_duplex' => 'dot3StatsDuplexStatus',
|
||||
'el_error_alignment' => 'dot3StatsAlignmentErrors',
|
||||
'el_error_fcs' => 'dot3StatsFCSErrors',
|
||||
'el_error_cs' => 'dot3StatsCarrierSenseErrors',
|
||||
'el_error_frame' => 'dot3StatsFrameTooLongs',
|
||||
'el_error_mac_rec' => 'dot3StatsInternalMacReceiveErrors',
|
||||
'el_error_mac_xmit' => 'dot3StatsInternalMacTransmitErrors',
|
||||
'el_error_sqe' => 'dot3StatsSQETestErrors',
|
||||
'el_error_symbol' => 'dot3StatsSymbolErrors',
|
||||
'el_index' => 'dot3StatsIndex',
|
||||
'el_xmit_defer' => 'dot3StatsDeferredTransmissions',
|
||||
# Ethernet-like Collision Statistics Group
|
||||
'el_coll_count' => 'dot3CollCount',
|
||||
'el_coll_freq' => 'dot3CollFrequencies'
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::MUNGE );
|
||||
# EtherLike StatsTable
|
||||
'el_chipset' => 'dot3StatsEtherChipSet',
|
||||
'el_coll_excess' => 'dot3StatsExcessiveCollisions',
|
||||
'el_coll_late' => 'dot3StatsLateCollisions',
|
||||
'el_coll_mult' => 'dot3StatsMultipleCollisionFrames',
|
||||
'el_coll_single' => 'dot3StatsSingleCollisionFrames',
|
||||
'el_duplex' => 'dot3StatsDuplexStatus',
|
||||
'el_error_alignment' => 'dot3StatsAlignmentErrors',
|
||||
'el_error_fcs' => 'dot3StatsFCSErrors',
|
||||
'el_error_cs' => 'dot3StatsCarrierSenseErrors',
|
||||
'el_error_frame' => 'dot3StatsFrameTooLongs',
|
||||
'el_error_mac_rec' => 'dot3StatsInternalMacReceiveErrors',
|
||||
'el_error_mac_xmit' => 'dot3StatsInternalMacTransmitErrors',
|
||||
'el_error_sqe' => 'dot3StatsSQETestErrors',
|
||||
'el_error_symbol' => 'dot3StatsSymbolErrors',
|
||||
'el_index' => 'dot3StatsIndex',
|
||||
'el_xmit_defer' => 'dot3StatsDeferredTransmissions',
|
||||
|
||||
# Ethernet-like Collision Statistics Group
|
||||
'el_coll_count' => 'dot3CollCount',
|
||||
'el_coll_freq' => 'dot3CollFrequencies'
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::MUNGE, 'el_duplex' => \&munge_el_duplex, );
|
||||
|
||||
sub munge_el_duplex {
|
||||
my $duplex = shift;
|
||||
return unless defined $duplex;
|
||||
|
||||
$duplex =~ s/Duplex$//;
|
||||
return $duplex;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
@@ -81,11 +88,11 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::EtherLike - Perl5 Interface to SNMP ETHERLIKE-MIB
|
||||
SNMP::Info::EtherLike - SNMP Interface to SNMP F<ETHERLIKE-MIB> RFC 1398
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -100,7 +107,8 @@ Max Baker (C<max@warped.org>)
|
||||
my $class = $cdp->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
# Find the duplex setting for a port on a device that implements ETHERLIKE-MIB
|
||||
# Find the duplex setting for a port on a device that implements
|
||||
# ETHERLIKE-MIB
|
||||
my $interfaces = $el->interfaces();
|
||||
my $el_index = $el->el_index();
|
||||
my $el_duplex = $el->el_duplex();
|
||||
@@ -110,19 +118,19 @@ Max Baker (C<max@warped.org>)
|
||||
my $iid = $el_index->{$el_port};
|
||||
my $port = $interfaces->{$iid};
|
||||
|
||||
$duplex = 'half' if $duplex =~/half/i;
|
||||
$duplex = 'full' if $duplex =~/full/i;
|
||||
$duplex = 'auto' if $duplex =~/auto/i;
|
||||
|
||||
print "PORT:$port set to duplex:$duplex\n";
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::EtherLike is a subclass of SNMP::Info that supplies
|
||||
access to the ETHERLIKE-MIB used by some Layer 3 Devices such as Cisco routers.
|
||||
access to the F<ETHERLIKE-MIB> used by some Layer 3 Devices such as
|
||||
Cisco routers.
|
||||
|
||||
Use or create a subclass of SNMP::Info that inherits this one. Do not use directly.
|
||||
See RFC 1398 for more details.
|
||||
|
||||
Use or create a subclass of SNMP::Info that inherits this one. Do not use
|
||||
directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
@@ -132,7 +140,7 @@ None.
|
||||
|
||||
=over
|
||||
|
||||
=item ETHERLIKE-MIB
|
||||
=item F<ETHERLIKE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
@@ -153,7 +161,7 @@ These are methods that return scalar values from SNMP
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 ETHERLIKE STATS TABLE (dot3StatsTable)
|
||||
=head2 ETHERLIKE STATS TABLE (C<dot3StatsTable>)
|
||||
|
||||
=over
|
||||
|
||||
@@ -161,77 +169,87 @@ to a hash.
|
||||
|
||||
Returns reference to hash. Indexes Stats Table to the interface index (iid).
|
||||
|
||||
(B<dot3StatsIndex>)
|
||||
(C<dot3StatsIndex>)
|
||||
|
||||
=item $el->el_duplex()
|
||||
|
||||
Returns reference to hash. Indexes Stats Table to Duplex Status of port.
|
||||
|
||||
(B<dot3StatsDuplexStatus>)
|
||||
(C<dot3StatsDuplexStatus>)
|
||||
|
||||
=item $el->el_chipset()
|
||||
|
||||
(B<dot3StatsEtherChipSet>)
|
||||
(C<dot3StatsEtherChipSet>)
|
||||
|
||||
=item $el->el_coll_excess()
|
||||
|
||||
(B<dot3StatsExcessiveCollisions>)
|
||||
(C<dot3StatsExcessiveCollisions>)
|
||||
|
||||
=item $el->el_coll_late()
|
||||
|
||||
(B<dot3StatsLateCollisions>)
|
||||
(C<dot3StatsLateCollisions>)
|
||||
|
||||
=item $el->el_coll_mult()
|
||||
|
||||
(B<dot3StatsMultipleCollisionFrames>)
|
||||
(C<dot3StatsMultipleCollisionFrames>)
|
||||
|
||||
=item $el->el_coll_single()
|
||||
|
||||
(B<dot3StatsSingleCollisionFrames>)
|
||||
(C<dot3StatsSingleCollisionFrames>)
|
||||
|
||||
=item $el->el_error_alignment()
|
||||
|
||||
(B<dot3StatsAlignmentErrors>)
|
||||
(C<dot3StatsAlignmentErrors>)
|
||||
|
||||
=item $el->el_error_fcs()
|
||||
|
||||
(B<dot3StatsFCSErrors>)
|
||||
(C<dot3StatsFCSErrors>)
|
||||
|
||||
=item $el->el_error_cs()
|
||||
|
||||
(B<dot3StatsCarrierSenseErrors>)
|
||||
(C<dot3StatsCarrierSenseErrors>)
|
||||
|
||||
=item $el->el_error_frame()
|
||||
|
||||
(B<dot3StatsFrameTooLongs>)
|
||||
(C<dot3StatsFrameTooLongs>)
|
||||
|
||||
=item $el->el_error_mac_rec()
|
||||
|
||||
(B<dot3StatsInternalMacReceiveErrors>)
|
||||
(C<dot3StatsInternalMacReceiveErrors>)
|
||||
|
||||
=item $el->el_error_mac_xmit()
|
||||
|
||||
(B<dot3StatsInternalMacTransmitErrors>)
|
||||
(C<dot3StatsInternalMacTransmitErrors>)
|
||||
|
||||
=item $el->el_error_sqe()
|
||||
|
||||
(B<dot3StatsSQETestErrors>)
|
||||
(C<dot3StatsSQETestErrors>)
|
||||
|
||||
=item $el->el_error_symbol()
|
||||
|
||||
(B<dot3StatsSymbolErrors>)
|
||||
(C<dot3StatsSymbolErrors>)
|
||||
|
||||
=item $el->el_xmit_defer()
|
||||
|
||||
(B<dot3StatsDeferredTransmissions>)
|
||||
(C<dot3StatsDeferredTransmissions>)
|
||||
|
||||
=item $el->el_coll_count()
|
||||
|
||||
(B<dot3CollCount>)
|
||||
(C<dot3CollCount>)
|
||||
|
||||
=item $el->el_coll_freq()
|
||||
|
||||
(B<dot3CollFrequencies>)
|
||||
(C<dot3CollFrequencies>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 Data Munging Callback Subroutines
|
||||
|
||||
=over
|
||||
|
||||
=item $el->munge_el_duplex()
|
||||
|
||||
Removes 'Duplex' from the end of a string.
|
||||
|
||||
=back
|
||||
|
||||
|
||||
424
Info/FDP.pm
Normal file
424
Info/FDP.pm
Normal file
@@ -0,0 +1,424 @@
|
||||
# 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.00_003';
|
||||
|
||||
%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_caps,
|
||||
'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, 7 digits long, MSB. Each digit represents a bit from the
|
||||
table below.
|
||||
|
||||
From L<http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm#18843>:
|
||||
|
||||
(Bit) - Description
|
||||
|
||||
=over
|
||||
|
||||
=item (0x40) - Provides level 1 functionality.
|
||||
|
||||
=item (0x20) - The bridge or switch does not forward IGMP Report packets on
|
||||
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 C<martin -at- lorensen.dk> 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.00_003';
|
||||
|
||||
%MIBS = ( 'IEEE802dot11-MIB' => 'dot11DesiredSSID', );
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# dot11PhyOFDMTable
|
||||
'dot11_cur_freq' => 'dot11CurrentFrequency',
|
||||
|
||||
# dot11PhyDSSSTable
|
||||
'dot11_cur_ch' => 'dot11CurrentChannel',
|
||||
|
||||
# dot11PhyOperationTable
|
||||
'dot11_phy_type' => 'dot11PHYType',
|
||||
'dot11_reg_dom' => 'dot11CurrentRegDomain',
|
||||
|
||||
# dot11ResourceInfoTable
|
||||
'dot11_prod_ver' => 'dot11manufacturerProductVersion',
|
||||
'dot11_prod_name' => 'dot11manufacturerProductName',
|
||||
'dot11_man_name' => 'dot11manufacturerName',
|
||||
|
||||
# dot11OperationTable
|
||||
'dot11_mac' => 'dot11MACAddress',
|
||||
|
||||
# dot11StationConfigTable
|
||||
'dot11_bss_type' => 'dot11DesiredBSSType',
|
||||
'i_ssidlist' => 'dot11DesiredSSID',
|
||||
'dot11_pwr_mode' => 'dot11PowerManagementMode',
|
||||
'dot11_sta_id' => 'dot11StationID',
|
||||
|
||||
# dot11PhyTxPowerTable
|
||||
'dot11_cur_tx_pwr' => 'dot11CurrentTxPowerLevel',
|
||||
'dot11_tx_pwr_level_1' => 'dot11TxPowerLevel1',
|
||||
'dot11_tx_pwr_level_2' => 'dot11TxPowerLevel2',
|
||||
'dot11_tx_pwr_level_3' => 'dot11TxPowerLevel3',
|
||||
'dot11_tx_pwr_level_4' => 'dot11TxPowerLevel4',
|
||||
'dot11_tx_pwr_level_5' => 'dot11TxPowerLevel5',
|
||||
'dot11_tx_pwr_level_6' => 'dot11TxPowerLevel6',
|
||||
'dot11_tx_pwr_level_7' => 'dot11TxPowerLevel7',
|
||||
'dot11_tx_pwr_level_8' => 'dot11TxPowerLevel8',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'dot11_mac' => \&SNMP::Info::munge_mac,
|
||||
'dot11_sta_id' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
my $dot11 = shift;
|
||||
|
||||
my $names = $dot11->dot11_man_name();
|
||||
|
||||
foreach my $iid ( keys %$names ) {
|
||||
my $vendor = $names->{$iid};
|
||||
next unless defined $vendor;
|
||||
if ( $vendor =~ /^(\S+)/ ) {
|
||||
return lc($1);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $dot11 = shift;
|
||||
|
||||
my $names = $dot11->dot11_prod_name();
|
||||
|
||||
foreach my $iid ( keys %$names ) {
|
||||
my $prod = $names->{$iid};
|
||||
next unless defined $prod;
|
||||
return lc($prod);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $dot11 = shift;
|
||||
|
||||
my $versions = $dot11->dot11_prod_ver();
|
||||
|
||||
foreach my $iid ( keys %$versions ) {
|
||||
my $ver = $versions->{$iid};
|
||||
next unless defined $ver;
|
||||
if ( $ver =~ /([\d\.]+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub i_80211channel {
|
||||
my $dot11 = shift;
|
||||
|
||||
my $phy_type = $dot11->dot11_phy_type() || {};
|
||||
my $cur_freq = $dot11->dot11_cur_freq() || {};
|
||||
my $cur_ch = $dot11->dot11_cur_ch() || {};
|
||||
|
||||
my %i_80211channel;
|
||||
foreach my $iid ( keys %$phy_type ) {
|
||||
my $type = $phy_type->{$iid};
|
||||
next unless defined $type;
|
||||
if ( $type =~ /dsss/ ) {
|
||||
my $ch = $cur_ch->{$iid};
|
||||
next unless defined $ch;
|
||||
$i_80211channel{$iid} = $ch;
|
||||
}
|
||||
elsif ( $type =~ /ofdm/ ) {
|
||||
my $ch = $cur_freq->{$iid};
|
||||
next unless defined $ch;
|
||||
$i_80211channel{$iid} = $ch;
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
|
||||
return \%i_80211channel;
|
||||
}
|
||||
|
||||
sub dot11_cur_tx_pwr_mw {
|
||||
my $dot11 = shift;
|
||||
my $partial = shift;
|
||||
my $cur = $dot11->dot11_cur_tx_pwr($partial);
|
||||
my $dot11_cur_tx_pwr_mw = {};
|
||||
foreach my $idx ( keys %$cur ) {
|
||||
my $pwr = $cur->{$idx};
|
||||
if ( $pwr >= 1 && $pwr <= 8 ) {
|
||||
|
||||
# ToDo - Look at string eval
|
||||
my $mw
|
||||
= eval "\$dot11->dot11_tx_pwr_level_$pwr(\$idx)"; ## no critic
|
||||
$dot11_cur_tx_pwr_mw->{$idx} = $mw->{$idx};
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
return $dot11_cur_tx_pwr_mw;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::IEEE802dot11 - SNMP Interface to data from F<IEEE802dot11-MIB>
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $dot11 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $dot11->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::IEEE802dot11 is a subclass of SNMP::Info that provides an
|
||||
interface to F<IEEE802dot11-MIB>. This MIB is used in standards based
|
||||
802.11 wireless devices.
|
||||
|
||||
Use or create a subclass of SNMP::Info that inherits this one.
|
||||
Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
None.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<IEEE802dot11-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->vendor()
|
||||
|
||||
Tries to discover the vendor from dot11_man_name() - returns lower case
|
||||
of the first word in the first instance found.
|
||||
|
||||
=item $dot11->model()
|
||||
|
||||
Tries to discover the model from dot11_prod_name() - returns lower case
|
||||
of the first instance found.
|
||||
|
||||
=item $dot11->os_ver()
|
||||
|
||||
Tries to discover the operating system version from dot11_prod_ver() - returns
|
||||
string of numeric and decimals in the first instance found.
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->i_ssidlist()
|
||||
|
||||
Returns reference to hash. SSID's recognized by the radio interface.
|
||||
|
||||
(C<dot11DesiredSSID>)
|
||||
|
||||
=item $dot11->i_80211channel()
|
||||
|
||||
Returns reference to hash. Current operating frequency channel of the radio
|
||||
interface.
|
||||
|
||||
=item $dot11->dot11_cur_tx_pwr_mw()
|
||||
|
||||
Returns reference to hash. Current transmit power, in milliwatts, of the
|
||||
radio interface.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Dot11 Phy OFDM Table (C<dot11PhyOFDMTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->dot11_cur_freq()
|
||||
|
||||
(C<dot11CurrentFrequency>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Dot11 Phy DSSS Table (C<dot11PhyDSSSTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->dot11_cur_ch()
|
||||
|
||||
(C<dot11CurrentChannel>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Dot11 Phy Operation Table (C<dot11PhyOperationTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->dot11_phy_type()
|
||||
|
||||
(C<dot11PHYType>)
|
||||
|
||||
=item $dot11->dot11_reg_dom()
|
||||
|
||||
(C<dot11CurrentRegDomain>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Dot11 Resource Information Table (C<dot11ResourceInfoTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->dot11_prod_ver()
|
||||
|
||||
(C<dot11manufacturerProductVersion>)
|
||||
|
||||
=item $dot11->dot11_prod_name()
|
||||
|
||||
(C<dot11manufacturerProductName>)
|
||||
|
||||
=item $dot11->dot11_man_name()
|
||||
|
||||
(C<dot11manufacturerName>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Dot11 Operation Table (C<dot11OperationTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->dot11_mac()
|
||||
|
||||
(C<dot11MACAddress>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Dot11 Station Configuration Table (C<dot11StationConfigTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->dot11_bss_type()
|
||||
|
||||
(C<dot11DesiredBSSType>)
|
||||
|
||||
=item $dot11->dot11_pwr_mode()
|
||||
|
||||
(C<dot11PowerManagementMode>)
|
||||
|
||||
=item $dot11->dot11_sta_id()
|
||||
|
||||
(C<dot11StationID>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Dot11 Transmission Power Table (C<dot11PhyTxPowerTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->dot11_cur_tx_pwr()
|
||||
|
||||
(C<dot11CurrentTxPowerLevel>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_1()
|
||||
|
||||
(C<dot11TxPowerLevel1>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_2()
|
||||
|
||||
(C<dot11TxPowerLevel2>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_3()
|
||||
|
||||
(C<dot11TxPowerLevel3>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_4()
|
||||
|
||||
(C<dot11TxPowerLevel4>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_5()
|
||||
|
||||
(C<dot11TxPowerLevel5>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_6()
|
||||
|
||||
(C<dot11TxPowerLevel6>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_7()
|
||||
|
||||
(C<dot11TxPowerLevel7>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_8()
|
||||
|
||||
(C<dot11TxPowerLevel8>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
485
Info/IPv6.pm
Normal file
485
Info/IPv6.pm
Normal file
@@ -0,0 +1,485 @@
|
||||
# SNMP::Info::IPv6
|
||||
#
|
||||
# Copyright (c) 2010 Jeroen van Ingen and Carlos Vicente
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::IPv6;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::IPv6::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::IPv6::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE $METHOD/;
|
||||
|
||||
use constant {
|
||||
IPMIB => 1,
|
||||
CISCO => 2,
|
||||
IPV6MIB => 3,
|
||||
};
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
|
||||
|
||||
%MIBS = (
|
||||
'IP-MIB' => 'ipv6InterfaceTableLastChange',
|
||||
'IPV6-MIB' => 'ipv6IfTableLastChange',
|
||||
'CISCO-IETF-IP-MIB' => 'cInetNetToMediaNetAddress',
|
||||
);
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
'ip_n2p_phys_addr' => 'ipNetToPhysicalPhysAddress', # IP-MIB
|
||||
'c_inet_phys_addr' => 'cInetNetToMediaPhysAddress', # CISCO-IETF-IP-MIB
|
||||
'i6_n2p_phys_addr' => 'ipv6NetToMediaPhysAddress', # IPV6-MIB
|
||||
|
||||
'ip_n2p_phys_type' => 'ipNetToPhysicalType', # IP-MIB
|
||||
'c_inet_phys_type' => 'cInetNetToMediaType', # CISCO-IETF-IP-MIB
|
||||
'i6_n2p_phys_type' => 'ipv6NetToMediaType', # IPV6-MIB
|
||||
|
||||
'ip_n2p_phys_state' => 'ipNetToPhysicalState', # IP-MIB
|
||||
'c_inet_phys_state' => 'cInetNetToMediaState', # CISCO-IETF-IP-MIB
|
||||
'i6_n2p_phys_state' => 'ipv6NetToMediaState', # IPV6-MIB
|
||||
|
||||
'ip_pfx_origin' => 'ipAddressPrefixOrigin', # IP-MIB
|
||||
'c_pfx_origin' => 'cIpAddressPfxOrigin', # CISCO-IETF-IP-MIB
|
||||
|
||||
'ip_addr6_pfx' => 'ipAddressPrefix', # IP-MIB
|
||||
'c_addr6_pfx' => 'cIpAddressPrefix', # CISCO-IETF-IP-MIB
|
||||
|
||||
'ip_addr6_index' => 'ipAddressIfIndex', # IP-MIBw
|
||||
'c_addr6_index' => 'cIpAddressIfIndex', # CISCO-IETF-IP-MIB
|
||||
|
||||
'ip_addr6_type' => 'ipAddressType', # IP-MIB
|
||||
'c_addr6_type' => 'cIpAddressType', # CISCO-IETF-IP-MIB
|
||||
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'ip_n2p_phys_addr' => \&SNMP::Info::munge_mac,
|
||||
'c_inet_phys_addr' => \&munge_physaddr,
|
||||
'i6_n2p_phys_addr' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
|
||||
sub ipv6_n2p_mac {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $phys_addr = &_test_methods( $info, {
|
||||
ip_n2p_phys_addr => IPMIB,
|
||||
c_inet_phys_addr => CISCO,
|
||||
i6_n2p_phys_addr => IPV6MIB,
|
||||
});
|
||||
return unless defined $phys_addr;
|
||||
foreach my $row (keys %$phys_addr) {
|
||||
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
|
||||
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
|
||||
if ($info::METHOD == IPV6MIB) {
|
||||
# IPV6-MIB doesn't include the addrtype in the index;
|
||||
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
|
||||
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
|
||||
$addrtype = 2;
|
||||
}
|
||||
if (($addrtype == 2) && (defined $phys_addr->{$row})) { # IPv6
|
||||
$return->{$row} = substr($phys_addr->{$row}, 0, 17);
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_n2p_addr {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $net_addr = &_test_methods( $info, {
|
||||
ip_n2p_phys_addr => IPMIB,
|
||||
c_inet_phys_addr => CISCO,
|
||||
i6_n2p_phys_addr => IPV6MIB,
|
||||
});
|
||||
return unless defined $net_addr;
|
||||
foreach my $row (keys %$net_addr) {
|
||||
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
|
||||
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
|
||||
if ($info::METHOD == IPV6MIB) {
|
||||
# IPV6-MIB doesn't include the addrtype in the index;
|
||||
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
|
||||
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
|
||||
$addrtype = 2;
|
||||
}
|
||||
if ($addrtype == 2) { # IPv6
|
||||
my $v6_packed = pack("C*", split(/\./, $v6addr));
|
||||
if (length($v6_packed) == 15) {
|
||||
# Workaround for some some IP-MIB implementations, eg on Cisco Nexus: no explicit addrsize,
|
||||
# so what we've collected in that variable is actually the first byte of the address.
|
||||
$v6_packed = pack('C', $addrsize) . $v6_packed;
|
||||
}
|
||||
if (length($v6_packed) == 16) {
|
||||
$v6addr = join(':', map { sprintf("%04x", $_) } unpack("n*", $v6_packed) );
|
||||
$return->{$row} = $v6addr;
|
||||
} else {
|
||||
printf("Invalid size for IPv6 address: expected 16 bytes, got %d (%s = %s)\n", length($v6_packed), $row, $net_addr->{$row});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_n2p_if {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $phys_addr = &_test_methods( $info, {
|
||||
ip_n2p_phys_addr => IPMIB,
|
||||
c_inet_phys_addr => CISCO,
|
||||
i6_n2p_phys_addr => IPV6MIB,
|
||||
});
|
||||
return unless defined $phys_addr;
|
||||
foreach my $row (keys %$phys_addr) {
|
||||
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
|
||||
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
|
||||
if ($info::METHOD == IPV6MIB) {
|
||||
# IPV6-MIB doesn't include the addrtype in the index;
|
||||
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
|
||||
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
|
||||
$addrtype = 2;
|
||||
}
|
||||
if ($addrtype == 2) { # IPv6
|
||||
$return->{$row} = $ifindex;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_n2p_type {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $phys_type = &_test_methods( $info, {
|
||||
ip_n2p_phys_type => IPMIB,
|
||||
c_inet_phys_type => CISCO,
|
||||
i6_n2p_phys_type => IPV6MIB,
|
||||
});
|
||||
return unless defined $phys_type;
|
||||
foreach my $row (keys %$phys_type) {
|
||||
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
|
||||
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
|
||||
if ($info::METHOD == IPV6MIB) {
|
||||
# IPV6-MIB doesn't include the addrtype in the index;
|
||||
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
|
||||
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
|
||||
$addrtype = 2;
|
||||
}
|
||||
if ($addrtype == 2) { # IPv6
|
||||
$return->{$row} = $phys_type->{$row};
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_n2p_state {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $phys_state = &_test_methods( $info, {
|
||||
ip_n2p_phys_state => IPMIB,
|
||||
c_inet_phys_state => CISCO,
|
||||
i6_n2p_phys_state => IPV6MIB,
|
||||
});
|
||||
return unless defined $phys_state;
|
||||
foreach my $row (keys %$phys_state) {
|
||||
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
|
||||
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
|
||||
if ($info::METHOD == IPV6MIB) {
|
||||
# IPV6-MIB doesn't include the addrtype in the index;
|
||||
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
|
||||
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
|
||||
$addrtype = 2;
|
||||
}
|
||||
if ($addrtype == 2) { # IPv6
|
||||
$return->{$row} = $phys_state->{$row};
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_index {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $ipv6_index = &_test_methods( $info, {
|
||||
ip_addr6_index => IPMIB,
|
||||
c_addr6_index => CISCO,
|
||||
});
|
||||
return unless defined $ipv6_index;
|
||||
foreach my $row (keys %$ipv6_index){
|
||||
if ($row =~ /^(\d+)\.([\d\.]+)$/) {
|
||||
my $addrtype = $1; my $v6addr = $2;
|
||||
if ($addrtype == 2) { # IPv6
|
||||
$return->{$row} = $ipv6_index->{$row};
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_type {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $ipv6_type = &_test_methods( $info, {
|
||||
ip_addr6_type => IPMIB,
|
||||
c_addr6_type => CISCO,
|
||||
});
|
||||
return unless defined $ipv6_type;
|
||||
foreach my $row (keys %$ipv6_type){
|
||||
if ($row =~ /^(\d+)\.([\d\.]+)$/) {
|
||||
my $addrtype = $1; my $v6addr = $2;
|
||||
if ($addrtype == 2) { # IPv6
|
||||
$return->{$row} = $ipv6_type->{$row};
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_pfx_origin {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $ipv6_pfx_origin = &_test_methods( $info, {
|
||||
ip_pfx_origin => IPMIB,
|
||||
c_pfx_origin => CISCO,
|
||||
});
|
||||
return unless defined $ipv6_pfx_origin;
|
||||
foreach my $row (keys %$ipv6_pfx_origin){
|
||||
if ($row =~ /^(\d+)\.(\d+)\.([\d\.]+)\.(\d+)$/) {
|
||||
my $ifindex = $1; my $type = $2; my $pfx = $3; my $len = $4;
|
||||
if ($type == 2) { # IPv6
|
||||
$return->{$row} = $ipv6_pfx_origin->{$row};
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_addr_prefix {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $ipv6_addr_prefix = &_test_methods( $info, {
|
||||
ip_addr6_pfx => IPMIB,
|
||||
c_addr6_pfx => CISCO,
|
||||
});
|
||||
return unless defined $ipv6_addr_prefix;
|
||||
foreach my $row (keys %$ipv6_addr_prefix){
|
||||
if ($row =~ /^(\d+)\.[\d\.]+$/) {
|
||||
my $type = $1;
|
||||
if ($type == 2) { # IPv6
|
||||
# Remove the OID part from the value
|
||||
my $val = $ipv6_addr_prefix->{$row};
|
||||
if ( $val =~ /^.+?((?:\d+\.){19}\d+)$/ ){
|
||||
$val = $1;
|
||||
$return->{$row} = $val;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub _method_used {
|
||||
my $info = shift;
|
||||
my $return = 'none of the MIBs';
|
||||
if (defined $info::METHOD) {
|
||||
if ($info::METHOD eq IPMIB) {
|
||||
$return = 'IP-MIB';
|
||||
} elsif ($info::METHOD eq IPV6MIB) {
|
||||
$return = 'IPV6-MIB';
|
||||
} elsif ($info::METHOD eq CISCO) {
|
||||
$return = 'CISCO-IETF-IP-MIB';
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub _test_methods {
|
||||
my $info = shift;
|
||||
my $test = shift;
|
||||
my $return = {};
|
||||
foreach my $method (sort {$test->{$a} <=> $test->{$b}} keys %$test) {
|
||||
$return = $info->$method || {};
|
||||
if (scalar keys %$return) {
|
||||
$info::METHOD = $test->{$method};
|
||||
last;
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub _my_sub_name {
|
||||
my @callinfo = caller(1);
|
||||
return $callinfo[3];
|
||||
}
|
||||
|
||||
sub munge_physaddr {
|
||||
my $addr = shift;
|
||||
return unless defined $addr;
|
||||
return unless length $addr;
|
||||
$addr = join( ':', map { sprintf "%02x", $_ } unpack( 'C*', $addr ) );
|
||||
return $addr;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::IPv6 - SNMP Interface for obtaining IPv6 addresses and IPv6
|
||||
address mappings
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Jeroen van Ingen and Carlos Vicente
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $info = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $info->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
The SNMP::Info::IPv6 class implements functions to for mapping IPv6 addresses
|
||||
to MAC addresses, interfaces and more. It will use data from the F<IP-MIB>,
|
||||
F<IPV6-MIB>, or the F<CISCO-IETF-IP-MIB>, whichever is supported by the
|
||||
device.
|
||||
|
||||
This class is inherited by Info::Layer3 to provide IPv6 node tracking across
|
||||
device classes.
|
||||
|
||||
For debugging purposes you can call this class directly as you would
|
||||
SNMP::Info
|
||||
|
||||
my $info = new SNMP::Info::IPv6 (...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
none.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<IP-MIB>
|
||||
=item F<IPV6-MIB>
|
||||
=item F<CISCO-IETF-IP-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
none.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Internet Address Table
|
||||
|
||||
=over
|
||||
|
||||
=item $info->ipv6_n2p_addr()
|
||||
|
||||
=item $info->ipv6_n2p_if()
|
||||
|
||||
=item $info->ipv6_n2p_mac()
|
||||
|
||||
=item $info->ipv6_n2p_state()
|
||||
|
||||
=item $info->ipv6_n2p_type()
|
||||
|
||||
=item $info->ipv6_index()
|
||||
|
||||
Maps an IPv6 address to an interface C<ifIndex>
|
||||
|
||||
=item $info->ipv6_type()
|
||||
|
||||
Maps an IPv6 address to its type (unicast, anycast, etc.)
|
||||
|
||||
=item $info->ipv6_pfx_origin()
|
||||
|
||||
Maps an IPv6 prefix with its origin (manual, well-known, dhcp, etc.)
|
||||
|
||||
=item $info->ipv6_addr_prefix()
|
||||
|
||||
Maps IPv6 addresses with their prefixes
|
||||
|
||||
=back
|
||||
|
||||
=head2 Internet Address Translation Table
|
||||
|
||||
=over
|
||||
|
||||
=item $info->c_inet_phys_address()
|
||||
|
||||
Maps an address of type C<cInetNetToMediaNetAddressType> on interface C<ifIndex> to a physical address.
|
||||
|
||||
=back
|
||||
|
||||
=head1 MUNGES
|
||||
|
||||
=over
|
||||
|
||||
=item munge_physaddr()
|
||||
|
||||
Takes an octet stream (HEX-STRING) and returns a colon separated ASCII hex
|
||||
string.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
533
Info/LLDP.pm
Normal file
533
Info/LLDP.pm
Normal file
@@ -0,0 +1,533 @@
|
||||
# SNMP::Info::LLDP
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::LLDP;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::LLDP::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::LLDP::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
'LLDP-MIB' => 'lldpLocSysCapEnabled',
|
||||
'LLDP-EXT-DOT1-MIB' => 'lldpXdot1MIB',
|
||||
'LLDP-EXT-DOT3-MIB' => 'lldpXdot3MIB',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
'lldp_sysname' => 'lldpLocSysName',
|
||||
'lldp_sysdesc' => 'lldpLocSysDesc',
|
||||
'lldp_sys_cap' => 'lldpLocSysCapEnabled',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# LLDP-MIB::lldpLocManAddrTable
|
||||
'lldp_lman_addr' => 'lldpLocManAddrIfId',
|
||||
|
||||
# LLDP-MIB::lldpRemTable
|
||||
'lldp_rem_id_type' => 'lldpRemChassisIdSubtype',
|
||||
'lldp_rem_id' => 'lldpRemChassisId',
|
||||
'lldp_rem_pid_type' => 'lldpRemPortIdSubtype',
|
||||
'lldp_rem_pid' => 'lldpRemPortId',
|
||||
'lldp_rem_desc' => 'lldpRemPortDesc',
|
||||
'lldp_rem_sysname' => 'lldpRemSysName',
|
||||
'lldp_rem_sysdesc' => 'lldpRemSysDesc',
|
||||
'lldp_rem_sys_cap' => 'lldpRemSysCapEnabled',
|
||||
|
||||
# LLDP-MIB::lldpRemManAddrTable
|
||||
'lldp_rman_addr' => 'lldpRemManAddrIfSubtype',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'lldp_sysdesc' => \&SNMP::Info::munge_null,
|
||||
'lldp_sysname' => \&SNMP::Info::munge_null,
|
||||
'lldp_rem_sysname' => \&SNMP::Info::munge_null,
|
||||
'lldp_rem_sysdesc' => \&SNMP::Info::munge_null,
|
||||
'lldp_rem_port_desc' => \&SNMP::Info::munge_null,
|
||||
'lldp_sys_cap' => \&SNMP::Info::munge_bits,
|
||||
'lldp_rem_sys_cap' => \&SNMP::Info::munge_bits,
|
||||
);
|
||||
|
||||
sub hasLLDP {
|
||||
my $lldp = shift;
|
||||
|
||||
# We may be have LLDP, but nothing in lldpRemoteSystemsData Tables
|
||||
# so we could be running LLDP but not return any useful information
|
||||
my $lldp_cap = $lldp->lldp_sys_cap();
|
||||
|
||||
return 1 if defined $lldp_cap;
|
||||
return;
|
||||
}
|
||||
|
||||
sub lldp_if {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $addr = $lldp->lldp_rem_pid($partial) || {};
|
||||
my $i_descr = $lldp->i_description() || {};
|
||||
my $i_alias = $lldp->i_alias() || {};
|
||||
my %r_i_descr = reverse %$i_descr;
|
||||
my %r_i_alias = reverse %$i_alias;
|
||||
|
||||
my %lldp_if;
|
||||
foreach my $key ( keys %$addr ) {
|
||||
my @aOID = split( '\.', $key );
|
||||
my $port = $aOID[1];
|
||||
next unless $port;
|
||||
# Local LLDP port may not equate to ifIndex, see LldpPortNumber TEXTUAL-CONVENTION in LLDP-MIB.
|
||||
# Cross reference lldpLocPortDesc with ifDescr and ifAlias to get ifIndex,
|
||||
# prefer ifDescr over ifAlias because using cross ref with description is correct behavior
|
||||
# according to the LLDP-MIB. Some devices (eg H3C gear) seem to use ifAlias though.
|
||||
my $lldp_desc = $lldp->lldpLocPortDesc($port);
|
||||
my $desc = $lldp_desc->{$port};
|
||||
# If cross reference is successful use it, otherwise stick with lldpRemLocalPortNum
|
||||
if ( exists $r_i_descr{$desc} ) {
|
||||
$port = $r_i_descr{$desc};
|
||||
} elsif ( exists $r_i_alias{$desc} ) {
|
||||
$port = $r_i_alias{$desc};
|
||||
}
|
||||
|
||||
$lldp_if{$key} = $port;
|
||||
}
|
||||
return \%lldp_if;
|
||||
}
|
||||
|
||||
sub lldp_ip {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $rman_addr = $lldp->lldp_rman_addr($partial) || {};
|
||||
|
||||
my %lldp_ip;
|
||||
foreach my $key ( keys %$rman_addr ) {
|
||||
my ( $index, $proto, $addr ) = _lldp_addr_index($key);
|
||||
next unless defined $index;
|
||||
next unless $proto == 1;
|
||||
$lldp_ip{$index} = $addr;
|
||||
}
|
||||
return \%lldp_ip;
|
||||
}
|
||||
|
||||
sub lldp_addr {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $rman_addr = $lldp->lldp_rman_addr($partial) || {};
|
||||
|
||||
my %lldp_ip;
|
||||
foreach my $key ( keys %$rman_addr ) {
|
||||
my ( $index, $proto, $addr ) = _lldp_addr_index($key);
|
||||
next unless defined $index;
|
||||
$lldp_ip{$index} = $addr;
|
||||
}
|
||||
return \%lldp_ip;
|
||||
}
|
||||
|
||||
sub lldp_port {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $pdesc = $lldp->lldp_rem_desc($partial) || {};
|
||||
my $pid = $lldp->lldp_rem_pid($partial) || {};
|
||||
my $ptype = $lldp->lldp_rem_pid_type($partial) || {};
|
||||
|
||||
my %lldp_port;
|
||||
foreach my $key ( sort keys %$pid ) {
|
||||
my $port = $pdesc->{$key};
|
||||
unless ($port) {
|
||||
$port = $pid->{$key};
|
||||
next unless $port;
|
||||
my $type = $ptype->{$key};
|
||||
next unless $type;
|
||||
|
||||
# May need to format other types in the future, i.e. Network address
|
||||
if ( $type =~ /mac/ ) {
|
||||
$port = join( ':',
|
||||
map { sprintf "%02x", $_ } unpack( 'C*', $port ) );
|
||||
}
|
||||
}
|
||||
|
||||
# Avaya/Nortel lldpRemPortDesc doesn't match ifDescr, but we can still
|
||||
# figure out slot.port based upon lldpRemPortDesc
|
||||
if ( $port =~ /^(Unit\s+(\d+)\s+)?Port\s+(\d+)$/ ) {
|
||||
$port = defined $1 ? "$2.$3" : "$3";
|
||||
}
|
||||
|
||||
$lldp_port{$key} = $port;
|
||||
}
|
||||
return \%lldp_port;
|
||||
}
|
||||
|
||||
sub lldp_id {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ch_type = $lldp->lldp_rem_id_type($partial) || {};
|
||||
my $ch = $lldp->lldp_rem_id($partial) || {};
|
||||
|
||||
my %lldp_id;
|
||||
foreach my $key ( keys %$ch ) {
|
||||
my $id = $ch->{$key};
|
||||
next unless $id;
|
||||
my $type = $ch_type->{$key};
|
||||
next unless $type;
|
||||
|
||||
# May need to format other types in the future
|
||||
if ( $type =~ /mac/ ) {
|
||||
$id = join( ':', map { sprintf "%02x", $_ } unpack( 'C*', $id ) );
|
||||
}
|
||||
elsif ($type eq 'networkAddress') {
|
||||
if ( length(unpack('H*', $id)) == 10 ) {
|
||||
# IP address (first octet is sign, I guess)
|
||||
my @octets = (map { sprintf "%02x",$_ } unpack('C*', $id))[1..4];
|
||||
$id = join '.', map { hex($_) } @octets;
|
||||
}
|
||||
}
|
||||
$lldp_id{$key} = $id;
|
||||
}
|
||||
return \%lldp_id;
|
||||
}
|
||||
|
||||
#sub root_ip {
|
||||
# my $lldp = shift;
|
||||
#
|
||||
# my $man_addr = $lldp->lldp_lman_addr() || {};
|
||||
#
|
||||
# foreach my $key (keys %$man_addr) {
|
||||
# my @oids = split(/\./, $key);
|
||||
# my $proto = shift(@oids);
|
||||
# my $length = shift(@oids);
|
||||
# # IPv4
|
||||
# if ($proto == 1) {
|
||||
# my $addr = join('.',@oids);
|
||||
# return $addr if (defined $addr and $lldp->snmp_connect_ip($addr));
|
||||
# }
|
||||
# }
|
||||
# return;
|
||||
#}
|
||||
|
||||
# Break up the lldpRemManAddrTable INDEX into common index, protocol,
|
||||
# and address.
|
||||
sub _lldp_addr_index {
|
||||
my $idx = shift;
|
||||
my @oids = split( /\./, $idx );
|
||||
my $index = join( '.', splice( @oids, 0, 3 ) );
|
||||
my $proto = shift(@oids);
|
||||
my $length = shift(@oids);
|
||||
|
||||
# IPv4
|
||||
if ( $proto == 1 ) {
|
||||
return ( $index, $proto, join( '.', @oids ) );
|
||||
}
|
||||
|
||||
# MAC
|
||||
elsif ( $proto == 6 ) {
|
||||
return ( $index, $proto,
|
||||
join( ':', map { sprintf "%02x", $_ } @oids ) );
|
||||
}
|
||||
|
||||
# TODO - Need to handle other protocols, i.e. IPv6
|
||||
else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::LLDP - SNMP Interface to the Link Layer Discovery Protocol (LLDP)
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $lldp = new SNMP::Info (
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'router',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
);
|
||||
|
||||
my $class = $lldp->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
$haslldp = $lldp->hasLLDP() ? 'yes' : 'no';
|
||||
|
||||
# Print out a map of device ports with LLDP neighbors:
|
||||
my $interfaces = $lldp->interfaces();
|
||||
my $lldp_if = $lldp->lldp_if();
|
||||
my $lldp_ip = $lldp->lldp_ip();
|
||||
my $lldp_port = $lldp->lldp_port();
|
||||
|
||||
foreach my $lldp_key (keys %$lldp_ip){
|
||||
my $iid = $lldp_if->{$lldp_key};
|
||||
my $port = $interfaces->{$iid};
|
||||
my $neighbor = $lldp_ip->{$lldp_key};
|
||||
my $neighbor_port = $lldp_port->{$lldp_key};
|
||||
print "Port : $port connected to $neighbor / $neighbor_port\n";
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::LLDP is a subclass of SNMP::Info that provides an object oriented
|
||||
interface to LLDP information through SNMP.
|
||||
|
||||
LLDP is a Layer 2 protocol that allows a network device to advertise its
|
||||
identity and capabilities on the local network providing topology information.
|
||||
The protocol is defined in the IEEE standard 802.1AB.
|
||||
|
||||
Create or use a device subclass that inherits this class. Do not use
|
||||
directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<LLDP-MIB>
|
||||
|
||||
=item F<LLDP-EXT-DOT1-MIB>
|
||||
|
||||
=item F<LLDP-EXT-DOT3-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBAL METHODS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $lldp->hasLLDP()
|
||||
|
||||
Is LLDP is active in this device?
|
||||
|
||||
Note: LLDP may be active, but nothing in C<lldpRemoteSystemsData> Tables so
|
||||
the device would not return any useful topology information.
|
||||
|
||||
=item $lldp->lldp_sysname()
|
||||
|
||||
The string value used to identify the system name of the local system. If the
|
||||
local agent supports IETF RFC 3418, C<lldpLocSysName> object should have the
|
||||
same value of C<sysName> object.
|
||||
|
||||
Nulls are removed before the value is returned.
|
||||
|
||||
(C<lldpLocSysName>)
|
||||
|
||||
=item $lldp->lldp_sysdesc()
|
||||
|
||||
The string value used to identify the system description of the local system.
|
||||
If the local agent supports IETF RFC 3418, C<lldpLocSysDesc> object should
|
||||
have the same value of C<sysDesc> object.
|
||||
|
||||
Nulls are removed before the value is returned.
|
||||
|
||||
(C<lldpLocSysDesc>)
|
||||
|
||||
=item $lldp->lldp_sys_cap()
|
||||
|
||||
Returns which system capabilities are enabled on the local system. Results
|
||||
are munged into an ascii binary string, LSB. Each digit represents a bit
|
||||
from the table below:
|
||||
|
||||
=over
|
||||
|
||||
=item Bit 'other(0)' indicates that the system has capabilities other than
|
||||
those listed below.
|
||||
|
||||
=item Bit 'repeater(1)' indicates that the system has repeater capability.
|
||||
|
||||
=item Bit 'bridge(2)' indicates that the system has bridge capability.
|
||||
|
||||
=item Bit 'wlanAccessPoint(3)' indicates that the system has WLAN access
|
||||
point capability.
|
||||
|
||||
=item Bit 'router(4)' indicates that the system has router capability.
|
||||
|
||||
=item Bit 'telephone(5)' indicates that the system has telephone capability.
|
||||
|
||||
=item Bit 'docsisCableDevice(6)' indicates that the system has DOCSIS Cable
|
||||
Device capability (IETF RFC 2669 & 2670).
|
||||
|
||||
=item Bit 'stationOnly(7)' indicates that the system has only station
|
||||
capability and nothing else."
|
||||
|
||||
=back
|
||||
|
||||
(C<lldpLocSysCapEnabled>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $lldp->lldp_id()
|
||||
|
||||
Returns the string value used to identify the chassis component associated
|
||||
with the remote system.
|
||||
|
||||
(C<lldpRemChassisId>)
|
||||
|
||||
=item $lldp->lldp_if()
|
||||
|
||||
Returns the mapping to the SNMP Interface Table. Tries to cross reference
|
||||
(C<lldpLocPortDesc>) with (C<ifDescr>) and (C<ifAlias>) to get (C<ifIndex>),
|
||||
if unable defaults to (C<lldpRemLocalPortNum>).
|
||||
|
||||
=item $lldp->lldp_ip()
|
||||
|
||||
Returns remote IPv4 address. Returns for all other address types, use
|
||||
lldp_addr if you want any return address type.
|
||||
|
||||
=item $lldp->lldp_addr()
|
||||
|
||||
Returns remote address. Type may be any IANA Address Family Number.
|
||||
Currently only returns IPv4 or MAC addresses.
|
||||
|
||||
=item $lldp->lldp_port()
|
||||
|
||||
Returns remote port ID
|
||||
|
||||
=back
|
||||
|
||||
=head2 LLDP Remote Table (C<lldpRemTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $lldp->lldp_rem_id_type()
|
||||
|
||||
Returns the type of encoding used to identify the chassis associated with
|
||||
the remote system.
|
||||
|
||||
(C<lldpRemChassisIdSubtype>)
|
||||
|
||||
=item $lldp->lldp_rem_id()
|
||||
|
||||
Returns the string value used to identify the chassis component associated
|
||||
with the remote system.
|
||||
|
||||
(C<lldpRemChassisId>)
|
||||
|
||||
=item $lldp->lldp_rem_pid_type()
|
||||
|
||||
Returns the type of port identifier encoding used in the associated
|
||||
C<lldpRemPortId> object.
|
||||
|
||||
(C<lldpRemPortIdSubtype>)
|
||||
|
||||
=item $lldp->lldp_rem_pid()
|
||||
|
||||
Returns the string value used to identify the port component associated with
|
||||
the remote system.
|
||||
|
||||
(C<lldpRemPortId>)
|
||||
|
||||
=item $lldp->lldp_rem_desc()
|
||||
|
||||
Returns the string value used to identify the description of the given port
|
||||
associated with the remote system.
|
||||
|
||||
Nulls are removed before the value is returned.
|
||||
|
||||
(C<lldpRemPortDesc>)
|
||||
|
||||
=item $lldp->lldp_rem_sysname()
|
||||
|
||||
Returns the string value used to identify the system name of the remote
|
||||
system.
|
||||
|
||||
Nulls are removed before the value is returned.
|
||||
|
||||
(C<lldpRemSysName>)
|
||||
|
||||
=item $lldp->lldp_rem_sysdesc()
|
||||
|
||||
Returns the string value used to identify the system description of the
|
||||
remote system.
|
||||
|
||||
Nulls are removed before the value is returned.
|
||||
|
||||
(C<lldpRemSysDesc>)
|
||||
|
||||
=item $lldp->lldp_rem_sys_cap()
|
||||
|
||||
Returns which system capabilities are enabled on the local system. Results
|
||||
are munged into an ascii binary string, LSB. Each digit
|
||||
represents a bit from the table below:
|
||||
|
||||
=over
|
||||
|
||||
=item Bit 'other(0)' indicates that the system has capabilities other than
|
||||
those listed below.
|
||||
|
||||
=item Bit 'repeater(1)' indicates that the system has repeater capability.
|
||||
|
||||
=item Bit 'bridge(2)' indicates that the system has bridge capability.
|
||||
|
||||
=item Bit 'wlanAccessPoint(3)' indicates that the system has WLAN access
|
||||
point capability.
|
||||
|
||||
=item Bit 'router(4)' indicates that the system has router capability.
|
||||
|
||||
=item Bit 'telephone(5)' indicates that the system has telephone capability.
|
||||
|
||||
=item Bit 'docsisCableDevice(6)' indicates that the system has DOCSIS Cable
|
||||
Device capability (IETF RFC 2669 & 2670).
|
||||
|
||||
=item Bit 'stationOnly(7)' indicates that the system has only station
|
||||
capability and nothing else."
|
||||
|
||||
=back
|
||||
|
||||
(C<lldpRemSysCapEnabled>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
236
Info/Layer1.pm
236
Info/Layer1.pm
@@ -1,79 +1,73 @@
|
||||
# SNMP::Info::Layer1 - SNMP Interface to Layer1 Devices
|
||||
# Max Baker <max@warped.org>
|
||||
# SNMP::Info::Layer1 - SNMP Interface to Layer1 Devices
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer1;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE $INIT/;
|
||||
|
||||
@SNMP::Info::Layer1::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::Layer1::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::Layer1::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
|
||||
|
||||
# See SNMP::Info for the details of these data structures and
|
||||
# the interworkings.
|
||||
$INIT = 0;
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = ( %SNMP::Info::MIBS,
|
||||
'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex'
|
||||
);
|
||||
%MIBS = ( %SNMP::Info::MIBS, 'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex' );
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::GLOBALS,
|
||||
'ports_managed' => 'ifNumber',
|
||||
'rptr_slots' => 'rptrGroupCapacity',
|
||||
'slots' => 'rptrGroupCapacity'
|
||||
);
|
||||
%SNMP::Info::GLOBALS,
|
||||
'ports_managed' => 'ifNumber',
|
||||
'rptr_slots' => 'rptrGroupCapacity',
|
||||
'slots' => 'rptrGroupCapacity'
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
'i_up2' => 'ifOperStatus',
|
||||
'i_up_admin2' => 'ifAdminStatus',
|
||||
'rptr_ports' => 'rptrGroupPortCapacity',
|
||||
'rptr_port' => 'rptrPortIndex',
|
||||
'rptr_slot' => 'rptrPortGroupIndex',
|
||||
'rptr_up_admin' => 'rptrPortAdminStatus',
|
||||
'rptr_up' => 'rptrPortOperStatus',
|
||||
);
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
'rptr_ports' => 'rptrGroupPortCapacity',
|
||||
'rptr_port' => 'rptrPortIndex',
|
||||
'rptr_slot' => 'rptrPortGroupIndex',
|
||||
'rptr_up_admin' => 'rptrPortAdminStatus',
|
||||
'rptr_up' => 'rptrPortOperStatus',
|
||||
'rptr_last_src' => 'rptrAddrTrackNewLastSrcAddress',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
);
|
||||
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
'rptr_last_src' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
# Method OverRides
|
||||
|
||||
@@ -81,23 +75,23 @@ $INIT = 0;
|
||||
sub ports {
|
||||
my $l1 = shift;
|
||||
|
||||
my $ports = $l1->ports_managed();
|
||||
my $rptr_ports = $l1->rptr_ports();
|
||||
my $ports = $l1->ports_managed();
|
||||
my $rptr_ports = $l1->rptr_ports();
|
||||
|
||||
foreach my $group (keys %$rptr_ports){
|
||||
$ports += $rptr_ports->{$group};
|
||||
foreach my $group ( keys %$rptr_ports ) {
|
||||
$ports += $rptr_ports->{$group};
|
||||
}
|
||||
|
||||
return $ports;
|
||||
}
|
||||
|
||||
# $l1->model() - Looks at sysObjectID which gives the oid of the system
|
||||
# name, contained in a propriatry MIB.
|
||||
# name, contained in a propriatry MIB.
|
||||
sub model {
|
||||
my $l1 = shift;
|
||||
my $id = $l1->id();
|
||||
my $l1 = shift;
|
||||
my $id = $l1->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
|
||||
# HP
|
||||
$model =~ s/^hpswitch//i;
|
||||
|
||||
@@ -108,66 +102,73 @@ sub model {
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
my $l1 = shift;
|
||||
my $l1 = shift;
|
||||
my $descr = $l1->description();
|
||||
|
||||
return 'hp' if ($descr =~ /hp/i);
|
||||
return 'cisco' if ($descr =~ /(catalyst|cisco|ios)/i);
|
||||
return 'allied' if ($descr =~ /allied/i);
|
||||
return 'asante' if ($descr =~ /asante/i);
|
||||
return 'hp' if ( $descr =~ /hp/i );
|
||||
return 'cisco' if ( $descr =~ /(catalyst|cisco|ios)/i );
|
||||
return 'allied' if ( $descr =~ /allied/i );
|
||||
return 'asante' if ( $descr =~ /asante/i );
|
||||
|
||||
return 'unknown';
|
||||
|
||||
}
|
||||
|
||||
# By Default we'll use the description field
|
||||
sub interfaces {
|
||||
my $l1 = shift;
|
||||
my $interfaces = $l1->i_index();
|
||||
my $rptr_port = $l1->rptr_port();
|
||||
my $l1 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
foreach my $port (keys %$rptr_port){
|
||||
my $interfaces = $l1->i_index($partial) || {};
|
||||
my $rptr_port = $l1->rptr_port($partial) || {};
|
||||
|
||||
foreach my $port ( keys %$rptr_port ) {
|
||||
$interfaces->{$port} = $port;
|
||||
}
|
||||
return $interfaces;
|
||||
}
|
||||
|
||||
sub i_up_admin {
|
||||
my $l1 = shift;
|
||||
my $l1 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_up_admin = $l1->i_up_admin2();
|
||||
my $rptr_up_admin = $l1->rptr_up_admin();
|
||||
my $i_up_admin = $l1->SUPER::i_up_admin($partial) || {};
|
||||
my $rptr_up_admin = $l1->rptr_up_admin($partial) || {};
|
||||
|
||||
foreach my $key (keys %$rptr_up_admin){
|
||||
foreach my $key ( keys %$rptr_up_admin ) {
|
||||
my $up = $rptr_up_admin->{$key};
|
||||
$i_up_admin->{$key} = 'up' if $up =~ /enabled/;
|
||||
$i_up_admin->{$key} = 'down' if $up =~ /disabled/;
|
||||
$i_up_admin->{$key} = 'up' if $up =~ /enabled/;
|
||||
$i_up_admin->{$key} = 'down' if $up =~ /disabled/;
|
||||
}
|
||||
|
||||
return $i_up_admin;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $l1 = shift;
|
||||
my $i_up = $l1->i_up2();
|
||||
my $rptr_up = $l1->rptr_up();
|
||||
my $l1 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
foreach my $key (keys %$rptr_up){
|
||||
my $i_up = $l1->SUPER::i_up($partial) || {};
|
||||
my $rptr_up = $l1->rptr_up($partial) || {};
|
||||
|
||||
foreach my $key ( keys %$rptr_up ) {
|
||||
my $up = $rptr_up->{$key};
|
||||
$i_up->{$key} = 'up' if $up =~ /operational/;
|
||||
$i_up->{$key} = 'up' if $up =~ /operational/;
|
||||
}
|
||||
|
||||
return $i_up;
|
||||
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer1 - Perl5 Interface to network devices serving Layer1 only.
|
||||
SNMP::Info::Layer1 - SNMP Interface to network devices serving Layer1 only.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -175,14 +176,13 @@ Max Baker (C<max@warped.org>)
|
||||
my $l1 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $l1->class();
|
||||
my $class = $l1->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
# Let's get some basic Port information
|
||||
@@ -199,14 +199,15 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This class is usually used as a superclass for more specific device classes listed under
|
||||
SNMP::Info::Layer1::* Please read all docs under SNMP::Info first.
|
||||
This class is usually used as a superclass for more specific device classes
|
||||
listed under SNMP::Info::Layer1::* Please read all docs under SNMP::Info
|
||||
first.
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Layer1 device through SNMP. Information is stored in a number of MIBs.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $l1 = new SNMP::Info::Layer1(...);
|
||||
|
||||
@@ -222,15 +223,16 @@ a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP-REPEATER-MIB
|
||||
|
||||
=item Inherited Classes
|
||||
|
||||
MIBs required for SNMP::Info
|
||||
=item F<SNMP-REPEATER-MIB>
|
||||
|
||||
=back
|
||||
|
||||
SNMP-REPEATER-MIB needs to be extracted from ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz
|
||||
MIBs required for L<SNMP::Info/"Required MIBs">
|
||||
|
||||
See L<SNMP::Info/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
F<SNMP-REPEATER-MIB> needs to be extracted from
|
||||
ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
@@ -242,7 +244,7 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
Gets the number of ports under the interface mib
|
||||
|
||||
(B<ifNumber>)
|
||||
(C<ifNumber>)
|
||||
|
||||
=back
|
||||
|
||||
@@ -250,9 +252,17 @@ Gets the number of ports under the interface mib
|
||||
|
||||
=over
|
||||
|
||||
=item $l1->model()
|
||||
|
||||
Cross references $l1->id() with product IDs.
|
||||
|
||||
For HP devices, removes C<'hpswitch'> from the name
|
||||
|
||||
For Cisco devices, removes C<'sysid'> from the name
|
||||
|
||||
=item $l1->vendor()
|
||||
|
||||
Trys to discover the vendor from $l1->model() and $l1->vendor()
|
||||
Tries to discover the vendor from $l1->model() and $l1->vendor()
|
||||
|
||||
=item $l1->ports()
|
||||
|
||||
@@ -262,15 +272,15 @@ Adds the values from rptr_ports() and ports_managed()
|
||||
|
||||
Number of 'groups' in the Repeater MIB
|
||||
|
||||
(B<rptrGroupCapacity>)
|
||||
(C<rptrGroupCapacity>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info
|
||||
=head2 Global Methods imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See documentation in L<SNMP::Info/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
@@ -281,10 +291,16 @@ to a hash.
|
||||
|
||||
=item $l1->interfaces()
|
||||
|
||||
Returns reference to the map between IID and physical Port.
|
||||
|
||||
=item $l1->i_up()
|
||||
|
||||
Returns reference to map of IIDs to link status.
|
||||
|
||||
=item $l1->i_up_admin()
|
||||
|
||||
Returns reference to map of IIDs to administrative link status.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Repeater MIB
|
||||
@@ -295,32 +311,36 @@ to a hash.
|
||||
|
||||
Number of ports in each group.
|
||||
|
||||
(B<rptrGroupPortCapacity>)
|
||||
(C<rptrGroupPortCapacity>)
|
||||
|
||||
=item $l1->rptr_port()
|
||||
|
||||
Port number in Group
|
||||
|
||||
(B<rptrPortIndex>)
|
||||
(C<rptrPortIndex>)
|
||||
|
||||
=item $l1->rptr_slot()
|
||||
|
||||
Group (slot) Number for given port.
|
||||
|
||||
(B<rptrPortGroupIndex>)
|
||||
(C<rptrPortGroupIndex>)
|
||||
|
||||
=item $l1->rptr_up_admin()
|
||||
|
||||
(B<rptrPortAdminStatus>)
|
||||
(C<rptrPortAdminStatus>)
|
||||
|
||||
=item $l1->rptr_up()
|
||||
|
||||
(B<rptrPortOperStatus>)
|
||||
(C<rptrPortOperStatus>)
|
||||
|
||||
=item $l1->rptr_last_src()
|
||||
|
||||
(C<rptrAddrTrackNewLastSrcAddress>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,64 +1,60 @@
|
||||
# SNMP::Info::Layer1::Allied
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer1::Allied;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
use strict;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer1;
|
||||
|
||||
@SNMP::Info::Layer1::Allied::ISA = qw/SNMP::Info::Layer1 Exporter/;
|
||||
@SNMP::Info::Layer1::Allied::ISA = qw/SNMP::Info::Layer1 Exporter/;
|
||||
@SNMP::Info::Layer1::Allied::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer1::GLOBALS,
|
||||
'root_ip' => 'actualIPAddr',
|
||||
);
|
||||
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, 'root_ip' => 'actualIPAddr', );
|
||||
|
||||
%FUNCS = (%SNMP::Info::Layer1::FUNCS,
|
||||
'i_name2' => 'ifName',
|
||||
'ati_p_name' => 'portName',
|
||||
'ati_up' => 'linkTestLED',
|
||||
);
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer1::FUNCS,
|
||||
'ati_p_name' => 'portName',
|
||||
'ati_up' => 'linkTestLED',
|
||||
);
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer1::MIBS,
|
||||
'ATI-MIB' => 'atiPortGroupIndex'
|
||||
);
|
||||
%MIBS = ( %SNMP::Info::Layer1::MIBS, 'ATI-MIB' => 'atiPortGroupIndex' );
|
||||
|
||||
%MUNGE = (%SNMP::Info::Layer1::MUNGE,
|
||||
);
|
||||
%MUNGE = ( %SNMP::Info::Layer1::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'allied';
|
||||
@@ -70,9 +66,9 @@ sub os {
|
||||
|
||||
sub os_ver {
|
||||
my $allied = shift;
|
||||
my $descr = $allied->description();
|
||||
|
||||
if ($descr =~ m/version (\d+\.\d+)/){
|
||||
my $descr = $allied->description();
|
||||
|
||||
if ( $descr =~ m/version (\d+\.\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
@@ -82,39 +78,40 @@ sub model {
|
||||
|
||||
my $desc = $allied->description();
|
||||
|
||||
if ($desc =~ /(AT-\d{4}\S{1}?)/){
|
||||
if ( $desc =~ /(AT-\d{4}\S{1}?)/ ) {
|
||||
return $1;
|
||||
}
|
||||
return undef;
|
||||
return;
|
||||
}
|
||||
|
||||
sub i_name{
|
||||
my $allied = shift;
|
||||
sub i_name {
|
||||
my $allied = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_name = $allied->i_name2();
|
||||
my $i_name = $allied->orig_i_name($partial) || {};
|
||||
my $ati_p_name = $allied->ati_p_name($partial) || {};
|
||||
|
||||
my $ati_p_name = $allied->ati_p_name();
|
||||
|
||||
foreach my $port (keys %$ati_p_name){
|
||||
foreach my $port ( keys %$ati_p_name ) {
|
||||
my $name = $ati_p_name->{$port};
|
||||
$i_name->{$port} = $name if (defined $name and $name !~ /^\s*$/);
|
||||
$i_name->{$port} = $name if ( defined $name and $name !~ /^\s*$/ );
|
||||
}
|
||||
|
||||
|
||||
return $i_name;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $allied = shift;
|
||||
my $allied = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_up = SNMP::Info::Layer1::i_up($allied);
|
||||
my $ati_up = $allied->ati_up();
|
||||
my $i_up = SNMP::Info::Layer1::i_up( $allied, $partial );
|
||||
my $ati_up = $allied->ati_up($partial) || {};
|
||||
|
||||
foreach my $port (keys %$ati_up){
|
||||
foreach my $port ( keys %$ati_up ) {
|
||||
my $up = $ati_up->{$port};
|
||||
$i_up->{$port} = 'down' if $up eq 'linktesterror';
|
||||
$i_up->{$port} = 'up' if $up eq 'nolinktesterror';
|
||||
$i_up->{$port} = 'up' if $up eq 'nolinktesterror';
|
||||
}
|
||||
|
||||
|
||||
return $i_up;
|
||||
}
|
||||
1;
|
||||
@@ -126,7 +123,7 @@ SNMP::Info::Layer1::Allied - SNMP Interface to old Allied Hubs
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -134,14 +131,13 @@ Max Baker (C<max@warped.org>)
|
||||
my $allied = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myhub',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $l1->class();
|
||||
my $class = $allied->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
@@ -162,16 +158,14 @@ inherited methods.
|
||||
|
||||
=over
|
||||
|
||||
=item ATI-MIB
|
||||
|
||||
Download for your device from http://www.allied-telesyn.com/allied/support/
|
||||
|
||||
=item Inherited Classes
|
||||
|
||||
MIBs listed in SNMP::Info::Layer1 and its inherited classes.
|
||||
=item F<ATI-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::Layer1/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
@@ -196,19 +190,19 @@ Culls Version from description()
|
||||
|
||||
Returns IP Address of Managed Hub.
|
||||
|
||||
(B<actualIpAddr>)
|
||||
(C<actualIpAddr>)
|
||||
|
||||
=item $allied->model()
|
||||
|
||||
Trys to cull out AT-nnnnX out of the description field.
|
||||
Tries to cull out C<AT-nnnnX> out of the description field.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer1
|
||||
|
||||
See documentation in SNMP::Info::Layer1 for details.
|
||||
See L<SNMP::Info::Layer1/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
@@ -231,16 +225,16 @@ the values of ati_up() to 'up' and 'down'.
|
||||
|
||||
=item $allied->ati_p_name()
|
||||
|
||||
(B<portName>)
|
||||
(C<portName>)
|
||||
|
||||
=item $allied->ati_up()
|
||||
|
||||
(B<linkTestLED>)
|
||||
(C<linkTestLED>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer1
|
||||
|
||||
See documentation in SNMP::Info::Layer1 for details.
|
||||
See L<SNMP::Info::Layer1/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,79 +1,72 @@
|
||||
# SNMP::Info::Layer1::Asante
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer1::Asante;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
use strict;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer1;
|
||||
|
||||
@SNMP::Info::Layer1::Asante::ISA = qw/SNMP::Info::Layer1 Exporter/;
|
||||
@SNMP::Info::Layer1::Asante::ISA = qw/SNMP::Info::Layer1 Exporter/;
|
||||
@SNMP::Info::Layer1::Asante::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer1::GLOBALS,
|
||||
);
|
||||
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, );
|
||||
|
||||
%FUNCS = (%SNMP::Info::Layer1::FUNCS,
|
||||
'i_speed2' => 'ifSpeed',
|
||||
'i_mac2' => 'ifPhysAddress',
|
||||
'i_descr2' => 'ifDescr',
|
||||
'i_name2' => 'ifName',
|
||||
'asante_port' => 'ePortIndex',
|
||||
'asante_group' => 'ePortGrpIndex',
|
||||
'i_type' => 'ePortStateType',
|
||||
'asante_up' => 'ePortStateLinkStatus',
|
||||
);
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer1::FUNCS,
|
||||
'asante_port' => 'ePortIndex',
|
||||
'asante_group' => 'ePortGrpIndex',
|
||||
'i_type' => 'ePortStateType',
|
||||
'asante_up' => 'ePortStateLinkStatus',
|
||||
);
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer1::MIBS,
|
||||
'ASANTE-HUB1012-MIB' => 'asante'
|
||||
);
|
||||
%MIBS = ( %SNMP::Info::Layer1::MIBS, 'ASANTE-HUB1012-MIB' => 'asante' );
|
||||
|
||||
%MUNGE = (%SNMP::Info::Layer1::MUNGE,
|
||||
'i_mac2' => \&SNMP::Info::munge_mac,
|
||||
'i_speed2' => \&SNMP::Info::munge_speed,
|
||||
);
|
||||
%MUNGE = ( %SNMP::Info::Layer1::MUNGE, );
|
||||
|
||||
sub interfaces {
|
||||
my $asante = shift;
|
||||
my $asante = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $rptr_port = $asante->rptr_port();
|
||||
my $rptr_port = $asante->rptr_port($partial) || {};
|
||||
|
||||
my %interfaces;
|
||||
|
||||
foreach my $port (keys %$rptr_port){
|
||||
foreach my $port ( keys %$rptr_port ) {
|
||||
$interfaces{$port} = $port;
|
||||
}
|
||||
|
||||
@@ -86,13 +79,13 @@ sub os {
|
||||
|
||||
sub os_ver {
|
||||
my $asante = shift;
|
||||
my $descr = $asante->description();
|
||||
|
||||
if ($descr =~ /software v(\d+\.\d+)/){
|
||||
my $descr = $asante->description();
|
||||
|
||||
if ( $descr =~ /software v(\d+\.\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
sub vendor {
|
||||
return 'asante';
|
||||
}
|
||||
@@ -100,31 +93,33 @@ sub vendor {
|
||||
sub model {
|
||||
my $asante = shift;
|
||||
|
||||
my $id = $asante->id();
|
||||
my $id = $asante->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $asante = shift;
|
||||
my $asante = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $asante_up = $asante->asante_up();
|
||||
my $asante_up = $asante->asante_up($partial) || {};
|
||||
|
||||
my $i_up = {};
|
||||
foreach my $port (keys %$asante_up){
|
||||
foreach my $port ( keys %$asante_up ) {
|
||||
my $up = $asante_up->{$port};
|
||||
$i_up->{$port} = 'down' if $up =~ /on/;
|
||||
$i_up->{$port} = 'up' if $up =~ /off/;
|
||||
$i_up->{$port} = 'up' if $up =~ /off/;
|
||||
}
|
||||
|
||||
|
||||
return $i_up;
|
||||
}
|
||||
|
||||
sub i_speed {
|
||||
my $asante = shift;
|
||||
my $asante = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_speed = $asante->i_speed2();
|
||||
my $i_speed = $asante->orig_i_speed($partial) || {};
|
||||
|
||||
my %i_speed;
|
||||
|
||||
@@ -134,9 +129,10 @@ sub i_speed {
|
||||
}
|
||||
|
||||
sub i_mac {
|
||||
my $asante = shift;
|
||||
my $asante = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_mac = $asante->i_mac2();
|
||||
my $i_mac = $asante->orig_i_mac($partial) || {};
|
||||
|
||||
my %i_mac;
|
||||
|
||||
@@ -146,13 +142,14 @@ sub i_mac {
|
||||
}
|
||||
|
||||
sub i_description {
|
||||
return undef;
|
||||
return;
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $asante = shift;
|
||||
my $asante = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_name = $asante->i_descr2();
|
||||
my $i_name = $asante->orig_i_descr($partial) || {};
|
||||
|
||||
my %i_name;
|
||||
|
||||
@@ -160,7 +157,9 @@ sub i_name {
|
||||
|
||||
return \%i_name;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
@@ -169,7 +168,7 @@ SNMP::Info::Layer1::Asante - SNMP Interface to old Asante 1012 Hubs
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -177,14 +176,13 @@ Max Baker (C<max@warped.org>)
|
||||
my $asante = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $asante->class();
|
||||
my $class = $asante->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
@@ -204,14 +202,14 @@ Asante device through SNMP.
|
||||
|
||||
=over
|
||||
|
||||
=item ASANTE-HUB1012-MIB
|
||||
|
||||
Download from http://www.mibdepot.com
|
||||
|
||||
=items MIBs listed in SNMP::Info::Layer1
|
||||
=item F<ASANTE-HUB1012-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::Layer1/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
=head2 Overrides
|
||||
@@ -230,28 +228,36 @@ Culls software version from description()
|
||||
|
||||
Returns 'asante' :)
|
||||
|
||||
=item $asante->root_ip()
|
||||
|
||||
Returns IP Address of Managed Hub.
|
||||
|
||||
(B<actualIpAddr>)
|
||||
|
||||
=item $asante->model()
|
||||
|
||||
Trys to cull out AT-nnnnX out of the description field.
|
||||
Cross references $asante->id() to the F<ASANTE-HUB1012-MIB> and returns
|
||||
the results.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals inherited from SNMP::Info::Layer1
|
||||
=head2 Global Methods imported from SNMP::Info::Layer1
|
||||
|
||||
See documentation in SNMP::Info::Layer1 for details.
|
||||
See L<SNMP::Info::Layer1/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $asante->interfaces()
|
||||
|
||||
Returns reference to the map between IID and physical Port.
|
||||
|
||||
=item $asante->i_description()
|
||||
|
||||
Description of the interface.
|
||||
|
||||
=item $asante->i_mac()
|
||||
|
||||
MAC address of the interface. Note this is just the MAC of the port, not
|
||||
anything connected to it.
|
||||
|
||||
=item $asante->i_name()
|
||||
|
||||
Returns reference to map of IIDs to human-set port name.
|
||||
@@ -259,7 +265,11 @@ Returns reference to map of IIDs to human-set port name.
|
||||
=item $asante->i_up()
|
||||
|
||||
Returns reference to map of IIDs to link status. Changes
|
||||
the values of ati_up() to 'up' and 'down'.
|
||||
the values of asante_up() to 'up' and 'down'.
|
||||
|
||||
=item $asante->i_speed()
|
||||
|
||||
Speed of the link, human format.
|
||||
|
||||
=back
|
||||
|
||||
@@ -269,16 +279,16 @@ the values of ati_up() to 'up' and 'down'.
|
||||
|
||||
=item $asante->ati_p_name()
|
||||
|
||||
(B<portName>)
|
||||
(C<portName>)
|
||||
|
||||
=item $asante->ati_up()
|
||||
|
||||
(B<linkTestLED>)
|
||||
(C<linkTestLED>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer1
|
||||
|
||||
See documentation in SNMP::Info::Layer1 for details.
|
||||
See L<SNMP::Info::Layer1/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
729
Info/Layer1/Bayhub.pm
Normal file
729
Info/Layer1/Bayhub.pm
Normal file
@@ -0,0 +1,729 @@
|
||||
# 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.00_003';
|
||||
|
||||
%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_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.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer1::MIBS,
|
||||
'CYCLADES-ACS-SYS-MIB' => 'cyACSversion',
|
||||
'CYCLADES-ACS-CONF-MIB' => 'cyEthIPaddr',
|
||||
'CYCLADES-ACS-INFO-MIB' => 'cyISPortTty',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
|
||||
# CYCLADES-ACS-SYS-MIB
|
||||
%SNMP::Info::Layer1::GLOBALS,
|
||||
'os_ver' => 'cyACSversion',
|
||||
'cy_model' => 'cyACSpname',
|
||||
'serial' => 'cyACSDevId',
|
||||
'root_ip' => 'cyEthIPaddr',
|
||||
'ps1_status' => 'cyACSPw1',
|
||||
'ps2_status' => 'cyACSPw2',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer1::FUNCS,
|
||||
|
||||
# CYCLADES-ACS-INFO-MIB::cyInfoSerialTable
|
||||
'cy_port_tty' => 'cyISPortTty',
|
||||
'cy_port_name' => 'cyISPortName',
|
||||
'cy_port_speed' => 'cyISPortSpeed',
|
||||
'cy_port_cd' => 'cyISPortSigCD',
|
||||
|
||||
# CYCLADES-ACS-CONF-MIB::cySerialPortTable
|
||||
'cy_port_socket' => 'cySPortSocketPort',
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer1::MUNGE, );
|
||||
|
||||
# These devices don't have a FDB and we probably don't want to poll for ARP
|
||||
# cache so turn off reported L2/L3.
|
||||
sub layers {
|
||||
return '01000001';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'cyclades';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'cyclades';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $cyclades = shift;
|
||||
|
||||
my $model = $cyclades->cy_model();
|
||||
|
||||
return unless defined $model;
|
||||
|
||||
return lc($model);
|
||||
}
|
||||
|
||||
# Extend interface methods to include serial ports
|
||||
#
|
||||
# Partials don't really help in this class, but implemented
|
||||
# for consistency
|
||||
|
||||
sub i_index {
|
||||
my $cyclades = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $orig_index = $cyclades->orig_i_index($partial) || {};
|
||||
my $cy_index = $cyclades->cy_port_socket() || {};
|
||||
|
||||
my %i_index;
|
||||
foreach my $iid ( keys %$orig_index ) {
|
||||
my $index = $orig_index->{$iid};
|
||||
next unless defined $index;
|
||||
|
||||
$i_index{$iid} = $index;
|
||||
}
|
||||
|
||||
# Use alternative labeling system for the serial port, listening socket
|
||||
# to avoid conflicts with ifIndex.
|
||||
foreach my $iid ( keys %$cy_index ) {
|
||||
my $index = $cy_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
|
||||
$i_index{$index} = $index;
|
||||
}
|
||||
|
||||
return \%i_index;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $cyclades = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_descr = $cyclades->orig_i_description($partial) || {};
|
||||
my $cy_index = $cyclades->cy_port_socket() || {};
|
||||
my $cy_p_tty = $cyclades->cy_port_tty() || {};
|
||||
|
||||
my %if;
|
||||
foreach my $iid ( keys %$i_descr ) {
|
||||
my $descr = $i_descr->{$iid};
|
||||
next unless defined $descr;
|
||||
|
||||
$if{$iid} = $descr;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$cy_p_tty ) {
|
||||
my $index = $cy_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
my $name = $cy_p_tty->{$iid};
|
||||
next unless defined $name;
|
||||
|
||||
$if{$index} = $name;
|
||||
}
|
||||
|
||||
return \%if;
|
||||
}
|
||||
|
||||
sub i_speed {
|
||||
my $cyclades = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_speed = $cyclades->orig_i_speed($partial) || {};
|
||||
my $cy_index = $cyclades->cy_port_socket() || {};
|
||||
my $cy_p_speed = $cyclades->cy_port_speed() || {};
|
||||
|
||||
my %i_speed;
|
||||
foreach my $iid ( keys %$i_speed ) {
|
||||
my $speed = $i_speed->{$iid};
|
||||
next unless defined $speed;
|
||||
|
||||
$i_speed{$iid} = $speed;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$cy_p_speed ) {
|
||||
my $index = $cy_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
my $speed = $cy_p_speed->{$iid};
|
||||
next unless defined $speed;
|
||||
|
||||
$i_speed{$index} = $speed;
|
||||
}
|
||||
|
||||
return \%i_speed;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $cyclades = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_up = $cyclades->orig_i_up($partial) || {};
|
||||
my $cy_index = $cyclades->cy_port_socket() || {};
|
||||
my $cy_p_up = $cyclades->cy_port_cd() || {};
|
||||
|
||||
my %i_up;
|
||||
foreach my $iid ( keys %$i_up ) {
|
||||
my $up = $i_up->{$iid};
|
||||
next unless defined $up;
|
||||
|
||||
$i_up{$iid} = $up;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$cy_p_up ) {
|
||||
my $index = $cy_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
my $up = $cy_p_up->{$iid};
|
||||
next unless defined $up;
|
||||
|
||||
$i_up{$index} = $up;
|
||||
}
|
||||
|
||||
return \%i_up;
|
||||
}
|
||||
|
||||
sub i_description {
|
||||
my $cyclades = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_desc = $cyclades->orig_i_description($partial) || {};
|
||||
my $cy_index = $cyclades->cy_port_socket() || {};
|
||||
my $cy_p_desc = $cyclades->cy_port_name() || {};
|
||||
|
||||
my %descr;
|
||||
foreach my $iid ( keys %$i_desc ) {
|
||||
my $desc = $i_desc->{$iid};
|
||||
next unless defined $desc;
|
||||
|
||||
$descr{$iid} = $desc;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$cy_p_desc ) {
|
||||
my $index = $cy_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
my $desc = $cy_p_desc->{$iid};
|
||||
next unless defined $desc;
|
||||
|
||||
$descr{$index} = $desc;
|
||||
}
|
||||
|
||||
return \%descr;
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $cyclades = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_name = $cyclades->orig_i_name($partial) || {};
|
||||
my $cy_index = $cyclades->cy_port_socket() || {};
|
||||
my $cy_p_desc = $cyclades->cy_port_name() || {};
|
||||
|
||||
my %i_name;
|
||||
foreach my $iid ( keys %$i_name ) {
|
||||
my $name = $i_name->{$iid};
|
||||
next unless defined $name;
|
||||
|
||||
$i_name{$iid} = $name;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$cy_p_desc ) {
|
||||
my $index = $cy_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
my $name = $cy_p_desc->{$iid};
|
||||
next unless defined $name;
|
||||
|
||||
$i_name{$index} = $name;
|
||||
}
|
||||
|
||||
return \%i_name;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer1::Cyclades - SNMP Interface to Cyclades terminal servers
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#Let SNMP::Info determine the correct subclass for you.
|
||||
|
||||
my $cyclades = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $cyclades->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Cyclades device through SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $cyclades = new SNMP::Info::Layer1::Cyclades(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer1
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CYCLADES-ACS-SYS-MIB>
|
||||
|
||||
=item F<CYCLADES-ACS-CONF-MIB>
|
||||
|
||||
=item F<CYCLADES-ACS-INFO-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::Layer1/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $cyclades->os_ver()
|
||||
|
||||
(C<cyACSversion>)
|
||||
|
||||
=item $cyclades->serial()
|
||||
|
||||
(C<cyACSDevId>)
|
||||
|
||||
=item $cyclades->root_ip()
|
||||
|
||||
(C<cyEthIPaddr>)
|
||||
|
||||
=item $cyclades->ps1_status()
|
||||
|
||||
(C<cyACSPw1>)
|
||||
|
||||
=item $cyclades->ps2_status()
|
||||
|
||||
(C<cyACSPw2>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $cyclades->layers()
|
||||
|
||||
Returns 01000001. These devices don't have a FDB and we probably don't want
|
||||
to poll for an ARP cache so turn off reported Layer 2 and Layer 3.
|
||||
|
||||
=item $cyclades->vendor()
|
||||
|
||||
Returns 'cyclades'
|
||||
|
||||
=item $cyclades->os()
|
||||
|
||||
Returns 'cyclades'
|
||||
|
||||
=item $cyclades->model()
|
||||
|
||||
Returns lower case (C<cyACSpname>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer1
|
||||
|
||||
See L<SNMP::Info::Layer1/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $cyclades->i_index()
|
||||
|
||||
Returns reference to map of IIDs to Interface index.
|
||||
|
||||
Extended to include serial ports. Serial ports are indexed with the
|
||||
alternative labeling system for the serial port, the listening socket port
|
||||
C<cySPortSocketPort> to avoid conflicts with C<ifIndex>.
|
||||
|
||||
=item $cyclades->interfaces()
|
||||
|
||||
Returns reference to map of IIDs to physical ports. Extended to include
|
||||
serial ports, C<cyISPortTty>.
|
||||
|
||||
=item $cyclades->i_speed()
|
||||
|
||||
Returns interface speed. Extended to include serial ports, C<cyISPortSpeed>.
|
||||
|
||||
=item $cyclades->i_up()
|
||||
|
||||
Returns link status for each port. Extended to include serial ports,
|
||||
C<cyISPortSigCD>.
|
||||
|
||||
=item $cyclades->i_description()
|
||||
|
||||
Returns description of each port. Extended to include serial ports,
|
||||
C<cyISPortName>.
|
||||
|
||||
=item $cyclades->i_name()
|
||||
|
||||
Returns name of each port. Extended to include serial ports, C<cyISPortName>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer1
|
||||
|
||||
See L<SNMP::Info::Layer1/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
548
Info/Layer1/S3000.pm
Normal file
548
Info/Layer1/S3000.pm
Normal file
@@ -0,0 +1,548 @@
|
||||
# SNMP::Info::Layer1::S3000
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer1::S3000;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer1::S3000::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer1::S3000::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
'SYNOPTICS-ETHERNET-MIB' => 's3EnetPortTable',
|
||||
'SYNOPTICS-COMMON-MIB' => 's3AgentType',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
|
||||
# From SYNOPTICS-COMMON-MIB
|
||||
'os_bin' => 's3AgentFwVer',
|
||||
's3000_major_ver' => 's3AgentSwMajorVer',
|
||||
's3000_minor_ver' => 's3AgentSwMinorVer',
|
||||
's3000_maint_ver' => 's3AgentSwMaintVer',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
|
||||
# SYNOPTICS-ETHERNET-MIB::s3EnetPortTable
|
||||
's3000_pb_index' => 's3EnetPortBoardIndex',
|
||||
's3000_pp_index' => 's3EnetPortIndex',
|
||||
's3000_up_admin' => 's3EnetPortPartStatus',
|
||||
's3000_up' => 's3EnetPortLinkStatus',
|
||||
|
||||
# SYNOPTICS-ETHERNET-MIB::s3EnetShowNodesTable
|
||||
's3000_nb_index' => 's3EnetShowNodesSlotIndex',
|
||||
's3000_np_index' => 's3EnetShowNodesPortIndex',
|
||||
'fw_mac' => 's3EnetShowNodesMacAddress',
|
||||
|
||||
# SYNOPTICS-ETHERNET-MIB::s3EnetTopNmmTable
|
||||
's3000_topo_port' => 's3EnetTopNmmPort',
|
||||
's3000_topo_mac' => 's3EnetTopNmmMacAddr',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE, 's3000_topo_mac' => \&SNMP::Info::munge_mac
|
||||
);
|
||||
|
||||
sub layers {
|
||||
return '00000011';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'synoptics';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'nortel';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $s3000 = shift;
|
||||
my $id = $s3000->id();
|
||||
return unless defined $id;
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
$model =~ s/^s3reg-//i;
|
||||
|
||||
return $1 if ( $model =~ /((\d+){3}[\dX])/ );
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $s3000 = shift;
|
||||
my $major_ver = $s3000->s3000_major_ver() || 0;
|
||||
my $minor_ver = $s3000->s3000_minor_ver() || 0;
|
||||
my $maint_ver = $s3000->s3000_maint_ver() || 0;
|
||||
|
||||
my $ver = "$major_ver.$minor_ver.$maint_ver";
|
||||
return $ver;
|
||||
}
|
||||
|
||||
sub mac {
|
||||
my $s3000 = shift;
|
||||
my $topo_port = $s3000->s3000_topo_port();
|
||||
my $topo_mac = $s3000->s3000_topo_mac();
|
||||
|
||||
foreach my $entry ( keys %$topo_port ) {
|
||||
my $port = $topo_port->{$entry};
|
||||
next unless $port == 0;
|
||||
my $mac = $topo_mac->{$entry};
|
||||
return $mac;
|
||||
}
|
||||
|
||||
# Topology turned off, not supported.
|
||||
return;
|
||||
}
|
||||
|
||||
# Hubs do not support ifMIB requirements for get MAC
|
||||
# and port status
|
||||
|
||||
sub i_index {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $b_index = $s3000->s3000_pb_index($partial) || {};
|
||||
my $p_index = $s3000->s3000_pp_index($partial) || {};
|
||||
|
||||
my %i_index;
|
||||
foreach my $iid ( keys %$b_index ) {
|
||||
my $board = $b_index->{$iid};
|
||||
next unless defined $board;
|
||||
my $port = $p_index->{$iid} || 0;
|
||||
|
||||
# We need to make up an index for multiple board instances.
|
||||
my $index = ( $board * 256 ) + $port;
|
||||
|
||||
$i_index{$iid} = $index;
|
||||
}
|
||||
return \%i_index;
|
||||
}
|
||||
|
||||
# Partials don't really help in this class, but implemented
|
||||
# for consistency
|
||||
|
||||
sub interfaces {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $s3000->i_index() || {};
|
||||
|
||||
my %if;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
|
||||
# Index numbers are deterministic slot * 256 + port - see i_index()
|
||||
my $port = $index % 256;
|
||||
my $slot = int( $index / 256 );
|
||||
|
||||
my $slotport = "$slot.$port";
|
||||
|
||||
$if{$index} = $slotport;
|
||||
}
|
||||
|
||||
return \%if;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $port_index = $s3000->i_index() || {};
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $iid ( keys %$port_index ) {
|
||||
my $index = $port_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
|
||||
# Hubs only function half duplex
|
||||
my $duplex = 'half';
|
||||
$i_duplex{$index} = $duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $port_index = $s3000->i_index() || {};
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $iid ( keys %$port_index ) {
|
||||
my $index = $port_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
|
||||
# Hubs only function half duplex
|
||||
my $duplex = 'half';
|
||||
$i_duplex_admin{$index} = $duplex;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
sub i_speed {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $port_index = $s3000->i_index() || {};
|
||||
|
||||
my %i_speed;
|
||||
foreach my $iid ( keys %$port_index ) {
|
||||
my $index = $port_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
|
||||
# These hubs only support 10 Mbs
|
||||
my $speed = '10000000';
|
||||
$i_speed{$index} = $speed;
|
||||
}
|
||||
return \%i_speed;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $port_index = $s3000->i_index() || {};
|
||||
my $link_stat = $s3000->s3000_up() || {};
|
||||
|
||||
my %i_up;
|
||||
foreach my $iid ( keys %$port_index ) {
|
||||
my $index = $port_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
my $link_stat = $link_stat->{$iid};
|
||||
next unless defined $link_stat;
|
||||
|
||||
$link_stat = 'up' if $link_stat =~ /on/i;
|
||||
$link_stat = 'down' if $link_stat =~ /off/i;
|
||||
|
||||
$i_up{$index} = $link_stat;
|
||||
}
|
||||
return \%i_up;
|
||||
}
|
||||
|
||||
sub i_up_admin {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $s3000->i_index() || {};
|
||||
my $link_stat = $s3000->s3000_up_admin() || {};
|
||||
|
||||
my %i_up_admin;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
my $link_stat = $link_stat->{$iid};
|
||||
next unless defined $link_stat;
|
||||
|
||||
$i_up_admin{$index} = $link_stat;
|
||||
}
|
||||
return \%i_up_admin;
|
||||
}
|
||||
|
||||
sub set_i_up_admin {
|
||||
|
||||
# map setting to those the hub will understand
|
||||
my %setting = qw/up 2 down 3/;
|
||||
|
||||
my $s3000 = shift;
|
||||
my ( $setting, $iid ) = @_;
|
||||
|
||||
my $i_index = $s3000->i_index() || {};
|
||||
my %reverse_i_index = reverse %$i_index;
|
||||
|
||||
$setting = lc($setting);
|
||||
|
||||
return 0 unless defined $setting{$setting};
|
||||
|
||||
$iid = $reverse_i_index{$iid};
|
||||
|
||||
return $s3000->set_s3000_up_admin( $setting{$setting}, $iid );
|
||||
}
|
||||
|
||||
# Hubs do not support the standard Bridge MIB
|
||||
sub bp_index {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $b_index = $s3000->s3000_nb_index() || {};
|
||||
my $p_index = $s3000->s3000_np_index() || {};
|
||||
my $model = $s3000->model();
|
||||
|
||||
my %bp_index;
|
||||
foreach my $iid ( keys %$b_index ) {
|
||||
my $board = $b_index->{$iid};
|
||||
next unless defined $board;
|
||||
my $port = $p_index->{$iid} || 0;
|
||||
|
||||
my $index = ( $board * 256 ) + $port;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
|
||||
$bp_index{$index} = $index;
|
||||
}
|
||||
return \%bp_index;
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $b_index = $s3000->s3000_nb_index($partial) || {};
|
||||
my $p_index = $s3000->s3000_np_index($partial) || {};
|
||||
my $model = $s3000->model();
|
||||
|
||||
my %fw_port;
|
||||
foreach my $iid ( keys %$b_index ) {
|
||||
my $board = $b_index->{$iid};
|
||||
next unless defined $board;
|
||||
my $port = $p_index->{$iid} || 0;
|
||||
|
||||
my $index = ( $board * 256 ) + $port;
|
||||
|
||||
$fw_port{$iid} = $index;
|
||||
}
|
||||
return \%fw_port;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer1::S3000 - SNMP Interface to Synoptics / Nortel Hubs
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#Let SNMP::Info determine the correct subclass for you.
|
||||
|
||||
my $s3000 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $s3000->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Bay hub device through SNMP. Also provides device MAC to port mapping through
|
||||
the proprietary MIB.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $s3000 = new SNMP::Info::Layer1::S3000(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<SYNOPTICS-COMMON-MIB>
|
||||
|
||||
=item F<SYNOPTICS-ETHERNET-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $s3000->vendor()
|
||||
|
||||
Returns 'nortel'
|
||||
|
||||
=item $s3000->os()
|
||||
|
||||
Returns 'synoptics'
|
||||
|
||||
=item $s3000->model()
|
||||
|
||||
Cross references $s3000->id() to the F<SYNOPTICS-MIB> and returns
|
||||
the results.
|
||||
|
||||
Removes C<sreg-> from the model name and returns only the numeric model
|
||||
identifier.
|
||||
|
||||
=item $stack->os_ver()
|
||||
|
||||
Returns the software version specified as major.minor.maint.
|
||||
|
||||
(C<s3AgentSwMajorVer>).(C<s3AgentSwMinorVer>).(C<s3AgentSwMaintVer>)
|
||||
|
||||
=item $stack->os_bin()
|
||||
|
||||
Returns the firmware version. (C<s3AgentFwVer>)
|
||||
|
||||
=item $s3000->mac()
|
||||
|
||||
Returns MAC of the advertised IP address of the device.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $s3000->layers()
|
||||
|
||||
Returns 00000011. Class emulates Layer 2 functionality through proprietary
|
||||
MIBs.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $s3000->i_index()
|
||||
|
||||
Returns reference to map of IIDs to Interface index.
|
||||
|
||||
Since hubs do not support C<ifIndex>, the interface index is created using the
|
||||
formula (board * 256 + port). This is required to support devices with more
|
||||
than one module.
|
||||
|
||||
=item $s3000->interfaces()
|
||||
|
||||
Returns reference to map of IIDs to physical ports.
|
||||
|
||||
=item $s3000->i_duplex()
|
||||
|
||||
Returns half, hubs do not support full duplex.
|
||||
|
||||
=item $s3000->i_duplex_admin()
|
||||
|
||||
Returns half, hubs do not support full duplex.
|
||||
|
||||
=item $s3000->i_speed()
|
||||
|
||||
Returns 10000000. The hubs only support 10 Mbs Ethernet.
|
||||
|
||||
=item $s3000->i_up()
|
||||
|
||||
Returns (C<s3EnetPortLinkStatus>) for each port. Translates on/off to
|
||||
up/down.
|
||||
|
||||
=item $s3000->i_up_admin()
|
||||
|
||||
Returns (C<s3EnetPortPartStatus>) for each port.
|
||||
|
||||
=item $s3000->set_i_up_admin(state, ifIndex)
|
||||
|
||||
Sets port state, must be supplied with state and port C<ifIndex>
|
||||
|
||||
State choices are 'up' or 'down'
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$s3000->interfaces()};
|
||||
$s3000->set_i_up_admin('down', $if_map{'1.1'})
|
||||
or die "Couldn't change port state. ",$s3000->error(1);
|
||||
|
||||
=item $s3000->bp_index()
|
||||
|
||||
Simulates bridge MIB by returning reference to a hash containing the index for
|
||||
both the keys and values.
|
||||
|
||||
=item $s3000->fw_port()
|
||||
|
||||
Returns reference to map of IIDs of the
|
||||
C<SYNOPTICS-ETHERNET-MIB::s3EnetShowNodesTable> to the Interface index.
|
||||
|
||||
=item $s3000->fw_mac()
|
||||
|
||||
(C<s3EnetShowNodesMacAddress>)
|
||||
|
||||
=item $s3000->s3000_topo_port()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:Port Number
|
||||
(interface iid)
|
||||
|
||||
(C<s3EnetTopNmmPort>)
|
||||
|
||||
=item $s3000->s3000_topo_mac()
|
||||
|
||||
(C<s3EnetTopNmmMacAddr>)
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:Remote MAC address
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
257
Info/Layer2.pm
257
Info/Layer2.pm
@@ -1,95 +1,89 @@
|
||||
# SNMP::Info::Layer2 - SNMP Interface to Layer2 Devices
|
||||
# Max Baker <max@warped.org>
|
||||
# SNMP::Info::Layer2 - SNMP Interface to Layer2 Devices
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker -- All changes from Version 0.7 on
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use SNMP::Info::Bridge;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::Entity;
|
||||
use SNMP::Info::PowerEthernet;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE $INIT/;
|
||||
|
||||
@SNMP::Info::Layer2::ISA = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::CDP SNMP::Info::CiscoStats Exporter/;
|
||||
@SNMP::Info::Layer2::ISA
|
||||
= qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::Entity SNMP::Info::PowerEthernet Exporter/;
|
||||
@SNMP::Info::Layer2::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
|
||||
|
||||
# See SNMP::Info for the details of these data structures and
|
||||
# the interworkings.
|
||||
$INIT = 0;
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = ( %SNMP::Info::MIBS,
|
||||
%SNMP::Info::Bridge::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
'CISCO-PRODUCTS-MIB' => 'sysName',
|
||||
'CISCO-STACK-MIB' => 'wsc1900sysID',
|
||||
);
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS,
|
||||
%SNMP::Info::Entity::MIBS, %SNMP::Info::PowerEthernet::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::GLOBALS,
|
||||
%SNMP::Info::Bridge::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
);
|
||||
%SNMP::Info::GLOBALS,
|
||||
%SNMP::Info::Bridge::GLOBALS,
|
||||
%SNMP::Info::Entity::GLOBALS,
|
||||
%SNMP::Info::PowerEthernet::GLOBALS,
|
||||
'serial1' =>
|
||||
'.1.3.6.1.4.1.9.3.6.3.0', # OLD-CISCO-CHASSIS-MIB::chassisId.0
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
%SNMP::Info::Bridge::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
);
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS, %SNMP::Info::Bridge::FUNCS,
|
||||
%SNMP::Info::Entity::FUNCS, %SNMP::Info::PowerEthernet::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE,
|
||||
);
|
||||
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
%SNMP::Info::Entity::MUNGE,
|
||||
%SNMP::Info::PowerEthernet::MUNGE,
|
||||
);
|
||||
|
||||
# Method OverRides
|
||||
|
||||
# $l2->model() - Looks at sysObjectID which gives the oid of the system
|
||||
# name, contained in a propriatry MIB.
|
||||
# name, contained in a propriatry MIB.
|
||||
sub model {
|
||||
my $l2 = shift;
|
||||
my $id = $l2->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
my $l2 = shift;
|
||||
my $id = $l2->id();
|
||||
my $model = &SNMP::translateObj($id) || $id || '';
|
||||
|
||||
# HP
|
||||
$model =~ s/^hpswitch//i;
|
||||
|
||||
@@ -102,61 +96,71 @@ sub model {
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
my $l2 = shift;
|
||||
my $l2 = shift;
|
||||
my $model = $l2->model();
|
||||
my $descr = $l2->description();
|
||||
|
||||
if ($model =~ /hp/i or $descr =~ /hp/i) {
|
||||
if ( $model =~ /hp/i or $descr =~ /\bhp\b/i ) {
|
||||
return 'hp';
|
||||
}
|
||||
|
||||
if ($model =~ /catalyst/i or $descr =~ /(catalyst|cisco)/i) {
|
||||
if ( $model =~ /catalyst/i or $descr =~ /(catalyst|cisco)/i ) {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
sub serial {
|
||||
my $l2 = shift;
|
||||
|
||||
my $i_type = $l2->i_type();
|
||||
my $serial1 = $l2->serial1();
|
||||
my $e_descr = $l2->e_descr() || {};
|
||||
my $e_serial = $l2->e_serial() || {};
|
||||
|
||||
my $serial2 = $e_serial->{1} || undef;
|
||||
my $chassis = $e_descr->{1} || undef;
|
||||
|
||||
# precedence
|
||||
# serial2,chassis parse,serial1
|
||||
return $serial2 if ( defined $serial2 and $serial2 !~ /^\s*$/ );
|
||||
return $1
|
||||
if ( defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i );
|
||||
return $serial1 if ( defined $serial1 and $serial1 !~ /^\s*$/ );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $l2 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_type = $l2->i_type($partial) || {};
|
||||
|
||||
my %i_ignore = ();
|
||||
|
||||
foreach my $if (keys %$i_type){
|
||||
foreach my $if ( keys %$i_type ) {
|
||||
my $type = $i_type->{$if};
|
||||
$i_ignore{$if}++
|
||||
if $type =~ /(loopback|propvirtual|other|cpu)/i;
|
||||
$i_ignore{$if}++
|
||||
if $type =~ /(loopback|other|cpu)/i;
|
||||
}
|
||||
|
||||
return \%i_ignore;
|
||||
}
|
||||
}
|
||||
|
||||
# By Default we'll use the description field
|
||||
sub interfaces {
|
||||
my $l2 = shift;
|
||||
my $interfaces = $l2->i_index();
|
||||
my $i_descr = $l2->i_description();
|
||||
my $i_name = $l2->i_name();
|
||||
my $l2 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my %if;
|
||||
foreach my $iid (keys %$interfaces){
|
||||
my $interfaces = $l2->i_index($partial) || {};
|
||||
my $i_descr = $l2->i_description($partial) || {};
|
||||
|
||||
# Replace the Index with the ifDescr field.
|
||||
foreach my $iid ( keys %$i_descr ) {
|
||||
my $port = $i_descr->{$iid};
|
||||
my $name = $i_name->{$iid};
|
||||
$port = $name if (defined $name and $name !~ /^\s*$/);
|
||||
next unless defined $port;
|
||||
|
||||
# Cisco 1900 has a space in some of its port descr.
|
||||
# get rid of any weird characters
|
||||
$port =~ s/[^\d\/,()\w]+//gi;
|
||||
|
||||
# Translate Cisco 2926,etc. from 1/5 to 1.5
|
||||
$port =~ s/\//\./ if ($port =~ /^\d+\/\d+$/);
|
||||
|
||||
$if{$iid} = $port;
|
||||
$interfaces->{$iid} = $port;
|
||||
}
|
||||
|
||||
return \%if
|
||||
return $interfaces;
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -164,11 +168,11 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2 - Perl5 Interface to network devices serving Layer2 only.
|
||||
SNMP::Info::Layer2 - SNMP Interface to network devices serving Layer2 only.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -176,7 +180,6 @@ Max Baker (C<max@warped.org>)
|
||||
my $l2 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
@@ -199,14 +202,15 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This class is usually used as a superclass for more specific device classes listed under
|
||||
SNMP::Info::Layer2::* Please read all docs under SNMP::Info first.
|
||||
This class is usually used as a superclass for more specific device classes
|
||||
listed under SNMP::Info::Layer2::* Please read all docs under SNMP::Info
|
||||
first.
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Layer2 device through SNMP. Information is stored in a number of MIBs.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $l2 = new SNMP::Info::Layer2(...);
|
||||
|
||||
@@ -218,9 +222,7 @@ a more specific class using the method above.
|
||||
|
||||
=item SNMP::Info::Bridge
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
=item SNMP::Info::Entity
|
||||
|
||||
=back
|
||||
|
||||
@@ -228,21 +230,13 @@ a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item CISCO-PRODUCTS-MIB
|
||||
|
||||
Needed for ID of Cisco Products
|
||||
|
||||
=item CISCO-STACK-MIB
|
||||
|
||||
Needed for ID of Cisco Products
|
||||
|
||||
=item Inherited Classes
|
||||
|
||||
MIBs required by the inherited classes listed above.
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
||||
MIBs can be found in netdisco-mibs package.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
@@ -257,31 +251,31 @@ These are methods that return scalar value from SNMP
|
||||
Cross references $l2->id() with product IDs in the
|
||||
Cisco MIBs.
|
||||
|
||||
For HP devices, removes 'hpswitch' from the name
|
||||
For HP devices, removes C<'hpswitch'> from the name
|
||||
|
||||
For Cisco devices, removes 'sysid' from the name
|
||||
For Cisco devices, removes c<'sysid'> from the name
|
||||
|
||||
=item $l2->vendor()
|
||||
|
||||
Trys to discover the vendor from $l2->model() and $l2->description()
|
||||
Tries to discover the vendor from $l2->model() and $l2->description()
|
||||
|
||||
=item $l2->serial()
|
||||
|
||||
Returns serial number if available through SNMP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See documentation in L<SNMP::Info/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
=head2 Globals imported from SNMP::Info::Entity
|
||||
|
||||
See documentation in SNMP::Info::CDP for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in SNMP::Info::CiscoStats for details.
|
||||
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
@@ -294,32 +288,29 @@ to a hash.
|
||||
|
||||
=item $l2->interfaces()
|
||||
|
||||
Creates a map between the interface identifier (iid) and the physical port name.
|
||||
Creates a map between the interface identifier (iid) and the physical port
|
||||
name.
|
||||
|
||||
Defaults to B<ifDescr> but checks and overrides with B<ifName>
|
||||
Defaults to C<ifDescr> but checks and overrides with C<ifName>
|
||||
|
||||
=item $l2->i_ignore()
|
||||
|
||||
Returns reference to hash. Increments value of IID if port is to be ignored.
|
||||
|
||||
Ignores ports with B<ifType> of loopback,propvirtual,other, and cpu
|
||||
Ignores ports with C<ifType> of loopback, propvirtual, other, and cpu
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
=head2 Table Methods imported from SNMP::Info::Entity
|
||||
|
||||
See documentation in SNMP::Info::CDP for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in SNMP::Info::CiscoStats for details.
|
||||
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
385
Info/Layer2/Airespace.pm
Normal file
385
Info/Layer2/Airespace.pm
Normal file
@@ -0,0 +1,385 @@
|
||||
# SNMP::Info::Layer2::Airespace
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Airespace;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Bridge;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::Airespace;
|
||||
|
||||
@SNMP::Info::Layer2::Airespace::ISA
|
||||
= qw/SNMP::Info::Airespace SNMP::Info::CDP SNMP::Info::Bridge Exporter/;
|
||||
@SNMP::Info::Layer2::Airespace::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%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,81 +1,132 @@
|
||||
# SNMP::Info::Layer2::Aironet
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Aironet;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
use strict;
|
||||
|
||||
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;
|
||||
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//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::Entity::GLOBALS,
|
||||
%SNMP::Info::EtherLike::GLOBALS,
|
||||
'serial' => 'entPhysicalSerialNum.1',
|
||||
'descr' => 'sysDescr'
|
||||
);
|
||||
%SNMP::Info::IEEE802dot11::GLOBALS,
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::Entity::GLOBALS,
|
||||
%SNMP::Info::EtherLike::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
'serial' => 'entPhysicalSerialNum.1',
|
||||
'descr' => 'sysDescr'
|
||||
);
|
||||
|
||||
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::Entity::FUNCS,
|
||||
%SNMP::Info::EtherLike::FUNCS
|
||||
);
|
||||
%FUNCS = (
|
||||
%SNMP::Info::IEEE802dot11::FUNCS,
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::Entity::FUNCS,
|
||||
%SNMP::Info::EtherLike::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
'i_80211channel' => 'cd11IfPhyDsssCurrentChannel',
|
||||
'c_dot11subif' => 'cDot11ClientSubIfIndex',
|
||||
'cd11_rateset' => 'cDot11ClientDataRateSet',
|
||||
'cd11_txrate' => 'cDot11ClientCurrentTxRateSet',
|
||||
'cd11_uptime' => 'cDot11ClientUpTime',
|
||||
'cd11_sigstrength' => 'cDot11ClientSignalStrength',
|
||||
'cd11_sigqual' => 'cDot11ClientSigQuality',
|
||||
'cd11_rxpkt' => 'cDot11ClientPacketsReceived',
|
||||
'cd11_txpkt' => 'cDot11ClientPacketsSent',
|
||||
'cd11_rxbyte' => 'cDot11ClientBytesReceived',
|
||||
'cd11_txbyte' => 'cDot11ClientBytesSent',
|
||||
'mbss_mac_addr' => 'cdot11MbssidIfMacAddress',
|
||||
);
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::Entity::MIBS,
|
||||
%SNMP::Info::EtherLike::MIBS
|
||||
);
|
||||
%MIBS = (
|
||||
%SNMP::Info::IEEE802dot11::MIBS,
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::Entity::MIBS,
|
||||
%SNMP::Info::EtherLike::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
'CISCO-DOT11-IF-MIB' => 'cd11IfAuxSsid',
|
||||
'CISCO-DOT11-ASSOCIATION-MIB' => 'cDot11ClientSubIfIndex',
|
||||
'CISCO-DOT11-SSID-SECURITY-MIB' => 'cdot11SecVlanNameId',
|
||||
'CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB' => 'cviRoutedVlanIfIndex',
|
||||
);
|
||||
|
||||
%MUNGE = (%SNMP::Info::Layer2::MUNGE,
|
||||
%SNMP::Info::Entity::MUNGE,
|
||||
%SNMP::Info::EtherLike::MUNGE
|
||||
);
|
||||
%MUNGE = (
|
||||
%SNMP::Info::IEEE802dot11::MUNGE,
|
||||
%SNMP::Info::Layer2::MUNGE,
|
||||
%SNMP::Info::Entity::MUNGE,
|
||||
%SNMP::Info::EtherLike::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE,
|
||||
'cd11_txrate' => \&munge_cd11_txrate,
|
||||
'cd11_rateset' => \&munge_cd11_txrate,
|
||||
'mbss_mac_addr' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
# Use 802.11 power level without putting IEEE802dot11 in @ISA
|
||||
*SNMP::Info::Layer2::Aironet::dot11_cur_tx_pwr_mw
|
||||
= \&SNMP::Info::IEEE802dot11::dot11_cur_tx_pwr_mw;
|
||||
|
||||
sub vendor {
|
||||
|
||||
# Sorry, but it's true.
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $aironet = shift;
|
||||
my $i_description = $aironet->i_description();
|
||||
my $partial = shift;
|
||||
|
||||
my $i_description = $aironet->i_description($partial);
|
||||
|
||||
return $i_description;
|
||||
}
|
||||
@@ -83,7 +134,7 @@ sub interfaces {
|
||||
# Tag on e_descr.1
|
||||
sub description {
|
||||
my $aironet = shift;
|
||||
my $descr = $aironet->descr();
|
||||
my $descr = $aironet->descr();
|
||||
my $e_descr = $aironet->e_descr();
|
||||
|
||||
$descr = "$e_descr->{1} $descr" if defined $e_descr->{1};
|
||||
@@ -94,10 +145,12 @@ sub description {
|
||||
# Fetch duplex from EtherLike
|
||||
sub i_duplex {
|
||||
my $aironet = shift;
|
||||
my $el_duplex = $aironet->el_duplex();
|
||||
my $partial = shift;
|
||||
|
||||
my $el_duplex = $aironet->el_duplex($partial);
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $d (keys %$el_duplex){
|
||||
foreach my $d ( keys %$el_duplex ) {
|
||||
my $val = $el_duplex->{$d};
|
||||
next unless defined $val;
|
||||
$i_duplex{$d} = 'full' if $val =~ /full/i;
|
||||
@@ -107,16 +160,314 @@ sub i_duplex {
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
#
|
||||
# IOS 12.3 introduces the cDot11ClientSubIfIndex in the
|
||||
# cDot11ClientConfigInfoTable, which supplies the ifIndex
|
||||
# of the VLAN Subinterface if one exists, or of the primary
|
||||
# interface if there are not subinterfaces. 12.2 used the
|
||||
# Q-BRIDGE-MIB dot1qTpFdbTable but that was removed in 12.3.
|
||||
sub _aironet_special {
|
||||
my $aironet = shift;
|
||||
my $os_ver = $aironet->os_ver();
|
||||
if ( defined($os_ver)
|
||||
&& $os_ver =~ /^(\d+)\.(\d+)(\D|$)/
|
||||
&& ( ( $1 == 12 && $2 >= 3 ) || $1 > 12 ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
#
|
||||
# INDEX { ifIndex, cd11IfAuxSsid, cDot11ClientAddress }
|
||||
sub _aironet_breakout_dot11idx {
|
||||
my $oid = shift;
|
||||
|
||||
my @parts = split( /\./, $oid );
|
||||
my $ifindex = shift(@parts);
|
||||
my $ssidlen = shift(@parts);
|
||||
my $ssid = pack( "C*", splice( @parts, 0, $ssidlen ) );
|
||||
my $mac = join( ":", map { sprintf "%02x", $_ } @parts );
|
||||
return ( $ifindex, $ssid, $mac );
|
||||
}
|
||||
|
||||
sub fw_mac {
|
||||
my $aironet = shift;
|
||||
|
||||
return $aironet->qb_fw_mac() unless _aironet_special($aironet);
|
||||
my $c_dot11subif = $aironet->c_dot11subif();
|
||||
my $fw_mac = {};
|
||||
|
||||
foreach my $i ( keys %$c_dot11subif ) {
|
||||
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($i);
|
||||
$fw_mac->{$i} = $mac;
|
||||
}
|
||||
return $fw_mac;
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $aironet = shift;
|
||||
|
||||
return $aironet->qb_fw_port() unless _aironet_special($aironet);
|
||||
my $c_dot11subif = $aironet->c_dot11subif();
|
||||
my $fw_port = {};
|
||||
|
||||
foreach my $i ( keys %$c_dot11subif ) {
|
||||
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($i);
|
||||
$fw_port->{$i} = $c_dot11subif->{$i} || $ifindex;
|
||||
}
|
||||
return $fw_port;
|
||||
}
|
||||
|
||||
sub bp_index {
|
||||
my $aironet = shift;
|
||||
|
||||
return $aironet->orig_bp_index() unless _aironet_special($aironet);
|
||||
my $c_dot11subif = $aironet->c_dot11subif();
|
||||
my $bp_index = {};
|
||||
|
||||
foreach my $i ( keys %$c_dot11subif ) {
|
||||
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($i);
|
||||
my ($i) = $c_dot11subif->{$i} || $ifindex;
|
||||
$bp_index->{$i} = $i;
|
||||
}
|
||||
return $bp_index;
|
||||
}
|
||||
|
||||
###
|
||||
#
|
||||
# VLAN support
|
||||
#
|
||||
sub v_name {
|
||||
my $aironet = shift;
|
||||
|
||||
my $v_name = {};
|
||||
my $vlan_nameid = $aironet->cdot11SecVlanNameId();
|
||||
foreach my $i ( keys %$vlan_nameid ) {
|
||||
my @parts = split( /\./, $i );
|
||||
my $namelen = shift(@parts);
|
||||
|
||||
my $name = pack( "C*", @parts );
|
||||
$v_name->{$i} = $name;
|
||||
}
|
||||
return $v_name;
|
||||
}
|
||||
|
||||
sub v_index {
|
||||
my $aironet = shift;
|
||||
|
||||
return $aironet->cdot11SecVlanNameId();
|
||||
}
|
||||
|
||||
sub i_vlan {
|
||||
my $aironet = shift;
|
||||
|
||||
my $i_vlan = {};
|
||||
my $idxmap = $aironet->cviRoutedVlanIfIndex();
|
||||
foreach my $i ( keys %$idxmap ) {
|
||||
my @parts = split( /\./, $i );
|
||||
$i_vlan->{ $idxmap->{$i} } = $parts[0];
|
||||
}
|
||||
return $i_vlan;
|
||||
}
|
||||
|
||||
# The MIB reports in units of half a megabit, e.g.,
|
||||
# 5.5Mbps is reported as 11.
|
||||
sub munge_cd11_txrate {
|
||||
my $txrates = shift;
|
||||
my @units = unpack( "C*", $txrates );
|
||||
my @rates = map {
|
||||
my $unit = $_;
|
||||
$unit *= 0.5;
|
||||
} @units;
|
||||
|
||||
return \@rates;
|
||||
}
|
||||
|
||||
# cd11 INDEX
|
||||
sub cd11_port {
|
||||
my $aironet = shift;
|
||||
my $cd11_sigstrength = $aironet->cd11_sigstrength();
|
||||
my $interfaces = $aironet->interfaces();
|
||||
my %ret;
|
||||
foreach ( keys %$cd11_sigstrength ) {
|
||||
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($_);
|
||||
$ret{$_} = $interfaces->{$ifindex};
|
||||
}
|
||||
return \%ret;
|
||||
}
|
||||
|
||||
sub cd11_ssid {
|
||||
my $aironet = shift;
|
||||
my $cd11_sigstrength = $aironet->cd11_sigstrength();
|
||||
my %ret;
|
||||
foreach ( keys %$cd11_sigstrength ) {
|
||||
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($_);
|
||||
$ret{$_} = $ssid;
|
||||
}
|
||||
return \%ret;
|
||||
}
|
||||
|
||||
sub cd11_mac {
|
||||
my $aironet = shift;
|
||||
my $cd11_sigstrength = $aironet->cd11_sigstrength();
|
||||
my %ret;
|
||||
foreach ( keys %$cd11_sigstrength ) {
|
||||
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($_);
|
||||
$ret{$_} = $mac;
|
||||
}
|
||||
return \%ret;
|
||||
}
|
||||
|
||||
# Map VLAN N on interface I to its actual ifIndex.
|
||||
sub _vlan_map_n_stack {
|
||||
my $aironet = shift;
|
||||
my $vlan_idx = $aironet->cviRoutedVlanIfIndex();
|
||||
|
||||
my $vlan_map = {};
|
||||
foreach my $idx ( keys %$vlan_idx ) {
|
||||
my ( $vlan, $num ) = split( /\./, $idx );
|
||||
$vlan_map->{$vlan}->{$num} = $vlan_idx->{$idx};
|
||||
}
|
||||
return $vlan_map;
|
||||
}
|
||||
|
||||
# When using MBSS, the ifTable reports the
|
||||
# base MAC address, but the actual association is
|
||||
# with a different MAC address for MBSS.
|
||||
# This convoluted path seems to be necessary
|
||||
# to get the right overrides.
|
||||
sub i_mac {
|
||||
my $aironet = shift;
|
||||
|
||||
# no partial is possible due to the levels
|
||||
# of indirection.
|
||||
|
||||
# Start with the ifPhysAddress, and override
|
||||
my $mbss_mac = $aironet->orig_i_mac();
|
||||
|
||||
my $mbss_mac_addr = $aironet->mbss_mac_addr();
|
||||
my $ssid_vlan = $aironet->cdot11SecAuxSsidVlan();
|
||||
my $vlan_map = $aironet->cviRoutedVlanIfIndex();
|
||||
my $ifstack = $aironet->ifStackStatus();
|
||||
|
||||
my $vlan_list = {};
|
||||
foreach my $idx ( keys %$vlan_map ) {
|
||||
my ( $vlan, $num ) = split( /\./, $idx );
|
||||
push( @{ $vlan_list->{$vlan} }, $vlan_map->{$idx} );
|
||||
}
|
||||
|
||||
my $stack = {};
|
||||
foreach my $idx ( keys %$ifstack ) {
|
||||
my ( $upper, $lower ) = split( /\./, $idx );
|
||||
$stack->{$upper}->{$lower} = $ifstack->{$idx};
|
||||
}
|
||||
|
||||
# mbss_mac_addr index is (radio, ssid).
|
||||
# ssid_vlan maps ssid->vlan.
|
||||
# vlan_map maps vlan->[list of interfaces]
|
||||
# ifstack allows us to pick the right interface
|
||||
foreach my $idx ( keys %$mbss_mac_addr ) {
|
||||
my ( $interface, @ssid ) = split( /\./, $idx );
|
||||
my $vlan = $ssid_vlan->{ join( ".", scalar(@ssid), @ssid ) };
|
||||
next unless defined($vlan);
|
||||
foreach my $vlanif ( @{ $vlan_list->{$vlan} } ) {
|
||||
if ( defined( $stack->{$vlanif}->{$interface} ) ) {
|
||||
$mbss_mac->{$vlanif} = $mbss_mac_addr->{$idx};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $mbss_mac;
|
||||
}
|
||||
|
||||
sub i_ssidlist {
|
||||
my $aironet = shift;
|
||||
|
||||
# no partial is possible due to the levels
|
||||
# of indirection.
|
||||
my $ssid_row = $aironet->cdot11SecInterfSsidRowStatus();
|
||||
my $ssid_vlan = $aironet->cdot11SecAuxSsidVlan();
|
||||
if ( !defined($ssid_row) || !defined($ssid_vlan) ) {
|
||||
return $aironet->cd11IfAuxSsid();
|
||||
}
|
||||
my $ssidlist = {};
|
||||
my $if_ssidcount = {};
|
||||
my $vlan_map = $aironet->_vlan_map_n_stack();
|
||||
foreach my $idx ( keys %$ssid_row ) {
|
||||
next unless $ssid_row->{$idx} eq 'active';
|
||||
|
||||
# ssid_row index is radio.ssid
|
||||
my ( $interface, $ssid ) = split( /\./, $idx, 2 );
|
||||
my ( $len, @ssidt ) = split( /\./, $ssid );
|
||||
my $mappedintf = $vlan_map->{ $ssid_vlan->{$ssid} }->{$interface};
|
||||
next unless $mappedintf;
|
||||
if ( !$if_ssidcount->{$mappedintf} ) {
|
||||
$if_ssidcount->{$mappedintf} = 1;
|
||||
}
|
||||
my $ssidlist_idx
|
||||
= sprintf( "%s.%d", $mappedintf, $if_ssidcount->{$mappedintf} );
|
||||
$ssidlist->{$ssidlist_idx} = pack( "C*", @ssidt );
|
||||
$if_ssidcount->{$mappedintf}++;
|
||||
}
|
||||
return $ssidlist;
|
||||
}
|
||||
|
||||
sub i_ssidbcast {
|
||||
my $aironet = shift;
|
||||
my $partial = shift;
|
||||
my $mbss_bcast = $aironet->cdot11SecAuxSsidMbssidBroadcast();
|
||||
if ( !defined($mbss_bcast) ) {
|
||||
return $aironet->cd11IfAuxSsidBroadcastSsid($partial);
|
||||
}
|
||||
my $map = {};
|
||||
foreach my $key ( keys %$mbss_bcast ) {
|
||||
my (@idx) = split( /\./, $key );
|
||||
my $len = shift(@idx);
|
||||
$map->{ pack( "C*", @idx ) } = $mbss_bcast->{$key};
|
||||
}
|
||||
|
||||
# This needs to return the same indexes as i_ssidlist.
|
||||
# mbss_bcast maps ssid -> broadcasting
|
||||
# so we just replace the i_ssidlist values with the mbss_bcast ones.
|
||||
my $i_ssidlist = $aironet->i_ssidlist();
|
||||
my $i_ssidbcast = {};
|
||||
foreach my $key ( keys %$i_ssidlist ) {
|
||||
$i_ssidbcast->{$key} = $map->{ $i_ssidlist->{$key} };
|
||||
}
|
||||
return $i_ssidbcast;
|
||||
}
|
||||
|
||||
sub i_ssidmac {
|
||||
my $aironet = shift;
|
||||
my $partial = shift;
|
||||
my $mbss_mac_addr = $aironet->mbss_mac_addr();
|
||||
|
||||
# Same logic as i_ssidbcast to return same indexes as i_ssidlist
|
||||
my $map = {};
|
||||
foreach my $key ( keys %$mbss_mac_addr ) {
|
||||
my ( $interface, @idx ) = split( /\./, $key );
|
||||
$map->{ pack( "C*", @idx ) } = $mbss_mac_addr->{$key};
|
||||
}
|
||||
|
||||
my $i_ssidlist = $aironet->i_ssidlist();
|
||||
my $i_ssidmac = {};
|
||||
foreach my $key ( keys %$i_ssidlist ) {
|
||||
$i_ssidmac->{$key} = $map->{ $i_ssidlist->{$key} };
|
||||
}
|
||||
return $i_ssidmac;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Aironet - SNMP Interface to Cisco Aironet devices running IOS.
|
||||
SNMP::Info::Layer2::Aironet - SNMP Interface to Cisco Aironet devices running
|
||||
IOS.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -124,7 +475,6 @@ Max Baker (C<max@warped.org>)
|
||||
my $aironet = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
@@ -136,7 +486,8 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides interface to SNMP Data available on newer Aironet devices running Cisco IOS.
|
||||
Provides interface to SNMP Data available on newer Aironet devices running
|
||||
Cisco IOS.
|
||||
|
||||
Note there are two classes for Aironet devices :
|
||||
|
||||
@@ -152,8 +503,8 @@ This class is for devices running Cisco IOS software (newer)
|
||||
|
||||
=back
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $aironet = new SNMP::Info::Layer2::Aironet(...);
|
||||
|
||||
@@ -167,6 +518,10 @@ my $aironet = new SNMP::Info::Layer2::Aironet(...);
|
||||
|
||||
=item SNMP::Info::EtherLike
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
@@ -191,23 +546,47 @@ Adds info from method e_descr() from SNMP::Info::Entity
|
||||
|
||||
=item $aironet->vendor()
|
||||
|
||||
Returns 'cisco' :)
|
||||
Returns 'cisco'
|
||||
|
||||
=item $aironet->description()
|
||||
|
||||
System description
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Entity
|
||||
|
||||
See documentation in SNMP::Info::Entity for details.
|
||||
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::EtherLike
|
||||
|
||||
See documentation in SNMP::Info::EtherLike for details.
|
||||
See documentation in L<SNMP::Info::EtherLike/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=over
|
||||
|
||||
=item $aironet->cd11_port()
|
||||
|
||||
Returns radio interfaces.
|
||||
|
||||
=item $aironet->cd11_mac()
|
||||
|
||||
Returns client radio interface MAC addresses.
|
||||
|
||||
=item $aironet->cd11_ssid()
|
||||
|
||||
Returns radio interface ssid.
|
||||
|
||||
=item $aironet->dot11_cur_tx_pwr_mw()
|
||||
|
||||
Current transmit power, in milliwatts, of the radio interface.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
@@ -217,22 +596,80 @@ See documentation in SNMP::Info::EtherLike for details.
|
||||
|
||||
Uses the i_description() field.
|
||||
|
||||
=item $aironet->i_mac()
|
||||
|
||||
MAC address of the interface. Note this is just the MAC of the port, not
|
||||
anything connected to it.
|
||||
|
||||
=item $aironet->i_duplex()
|
||||
|
||||
Crosses information from SNMP::Info::EtherLike to get duplex info for interfaces.
|
||||
Crosses information from SNMP::Info::EtherLike to get duplex info for
|
||||
interfaces.
|
||||
|
||||
=item $aironet->bp_index()
|
||||
|
||||
Returns reference to hash of bridge port table entries map back to interface
|
||||
identifier (iid)
|
||||
|
||||
=item $aironet->fw_mac()
|
||||
|
||||
Returns reference to hash of forwarding table MAC Addresses
|
||||
|
||||
=item $aironet->fw_port()
|
||||
|
||||
Returns reference to hash of forwarding table entries port interface
|
||||
identifier (iid)
|
||||
|
||||
=item $aironet->i_vlan()
|
||||
|
||||
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
|
||||
|
||||
=item $aironet->v_index()
|
||||
|
||||
Returns VLAN IDs
|
||||
|
||||
=item $aironet->v_name()
|
||||
|
||||
Returns VLAN names
|
||||
|
||||
=item $aironet->i_ssidlist()
|
||||
|
||||
Returns a list of SSIDs associated with interfaces. This function
|
||||
is C<MBSSID> aware, so when using C<MBSSID> can map SSIDs to the sub-interface
|
||||
to which they belong.
|
||||
|
||||
=item $aironet->i_ssidbcast()
|
||||
|
||||
With the same keys as i_ssidlist, returns whether the given SSID is
|
||||
being broadcast.
|
||||
|
||||
=item $aironet->i_ssidmac()
|
||||
|
||||
With the same keys as i_ssidlist, returns the Basic service set
|
||||
identification (BSSID), MAC address, the AP is using for the SSID.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Entity
|
||||
|
||||
See documentation in SNMP::Info::Entity for details.
|
||||
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::EtherLike
|
||||
|
||||
See documentation in SNMP::Info::EtherLike for details.
|
||||
See documentation in L<SNMP::Info::EtherLike/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 Data Munging Callback Subroutines
|
||||
|
||||
=over
|
||||
|
||||
=item $aironet->munge_cd11_txrate()
|
||||
|
||||
Converts units of half a megabit to human readable string.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
240
Info/Layer2/Allied.pm
Normal file
240
Info/Layer2/Allied.pm
Normal file
@@ -0,0 +1,240 @@
|
||||
# SNMP::Info::Layer2::Allied
|
||||
# $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::Allied;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::Layer1;
|
||||
|
||||
@SNMP::Info::Layer2::Allied::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Allied::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
'ip_adresses' => 'atNetAddress',
|
||||
'ip_mac' => 'atPhysAddress',
|
||||
);
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
'AtiSwitch-MIB' => 'atiswitchProductType',
|
||||
'AtiStackInfo-MIB' => 'atiswitchEnhancedStacking',
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'allied';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'allied';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $allied = shift;
|
||||
my $descr = $allied->description();
|
||||
|
||||
if ( $descr =~ m/version (\d+\.\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $allied = shift;
|
||||
|
||||
my $desc = $allied->description();
|
||||
|
||||
if ( $desc =~ /(AT-80\d{2}\S*)/ ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub root_ip {
|
||||
my $allied = shift;
|
||||
my $ip_hash = $allied->ip_addresses();
|
||||
my $found_ip;
|
||||
|
||||
foreach my $ip ( values %{$ip_hash} ) {
|
||||
$found_ip = SNMP::Info::munge_ip($ip) if ( defined $ip );
|
||||
last; # this is only one IP address
|
||||
}
|
||||
return $found_ip;
|
||||
}
|
||||
|
||||
sub mac {
|
||||
my $allied = shift;
|
||||
my $mac_hash = $allied->ip_mac();
|
||||
my $found_mac;
|
||||
|
||||
foreach my $mac ( values %{$mac_hash} ) {
|
||||
$found_mac = SNMP::Info::munge_mac($mac);
|
||||
last; # this is only one MAC address
|
||||
}
|
||||
return $found_mac;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $allied = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_up = SNMP::Info::Layer1::i_up( $allied, $partial );
|
||||
|
||||
foreach my $port ( keys %$i_up ) {
|
||||
my $up = $i_up->{$port};
|
||||
$i_up->{$port} = 'down' if $up eq 'linktesterror';
|
||||
$i_up->{$port} = 'up' if $up eq 'nolinktesterror';
|
||||
}
|
||||
|
||||
return $i_up;
|
||||
}
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Allied - SNMP Interface to Allied Telesis switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker, Dmitry Sergienko <dmitry@trifle.net>
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $allied = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myhub',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $allied->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Allied device through SNMP. See inherited classes' documentation for
|
||||
inherited methods.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<AtiSwitch-MIB>
|
||||
|
||||
=item F<AtiStackInfo-MIB>
|
||||
|
||||
Download for your device from ftp://ftp.allied-telesyn.com/pub/switches/mibs/
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $allied->vendor()
|
||||
|
||||
Returns 'allied' :)
|
||||
|
||||
=item $allied->os()
|
||||
|
||||
Returns 'allied'
|
||||
|
||||
=item $allied->os_ver()
|
||||
|
||||
Culls Version from description()
|
||||
|
||||
=item $allied->root_ip()
|
||||
|
||||
Returns IP Address of Managed Device.
|
||||
|
||||
(C<actualIpAddr>)
|
||||
|
||||
=item $allied->model()
|
||||
|
||||
Tries to cull out C<AT-nnnnX> out of the description field.
|
||||
|
||||
=item $allied->mac()
|
||||
|
||||
Returns device MAC.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $allied->i_up()
|
||||
|
||||
Returns reference to map of IIDs to link status. Changes
|
||||
the values of ati_up() to 'up' and 'down'.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
@@ -1,479 +0,0 @@
|
||||
# SNMP::Info::Layer2::Bay
|
||||
# Max Baker <max@warped.org>
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Bay;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::Bay::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Bay::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS,
|
||||
'cdp_id' => 's5EnMsTopIpAddr',
|
||||
'cdp_run' => 's5EnMsTopStatus',
|
||||
);
|
||||
|
||||
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
|
||||
'imac2' => 'ifPhysAddress',
|
||||
# S5-ETH-MULTISEG-TOPOLOGY-MIB::s5EnMsTopNmmTable
|
||||
'bay_topo_slot' => 's5EnMsTopNmmSlot',
|
||||
'bay_topo_port' => 's5EnMsTopNmmPort',
|
||||
'bay_topo_ip' => 's5EnMsTopNmmIpAddr',
|
||||
'bay_topo_seg' => 's5EnMsTopNmmSegId',
|
||||
'bay_topo_mac' => 's5EnMsTopNmmMacAddr',
|
||||
'bay_topo_platform' => 's5EnMsTopNmmChassisType',
|
||||
'bay_topo_localseg' => 's5EnMsTopNmmLocalSeg',
|
||||
);
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
'SYNOPTICS-ROOT-MIB' => 'synoptics',
|
||||
'S5-ETH-MULTISEG-TOPOLOGY-MIB' => 's5EnMsTop'
|
||||
);
|
||||
|
||||
delete $MIBS{'CISCO-CDP-MIB'};
|
||||
# 450's report full duplex as speed = 20mbps?!
|
||||
$SNMP::Info::SPEED_MAP{20_000_000} = '10 Mbps';
|
||||
$SNMP::Info::SPEED_MAP{200_000_000} = '100 Mbps';
|
||||
|
||||
%MUNGE = (%SNMP::Info::Layer2::MUNGE,
|
||||
'i_mac2' => \&SNMP::Info::munge_mac ,
|
||||
);
|
||||
|
||||
sub os {
|
||||
return 'bay';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $bay = shift;
|
||||
my $descr = $bay->description();
|
||||
|
||||
# 303 / 304
|
||||
if ($descr =~ m/Rev: \d+\.\d+\.\d+\.\d+-(\d+\.\d+\.\d+\.\d+)/){
|
||||
return $1;
|
||||
}
|
||||
|
||||
# 450
|
||||
if ($descr =~ m/SW:v(\d+\.\d+\.\d+\.\d+)/){
|
||||
return $1;
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub os_bin {
|
||||
my $bay = shift;
|
||||
my $descr = $bay->description();
|
||||
|
||||
# 303 / 304
|
||||
if ($descr =~ m/Rev: \d+\.(\d+\.\d+\.\d+)-\d+\.\d+\.\d+\.\d+/){
|
||||
return $1;
|
||||
}
|
||||
|
||||
# 450
|
||||
if ($descr =~ m/FW:v(\d+\.\d+\.\d+\.\d+)/){
|
||||
return $1;
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
# or nortel, or synopsis?
|
||||
return 'bay';
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $bay = shift;
|
||||
my $descr = $bay->description();
|
||||
|
||||
my $i_type = $bay->i_type();
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if (keys %$i_type){
|
||||
my $type = $i_type->{$if};
|
||||
$i_ignore{$if}++ if $type =~ /(loopback|propvirtual|cpu)/i;
|
||||
}
|
||||
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $bay = shift;
|
||||
my $i_index = $bay->i_index();
|
||||
|
||||
return $i_index;
|
||||
}
|
||||
|
||||
sub i_mac {
|
||||
my $bay = shift;
|
||||
my $i_mac = $bay->i_mac2();
|
||||
|
||||
# Bay 303's with a hw rev < 2.11.4.5 report the mac as all zeros
|
||||
foreach my $iid (keys %$i_mac){
|
||||
my $mac = $i_mac->{$iid};
|
||||
delete $i_mac->{$iid} if $mac eq '00:00:00:00:00:00';
|
||||
}
|
||||
return $i_mac;
|
||||
}
|
||||
|
||||
|
||||
sub model {
|
||||
my $bay = shift;
|
||||
my $id = $bay->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
$model =~ s/^sreg-//i;
|
||||
|
||||
my $descr = $bay->description();
|
||||
|
||||
return '303' if ($descr =~ /\D303\D/);
|
||||
return '304' if ($descr =~ /\D304\D/);
|
||||
return '450' if ($model =~ /BayStack450/);
|
||||
return $model;
|
||||
}
|
||||
|
||||
# Hack in some CDP type stuff
|
||||
|
||||
sub c_if {
|
||||
my $bay = shift;
|
||||
my $bay_topo_port = $bay->bay_topo_port();
|
||||
|
||||
my %c_if;
|
||||
foreach my $entry (keys %$bay_topo_port){
|
||||
my $port = $bay_topo_port->{$entry};
|
||||
next unless defined $port;
|
||||
next if $port == 0;
|
||||
$c_if{"$port.1"} = $port;
|
||||
}
|
||||
return \%c_if;
|
||||
}
|
||||
|
||||
sub c_ip {
|
||||
my $bay = shift;
|
||||
my $bay_topo_ip = $bay->bay_topo_ip();
|
||||
my $bay_topo_port = $bay->bay_topo_port();
|
||||
my $ip = $bay->cdp_ip();
|
||||
|
||||
# Count the number of devices seen on each port.
|
||||
# more than one device seen means connected to a non-bay
|
||||
# device, but other bay devices are squawking further away.
|
||||
my %ip_port;
|
||||
foreach my $entry (keys %$bay_topo_ip){
|
||||
my $port = $bay_topo_port->{$entry};
|
||||
next unless defined $port;
|
||||
next if $port == 0;
|
||||
my $ip = $bay_topo_ip->{$entry};
|
||||
push(@{$ip_port{$port}},$ip);
|
||||
}
|
||||
|
||||
my %c_ip;
|
||||
foreach my $port (keys %ip_port){
|
||||
my $ips = $ip_port{$port};
|
||||
if (scalar @$ips == 1) {
|
||||
$c_ip{"$port.1"} = $ips->[0];
|
||||
} else {
|
||||
$c_ip{"$port.1"} = $ips;
|
||||
}
|
||||
}
|
||||
|
||||
return \%c_ip;
|
||||
}
|
||||
|
||||
sub c_port {
|
||||
my $bay = shift;
|
||||
my $bay_topo_port = $bay->bay_topo_port();
|
||||
my $bay_topo_seg = $bay->bay_topo_seg();
|
||||
|
||||
my %c_port;
|
||||
foreach my $entry (keys %$bay_topo_seg){
|
||||
my $port = $bay_topo_port->{$entry};
|
||||
next unless defined $port;
|
||||
next if $port == 0;
|
||||
|
||||
# For fake remotes (multiple IPs for a c_ip), use first found
|
||||
next if defined $c_port{"$port.1"};
|
||||
|
||||
my $seg = $bay_topo_seg->{$entry};
|
||||
|
||||
# Segment id is (256 * remote slot_num) + (remote_port)
|
||||
my $remote_port = $seg % 256;
|
||||
|
||||
$c_port{"$port.1"} = $remote_port;
|
||||
}
|
||||
|
||||
return \%c_port;
|
||||
}
|
||||
|
||||
sub c_platform {
|
||||
my $bay = shift;
|
||||
my $bay_topo_port = $bay->bay_topo_port();
|
||||
my $bay_topo_platform = $bay->bay_topo_platform();
|
||||
|
||||
|
||||
my %c_platform;
|
||||
foreach my $entry (keys %$bay_topo_platform){
|
||||
my $port = $bay_topo_port->{$entry};
|
||||
next if $port == 0;
|
||||
|
||||
# For fake remotes (multiple IPs for a c_ip), use first found
|
||||
next if defined $c_platform{"$port.1"};
|
||||
|
||||
my $platform = $bay_topo_platform->{$entry};
|
||||
|
||||
$c_platform{"$port.1"} = $platform;
|
||||
}
|
||||
|
||||
return \%c_platform;
|
||||
}
|
||||
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Bay - SNMP Interface to old Bay Network BayStack Switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $bay = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $bay->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Bay device through SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
|
||||
my $bay = new SNMP::Info::Layer2::Bay(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item SYNOPTICS-ROOT-MIB
|
||||
|
||||
=item S5-ETH-MULTISEG-TOPOLOGY-MIB
|
||||
|
||||
=item Inherited classes
|
||||
|
||||
MIBs required by SNMP::Info::Layer2 and its superclasses.
|
||||
|
||||
=back
|
||||
|
||||
Bay MIBs can be found on the CD that came with your product.
|
||||
|
||||
Or, if you still have a service contract they can be downloaded at
|
||||
www.nortelnetworks.com
|
||||
|
||||
They have also been seen at : http://www.inotech.com/mibs/vendor/baynetworks/synoptics/synoptics.asp
|
||||
|
||||
Or http://www.oidview.com/mibs/detail.html under Synoptics. Check also www.mibdepot.com
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $bay->vendor()
|
||||
|
||||
Returns 'bay' :)
|
||||
|
||||
=item $bay->model()
|
||||
|
||||
Cross references $bay->id() to the SYNOPTICS-MIB and returns
|
||||
the results. 303s and 304s have the same ID, so we have a hack
|
||||
to return depending on which it is.
|
||||
|
||||
Removes sreg- from the model name
|
||||
|
||||
=item $bay->cdp_id()
|
||||
|
||||
Returns the IP that the device is sending out for its Nmm topology info.
|
||||
|
||||
(B<s5EnMsTopIpAddr>)
|
||||
|
||||
=item $bay->cdp_run()
|
||||
|
||||
Returns if the S5-ETH-MULTISEG-TOPOLOGY info is on for this device.
|
||||
|
||||
(B<s5EnMsTopStatus>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $bay->interfaces()
|
||||
|
||||
Returns reference to map of IIDs to physical ports.
|
||||
|
||||
Currently simply returns the B<ifIndex>
|
||||
|
||||
=item $bay->i_ignore()
|
||||
|
||||
Returns reference to hash of IIDs to ignore.
|
||||
|
||||
Simply calls the SNMP::Info::Layer2::i_ignore() fn for this.
|
||||
|
||||
=item $bay->i_mac()
|
||||
|
||||
Returns the B<ifPhysAddress> table entries.
|
||||
|
||||
Removes all entries matching '00:00:00:00:00:00' -- Certain
|
||||
older revisions of Bay 303 and 304 firmware report all zeros
|
||||
for each port mac.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Psuedo CDP information
|
||||
|
||||
All entries with port=0 are local and ignored.
|
||||
|
||||
=over
|
||||
|
||||
=item $bay->c_if()
|
||||
|
||||
Returns referenece to hash. Key: port.1 Value: port (iid)
|
||||
|
||||
=item $bay->c_ip()
|
||||
|
||||
Returns referenece to hash. Key: port.1
|
||||
|
||||
The value of each hash entry can either be a scalar or an array.
|
||||
A scalar value is most likely a direct neighbor to that port.
|
||||
It is possible that there is a non-bay device in between this device and the remote device.
|
||||
|
||||
An array value represents a list of seen devices. The only time you will get an array
|
||||
of nieghbors, is if there is a non-bay device in between two or more devices.
|
||||
|
||||
Use the data from the Layer2 Topology Table below to dig deeper.
|
||||
|
||||
=item $bay->port()
|
||||
|
||||
Returns reference to hash. Key: port.1 Value: port
|
||||
|
||||
=item $bay->platform()
|
||||
|
||||
Returns reference to hash. Key: port.1 Value: Remote Device Type
|
||||
|
||||
=back
|
||||
|
||||
=head2 Layer2 Topology info (s5EnMsTopNmmTable)
|
||||
|
||||
=over
|
||||
|
||||
=item $bay->bay_topo_slot()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:slot number
|
||||
|
||||
(B<s5EnMsTopNmmSlot>)
|
||||
|
||||
=item $bay->bay_topo_port()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:Port Number (interface iid)
|
||||
|
||||
(B<s5EnMsTopNmmPort>)
|
||||
|
||||
=item $bay->bay_topo_ip()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:Remote IP address of entry
|
||||
|
||||
(B<s5EnMsTopNmmIpAddr>)
|
||||
|
||||
=item $bay->bay_topo_seg()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:Remote Segment ID
|
||||
|
||||
(B<s5EnMsTopNmmSegId>)
|
||||
|
||||
=item $bay->bay_topo_mac
|
||||
(B<s5EnMsTopNmmMacAddr>)
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:Remote MAC address
|
||||
|
||||
=item $bay->bay_topo_platform
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:Remote Device Type
|
||||
|
||||
(B<s5EnMsTopNmmChassisType>)
|
||||
|
||||
=item $bay->bay_topo_localseg
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:Boolean, if bay_topo_seg() is local
|
||||
|
||||
(B<s5EnMsTopNmmLocalSeg>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
|
||||
=cut
|
||||
606
Info/Layer2/Baystack.pm
Normal file
606
Info/Layer2/Baystack.pm
Normal file
@@ -0,0 +1,606 @@
|
||||
# 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.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS, %SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::RapidCity::MIBS, %SNMP::Info::NortelStack::MIBS,
|
||||
%SNMP::Info::SONMP::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS, %SNMP::Info::LLDP::GLOBALS,
|
||||
%SNMP::Info::RapidCity::GLOBALS, %SNMP::Info::NortelStack::GLOBALS,
|
||||
%SNMP::Info::SONMP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::LLDP::FUNCS,
|
||||
%SNMP::Info::RapidCity::FUNCS, %SNMP::Info::NortelStack::FUNCS,
|
||||
%SNMP::Info::SONMP::FUNCS,
|
||||
);
|
||||
|
||||
# 450's report full duplex as speed = 20mbps?!
|
||||
$SNMP::Info::SPEED_MAP{20_000_000} = '10 Mbps';
|
||||
$SNMP::Info::SPEED_MAP{200_000_000} = '100 Mbps';
|
||||
$SNMP::Info::SPEED_MAP{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)-?//;
|
||||
|
||||
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 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 $poe->peth_port_ifindex()
|
||||
|
||||
Maps the C<pethPsePortTable> to C<ifIndex> by way of the F<ENTITY-MIB>.
|
||||
|
||||
=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,77 +1,100 @@
|
||||
# SNMP::Info::Layer2::C1900
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::C1900;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
use strict;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::C1900::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::C1900::ISA = qw/SNMP::Info::CDP SNMP::Info::CiscoStats
|
||||
SNMP::Info::CiscoConfig SNMP::Info::Layer2
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer2::C1900::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
'c1900_flash_status' => 'upgradeFlashBankStatus',
|
||||
);
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
'c1900_flash_status' => 'upgradeFlashBankStatus',
|
||||
);
|
||||
|
||||
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
|
||||
'i_type2' => 'ifType',
|
||||
'i_name2' => 'ifName',
|
||||
# ESSWITCH-MIB
|
||||
'c1900_p_index' => 'swPortIndex',
|
||||
'c1900_p_ifindex' => 'swPortIfIndex',
|
||||
'c1900_p_duplex' => 'swPortDuplexStatus',
|
||||
'c1900_p_duplex_admin' => 'swPortFullDuplex',
|
||||
'c1900_p_name' => 'swPortName',
|
||||
'c1900_p_up_admin' => 'swPortAdminStatus',
|
||||
'c1900_p_type' => 'swPortMediaCapability',
|
||||
'c1900_p_media' => 'swPortConnectorType',
|
||||
);
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
# Also known as the ESSWITCH-MIB
|
||||
'STAND-ALONE-ETHERNET-SWITCH-MIB' => 'series2000'
|
||||
);
|
||||
# ESSWITCH-MIB
|
||||
'c1900_p_index' => 'swPortIndex',
|
||||
'c1900_p_ifindex' => 'swPortIfIndex',
|
||||
'c1900_p_duplex' => 'swPortDuplexStatus',
|
||||
'c1900_p_duplex_admin' => 'swPortFullDuplex',
|
||||
'c1900_p_name' => 'swPortName',
|
||||
'c1900_p_up_admin' => 'swPortAdminStatus',
|
||||
'c1900_p_type' => 'swPortMediaCapability',
|
||||
'c1900_p_media' => 'swPortConnectorType',
|
||||
);
|
||||
|
||||
%MUNGE = (%SNMP::Info::Layer2::MUNGE,
|
||||
);
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
|
||||
# Also known as the ESSWITCH-MIB
|
||||
'STAND-ALONE-ETHERNET-SWITCH-MIB' => 'series2000'
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
|
||||
);
|
||||
|
||||
sub bulkwalk_no { return 1; }
|
||||
sub cisco_comm_indexing { return 1; }
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'catalyst';
|
||||
}
|
||||
@@ -82,122 +105,175 @@ sub os_ver {
|
||||
# Check for superclass one
|
||||
my $os_ver = $c1900->SUPER::os_ver();
|
||||
return $os_ver if defined $os_ver;
|
||||
|
||||
my $c1900_flash_status = $c1900->c1900_flash_status();
|
||||
return undef unless defined $c1900_flash_status;
|
||||
|
||||
if ($c1900_flash_status =~ m/V(\d+\.\d+(\.\d+)?)/){
|
||||
my $c1900_flash_status = $c1900->c1900_flash_status();
|
||||
return unless defined $c1900_flash_status;
|
||||
|
||||
if ( $c1900_flash_status =~ m/V(\d+\.\d+(\.\d+)?)/ ) {
|
||||
return $1;
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $c1900 = shift;
|
||||
my $i_descr = $c1900->i_description();
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
foreach my $iid (keys %$i_descr){
|
||||
my $i_descr = $c1900->i_description($partial) || {};
|
||||
|
||||
foreach my $iid ( keys %$i_descr ) {
|
||||
$i_descr->{$iid} =~ s/\s*$//;
|
||||
}
|
||||
return $i_descr;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $c1900 = shift;
|
||||
|
||||
my $interfaces = $c1900->interfaces();
|
||||
my $c1900_p_index = $c1900->c1900_p_index();
|
||||
my $c1900_p_duplex = $c1900->c1900_p_duplex();
|
||||
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my %reverse_1900 = reverse %$c1900_p_index;
|
||||
my $c1900_p_duplex = $c1900->c1900_p_duplex($partial) || {};
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $if (keys %$interfaces){
|
||||
my $port_1900 = $reverse_1900{$if};
|
||||
next unless defined $port_1900;
|
||||
my $duplex = $c1900_p_duplex->{$port_1900};
|
||||
next unless defined $duplex;
|
||||
|
||||
foreach my $if ( keys %$c1900_p_duplex ) {
|
||||
my $duplex = $c1900_p_duplex->{$if};
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /half/i;
|
||||
$duplex = 'full' if $duplex =~ /full/i;
|
||||
$i_duplex{$if}=$duplex;
|
||||
$i_duplex{$if} = $duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $c1900 = shift;
|
||||
|
||||
my $interfaces = $c1900->interfaces();
|
||||
my $c1900_p_index = $c1900->c1900_p_index();
|
||||
my $c1900_p_admin = $c1900->c1900_p_duplex_admin();
|
||||
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my %reverse_1900 = reverse %$c1900_p_index;
|
||||
my $c1900_p_admin = $c1900->c1900_p_duplex_admin($partial) || {};
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $if (keys %$interfaces){
|
||||
my $port_1900 = $reverse_1900{$if};
|
||||
next unless defined $port_1900;
|
||||
my $duplex = $c1900_p_admin->{$port_1900};
|
||||
next unless defined $duplex;
|
||||
|
||||
foreach my $if ( keys %$c1900_p_admin ) {
|
||||
my $duplex = $c1900_p_admin->{$if};
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /disabled/i;
|
||||
$duplex = 'full' if $duplex =~ /flow control/i;
|
||||
$duplex = 'full' if $duplex =~ /enabled/i;
|
||||
$duplex = 'auto' if $duplex =~ /auto/i;
|
||||
$i_duplex_admin{$if}=$duplex;
|
||||
$i_duplex_admin{$if} = $duplex;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
sub i_type {
|
||||
my $c1900 = shift;
|
||||
|
||||
my $i_type = $c1900->i_type2();
|
||||
my $c1900_p_index = $c1900->c1900_p_index();
|
||||
my $c1900_p_type = $c1900->c1900_p_type();
|
||||
my $c1900_p_media = $c1900->c1900_p_media();
|
||||
|
||||
foreach my $p_iid (keys %$c1900_p_index){
|
||||
my $port = $c1900_p_index->{$p_iid};
|
||||
my $type = $c1900_p_type->{$p_iid};
|
||||
my $media = $c1900_p_media->{$p_iid};
|
||||
|
||||
next unless defined $port;
|
||||
next unless defined $type;
|
||||
next unless defined $media;
|
||||
|
||||
$i_type->{$port} = "$type $media";
|
||||
}
|
||||
|
||||
return $i_type;
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $c1900 = shift;
|
||||
my $i_name = $c1900->i_name2();
|
||||
my $c1900_p_name = $c1900->c1900_p_name();
|
||||
|
||||
foreach my $port (keys %$c1900_p_name){
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_name = $c1900->orig_i_name($partial) || {};
|
||||
my $c1900_p_name = $c1900->c1900_p_name($partial) || {};
|
||||
|
||||
foreach my $port ( keys %$c1900_p_name ) {
|
||||
my $name = $c1900_p_name->{$port};
|
||||
next unless defined $name;
|
||||
next unless $name !~ /^\s*$/;
|
||||
$i_name->{$port} = $name;
|
||||
}
|
||||
|
||||
|
||||
return $i_name;
|
||||
}
|
||||
|
||||
sub set_i_duplex_admin {
|
||||
my $c1900 = shift;
|
||||
my ( $duplex, $port ) = @_;
|
||||
|
||||
# map a textual duplex to an integer one the switch understands
|
||||
my %duplexes = qw/full 1 half 2 auto 3/;
|
||||
|
||||
my $iid = $c1900->c1900_p_ifindex($port);
|
||||
|
||||
$duplex = lc($duplex);
|
||||
|
||||
return 0 unless defined $duplexes{$duplex};
|
||||
|
||||
return $c1900->set_c1900_p_duplex_admin( $duplexes{$duplex}, $iid );
|
||||
}
|
||||
|
||||
sub i_vlan {
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# Overlap allows more than one VLAN per port. Unable to determine default
|
||||
my $overlap = $c1900->bridgeGroupAllowMembershipOverlap()
|
||||
|| $c1900->vlanAllowMembershipOverlap()
|
||||
|| 'disabled';
|
||||
|
||||
if ( $overlap eq 'enabled' ) {
|
||||
return;
|
||||
}
|
||||
|
||||
my $member_of = $c1900->bridgeGroupMemberPortOfBridgeGroup()
|
||||
|| $c1900->vlanMemberPortOfVlan();
|
||||
|
||||
my $i_pvid = {};
|
||||
foreach my $idx ( keys %$member_of ) {
|
||||
my @values = split( /\./, $idx );
|
||||
my ( $vlan, $port ) = @values;
|
||||
next unless $vlan;
|
||||
next unless $port;
|
||||
next if ( defined $partial and $port !~ /^$partial$/ );
|
||||
my $value = $member_of->{$idx};
|
||||
next if ( $value eq 'false' );
|
||||
|
||||
$i_pvid->{$port} = $vlan;
|
||||
}
|
||||
return $i_pvid;
|
||||
}
|
||||
|
||||
sub i_vlan_membership {
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $member_of = $c1900->bridgeGroupMemberPortOfBridgeGroup()
|
||||
|| $c1900->vlanMemberPortOfVlan();
|
||||
|
||||
my $i_vlan_membership = {};
|
||||
foreach my $idx ( keys %$member_of ) {
|
||||
my @values = split( /\./, $idx );
|
||||
my ( $vlan, $port ) = @values;
|
||||
next unless $vlan;
|
||||
next unless $port;
|
||||
next if ( defined $partial and $port !~ /^$partial$/ );
|
||||
my $value = $member_of->{$idx};
|
||||
next if ( $value eq 'false' );
|
||||
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan );
|
||||
}
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
sub bp_index {
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $if_index = $c1900->i_index($partial);
|
||||
my $index = $c1900->orig_bp_index($partial) || {};
|
||||
foreach my $iid ( keys %$if_index ) {
|
||||
$index->{$iid} = $iid if(!defined $index->{$iid});
|
||||
}
|
||||
return $index;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::C1900 - Perl5 Interface to SNMP data from Cisco Catlyst 1900 Network Switches running CatOS
|
||||
SNMP::Info::Layer2::C1900 - SNMP Interface to data from Cisco Catalyst 1900
|
||||
Network Switches running CatOS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -205,7 +281,6 @@ Max Baker (C<max@warped.org>)
|
||||
my $c1900 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
@@ -217,13 +292,13 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a Catalyst 1900 device through SNMP.
|
||||
See SNMP::Info for full documentation
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Catalyst 1900 device through SNMP. See SNMP::Info for full documentation
|
||||
|
||||
Note that most of these devices only talk SNMP version 1, but not all.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $c1900 = new SNMP::Info::Layer2::C1900(...);
|
||||
|
||||
@@ -231,6 +306,12 @@ a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
@@ -239,18 +320,24 @@ a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item STAND-ALONE-ETHERNET-SWITCH-MIB (ESSWITCH-MIB)
|
||||
=item F<STAND-ALONE-ETHERNET-SWITCH-MIB (ESSWITCH-MIB)>
|
||||
|
||||
ESSWITCH-MIB is included in the Version 1 MIBS from Cisco.
|
||||
F<ESSWITCH-MIB> is included in the Version 1 MIBs from Cisco.
|
||||
|
||||
They can be found at ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
MIBs listed in SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
@@ -262,7 +349,7 @@ These are methods that return scalar value from SNMP
|
||||
Usually contains the version of the software loaded in flash.
|
||||
Used by os_ver()
|
||||
|
||||
B<STAND-ALONE-ETHERNET-SWITCH-MIB::upgradeFlashBankStatus>
|
||||
C<STAND-ALONE-ETHERNET-SWITCH-MIB::upgradeFlashBankStatus>
|
||||
|
||||
=item $c1900->os()
|
||||
|
||||
@@ -281,43 +368,92 @@ Returns 'cisco' :)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $c1900->cisco_comm_indexing()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
|
||||
=item $c1900->bulkwalk_no
|
||||
|
||||
Return C<1>. Bulkwalk is turned off for this class.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $c1900->interfaces()
|
||||
|
||||
Returns reference to the map between IID and physical Port.
|
||||
|
||||
=item $c1900->i_duplex()
|
||||
|
||||
Returns reference to map of IIDs to current link duplex
|
||||
|
||||
Crosses $c1900->c1900_p_index() with $c1900->c1900_p_duplex;
|
||||
|
||||
=item $c1900->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of IIDs to admin duplex setting
|
||||
|
||||
Crosses $c1900->c1900_p_index() with $c1900->c1900_p_duplex_admin;
|
||||
|
||||
=item $c1900->i_name()
|
||||
|
||||
Crosses ifName with c1900_p_name() and returns the human set port name if exists.
|
||||
Crosses C<ifName> with $c1900->c1900_p_name() and returns the human set port
|
||||
name if exists.
|
||||
|
||||
=item $c1900->i_type()
|
||||
=item $c1900->i_vlan()
|
||||
|
||||
Returns reference to hash of IID to port type
|
||||
Returns a mapping between the interface and the VLAN / bridge group if overlap
|
||||
is not enabled.
|
||||
|
||||
Takes the default ifType and overrides it with
|
||||
=item $c1900->i_vlan_membership()
|
||||
|
||||
c1900_p_type() and c1900_p_media() if they exist.
|
||||
Returns reference to hash of arrays: key = interface, value = array of VLAN /
|
||||
bridge group IDs.
|
||||
|
||||
Example:
|
||||
my $interfaces = $c1900->interfaces();
|
||||
my $vlans = $c1900->i_vlan_membership();
|
||||
|
||||
foreach my $iid (sort keys %$interfaces) {
|
||||
my $port = $interfaces->{$iid};
|
||||
my $vlan = join(',', sort(@{$vlans->{$iid}}));
|
||||
print "Port: $port VLAN: $vlan\n";
|
||||
}
|
||||
|
||||
|
||||
=item $c1900->bp_index()
|
||||
|
||||
Returns a bp_index that contains the original bp_index entries and extra
|
||||
entries for those interfaces listed in if_index, as some C1900 devices do not
|
||||
return complete bp_indexes.
|
||||
|
||||
=back
|
||||
|
||||
=head2 STAND-ALONE-ETHERNET-SWITCH-MIB Switch Port Table Entries:
|
||||
=head2 F<STAND-ALONE-ETHERNET-SWITCH-MIB> Switch Port Table Entries:
|
||||
|
||||
=over
|
||||
|
||||
@@ -325,48 +461,81 @@ c1900_p_type() and c1900_p_media() if they exist.
|
||||
|
||||
Maps the Switch Port Table to the IID
|
||||
|
||||
B<swPortIfIndex>
|
||||
C<swPortIfIndex>
|
||||
|
||||
=item $c1900->c1900_p_duplex()
|
||||
|
||||
Gives Port Duplex Info
|
||||
|
||||
B<swPortDuplexStatus>
|
||||
(C<swPortDuplexStatus>)
|
||||
|
||||
=item $c1900->c1900_p_duplex_admin()
|
||||
|
||||
Gives admin setting for Duplex Info
|
||||
|
||||
B<swPortFullDuplex>
|
||||
(C<swPortFullDuplex>)
|
||||
|
||||
=item $c1900->c1900_p_name()
|
||||
|
||||
Gives human set name for port
|
||||
|
||||
B<swPortName>
|
||||
(C<swPortName>)
|
||||
|
||||
=item $c1900->c1900_p_up_admin()
|
||||
|
||||
Gives Admin status of port enabled.
|
||||
|
||||
B<swPortAdminStatus>
|
||||
(C<swPortAdminStatus>)
|
||||
|
||||
=item $c1900->c1900_p_type()
|
||||
|
||||
Gives Type of port, ie. "general-ethernet"
|
||||
Gives Type of port, i.e. C<"general-ethernet">
|
||||
|
||||
B<swPortMediaCapability>
|
||||
(C<swPortMediaCapability>)
|
||||
|
||||
=item $c1900->c1900_p_media()
|
||||
|
||||
Gives the media of the port , ie "fiber-sc"
|
||||
Gives the media of the port , i.e. "C<fiber-sc>"
|
||||
|
||||
B<swPortConnectorType>
|
||||
(C<swPortConnectorType>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 SET METHODS
|
||||
|
||||
These are methods that provide SNMP set functionality for overridden methods
|
||||
or provide a simpler interface to complex set operations. See
|
||||
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
|
||||
operations.
|
||||
|
||||
=over
|
||||
|
||||
=item $c1900->set_i_duplex_admin(duplex, ifIndex)
|
||||
|
||||
Sets port duplex, must be supplied with duplex and port C<ifIndex>. Speed
|
||||
choices are 'auto', 'half', 'full'.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$c1900->interfaces()};
|
||||
$c1900->set_i_duplex_admin('auto', $if_map{'1'})
|
||||
or die "Couldn't change port duplex. ",$c1900->error(1);
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,163 +1,232 @@
|
||||
# SNMP::Info::Layer2::C2900
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::C2900;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
use strict;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
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 Exporter/;
|
||||
@SNMP::Info::Layer2::C2900::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
|
||||
SNMP::Info::CiscoStats SNMP::Info::CiscoConfig
|
||||
SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::C2900::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS
|
||||
);
|
||||
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS, %SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
|
||||
# C2900PortEntry
|
||||
'c2900_p_index' => 'c2900PortIfIndex',
|
||||
'c2900_p_duplex' => 'c2900PortDuplexStatus',
|
||||
'c2900_p_duplex_admin' => 'c2900PortDuplexState',
|
||||
'c2900_p_speed_admin' => 'c2900PortAdminSpeed',
|
||||
);
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
'i_name' => 'ifAlias',
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
'CISCO-C2900-MIB' => 'ciscoC2900MIB'
|
||||
);
|
||||
# C2900PortEntry
|
||||
'c2900_p_index' => 'c2900PortIfIndex',
|
||||
'c2900_p_duplex' => 'c2900PortDuplexStatus',
|
||||
'c2900_p_duplex_admin' => 'c2900PortDuplexState',
|
||||
'c2900_p_speed_admin' => 'c2900PortAdminSpeed',
|
||||
);
|
||||
|
||||
%MUNGE = (%SNMP::Info::Layer2::MUNGE,
|
||||
);
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS, %SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS, %SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS, 'CISCO-C2900-MIB' => 'ciscoC2900MIB',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub cisco_comm_indexing {
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $c2900 = shift;
|
||||
|
||||
my $interfaces = $c2900->interfaces();
|
||||
my $c2900_p_index = $c2900->c2900_p_index();
|
||||
my $c2900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $c2900->interfaces($partial);
|
||||
my $c2900_p_index = $c2900->c2900_p_index() || {};
|
||||
my $c2900_p_duplex = $c2900->c2900_p_duplex();
|
||||
|
||||
|
||||
my %reverse_2900 = reverse %$c2900_p_index;
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $if (keys %$interfaces){
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
my $port_2900 = $reverse_2900{$if};
|
||||
next unless defined $port_2900;
|
||||
my $duplex = $c2900_p_duplex->{$port_2900};
|
||||
next unless defined $duplex;
|
||||
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /half/i;
|
||||
$duplex = 'full' if $duplex =~ /full/i;
|
||||
$i_duplex{$if}=$duplex;
|
||||
$i_duplex{$if} = $duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $c2900 = shift;
|
||||
|
||||
my $interfaces = $c2900->interfaces();
|
||||
my $c2900_p_index = $c2900->c2900_p_index();
|
||||
my $c2900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $c2900->interfaces($partial);
|
||||
my $c2900_p_index = $c2900->c2900_p_index() || {};
|
||||
my $c2900_p_admin = $c2900->c2900_p_duplex_admin();
|
||||
|
||||
|
||||
my %reverse_2900 = reverse %$c2900_p_index;
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $if (keys %$interfaces){
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
my $port_2900 = $reverse_2900{$if};
|
||||
next unless defined $port_2900;
|
||||
my $duplex = $c2900_p_admin->{$port_2900};
|
||||
next unless defined $duplex;
|
||||
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /half/i;
|
||||
$duplex = 'full' if $duplex =~ /full/i;
|
||||
$duplex = 'auto' if $duplex =~ /auto/i;
|
||||
$i_duplex_admin{$if}=$duplex;
|
||||
$i_duplex_admin{$if} = $duplex;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
sub set_i_speed_admin {
|
||||
my $c2900 = shift;
|
||||
my ( $speed, $iid ) = @_;
|
||||
|
||||
# map speeds to those the switch will understand
|
||||
my %speeds = qw/auto 1 10 10000000 100 100000000/;
|
||||
|
||||
my $c2900_p_index = $c2900->c2900_p_index() || {};
|
||||
my %reverse_2900 = reverse %$c2900_p_index;
|
||||
|
||||
$speed = lc($speed);
|
||||
|
||||
return unless defined $speeds{$speed};
|
||||
|
||||
# account for weirdness of c2900 mib
|
||||
$iid = $reverse_2900{$iid};
|
||||
|
||||
return $c2900->set_c2900_p_speed_admin( $speeds{$speed}, $iid );
|
||||
}
|
||||
|
||||
sub set_i_duplex_admin {
|
||||
my $c2900 = shift;
|
||||
my ( $duplex, $iid ) = @_;
|
||||
|
||||
# map a textual duplex to an integer one the switch understands
|
||||
my %duplexes = qw/full 1 half 2 auto 3/;
|
||||
|
||||
my $c2900_p_index = $c2900->c2900_p_index() || {};
|
||||
my %reverse_2900 = reverse %$c2900_p_index;
|
||||
|
||||
$duplex = lc($duplex);
|
||||
|
||||
return unless defined $duplexes{$duplex};
|
||||
|
||||
# account for weirdness of c2900 mib
|
||||
$iid = $reverse_2900{$iid};
|
||||
|
||||
return $c2900->set_c2900_p_duplex_admin( $duplexes{$duplex}, $iid );
|
||||
}
|
||||
|
||||
# Use i_descritption for port key, cuz i_name can be manually entered.
|
||||
sub interfaces {
|
||||
my $c2900 = shift;
|
||||
my $interfaces = $c2900->i_index();
|
||||
my $i_descr = $c2900->i_description();
|
||||
my $c2900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $c2900->i_index($partial) || {};
|
||||
my $i_descr = $c2900->i_description($partial) || {};
|
||||
|
||||
my %if;
|
||||
foreach my $iid (keys %$interfaces){
|
||||
foreach my $iid ( keys %$interfaces ) {
|
||||
my $port = $i_descr->{$iid};
|
||||
next unless defined $port;
|
||||
|
||||
$port =~ s/\./\//g if( $port =~ /\d+\.\d+$/);
|
||||
$port =~ s/\./\//g if ( $port =~ /\d+\.\d+$/ );
|
||||
$port =~ s/[^\d\/,()\w]+//gi;
|
||||
|
||||
|
||||
$if{$iid} = $port;
|
||||
}
|
||||
|
||||
return \%if
|
||||
return \%if;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::C2900 - SNMP Interface to Cisco Catalyst 2900 Switches running IOS
|
||||
SNMP::Info::Layer2::C2900 - SNMP Interface to Cisco Catalyst 2900 Switches
|
||||
running IOS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $c2900 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $c2900->class();
|
||||
my $class = $c2900->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
@@ -165,8 +234,8 @@ Max Baker (C<max@warped.org>)
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
C2900 device through SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $c2900 = new SNMP::Info::Layer2::C2900(...);
|
||||
|
||||
@@ -174,6 +243,14 @@ a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
@@ -182,12 +259,24 @@ a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item CISCO-C2900-MIB
|
||||
=item F<CISCO-C2900-MIB>
|
||||
|
||||
Part of the v2 MIBs from Cisco.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
@@ -198,15 +287,35 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=item $c2900->vendor()
|
||||
|
||||
Returns 'cisco' :)
|
||||
Returns 'cisco' :)
|
||||
|
||||
=item $c2900->cisco_comm_indexing()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
@@ -217,64 +326,118 @@ to a hash.
|
||||
|
||||
=item $c2900->interfaces()
|
||||
|
||||
Returns reference to the map between IID and physical Port.
|
||||
Returns reference to the map between IID and physical Port.
|
||||
|
||||
On the 2900 devices i_name isn't reliable, so we override to just the description.
|
||||
On the 2900 devices i_name isn't reliable, so we override to just the
|
||||
description.
|
||||
|
||||
Next all dots are changed for forward slashes so that the physical port name
|
||||
is the same as the broadcasted CDP port name.
|
||||
(Ethernet0.1 -> Ethernet0/1)
|
||||
Next all dots are changed for forward slashes so that the physical port name
|
||||
is the same as the broad-casted CDP port name.
|
||||
(Ethernet0.1 -> Ethernet0/1)
|
||||
|
||||
Also, any weird characters are removed, as I saw a few pop up.
|
||||
Also, any weird characters are removed, as I saw a few pop up.
|
||||
|
||||
=item $c2900->i_duplex()
|
||||
|
||||
Returns reference to map of IIDs to current link duplex
|
||||
Returns reference to map of IIDs to current link duplex
|
||||
|
||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex;
|
||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex()
|
||||
|
||||
=item $c2900->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of IIDs to admin duplex setting
|
||||
|
||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin;
|
||||
|
||||
Returns reference to hash of IIDs to admin duplex setting
|
||||
|
||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin()
|
||||
|
||||
=back
|
||||
|
||||
=head2 C2900-MIB Port Entry Table
|
||||
=head2 F<C2900-MIB> Port Entry Table
|
||||
|
||||
=over
|
||||
|
||||
=item $c2900->c2900_p_index()
|
||||
|
||||
Maps the Switch Port Table to the IID
|
||||
Maps the Switch Port Table to the IID
|
||||
|
||||
B<c2900PortIfIndex>
|
||||
(C<c2900PortIfIndex>)
|
||||
|
||||
=item $c2900->c2900_p_duplex()
|
||||
|
||||
Gives Port Duplex Info
|
||||
Gives Port Duplex Info
|
||||
|
||||
B<c2900PortDuplexStatus>
|
||||
(C<c2900PortDuplexStatus>)
|
||||
|
||||
=item $c2900->c2900_p_duplex_admin()
|
||||
|
||||
Gives admin setting for Duplex Info
|
||||
|
||||
B<c2900PortDuplexState>
|
||||
Gives admin setting for Duplex Info
|
||||
|
||||
(C<c2900PortDuplexState>)
|
||||
|
||||
=item $c2900->c2900_p_speed_admin()
|
||||
|
||||
Gives Admin speed of port
|
||||
Gives Admin speed of port
|
||||
|
||||
B<c2900PortAdminSpeed>
|
||||
(C<c2900PortAdminSpeed>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
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 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 $c2900->set_i_speed_admin(speed, ifIndex)
|
||||
|
||||
Sets port speed, must be supplied with speed and port C<ifIndex>
|
||||
|
||||
Speed choices are 'auto', '10', '100'
|
||||
|
||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_speed_admin() to utilize
|
||||
port C<ifIndex>.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$c2900->interfaces()};
|
||||
$c2900->set_i_speed_admin('auto', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't change port speed. ",$c2900->error(1);
|
||||
|
||||
=item $c2900->set_i_duplex_admin(duplex, ifIndex)
|
||||
|
||||
Sets port duplex, must be supplied with duplex and port C<ifIndex>
|
||||
|
||||
Speed choices are 'auto', 'half', 'full'
|
||||
|
||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin() to utilize
|
||||
port C<ifIndex>.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$c2900->interfaces()};
|
||||
$c2900->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't change port duplex. ",$c2900->error(1);
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,127 +1,82 @@
|
||||
# SNMP::Info::Layer2::Catalyst
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Catalyst;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoStack;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoPortSecurity;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE $INIT/ ;
|
||||
@SNMP::Info::Layer2::Catalyst::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Catalyst::ISA
|
||||
= qw/SNMP::Info::CiscoStack SNMP::Info::CiscoVTP
|
||||
SNMP::Info::CDP SNMP::Info::CiscoStats
|
||||
SNMP::Info::CiscoPortSecurity
|
||||
SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Catalyst::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
# See SNMP::Info for the details of these data structures and
|
||||
# the interworkings.
|
||||
$INIT = 0;
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = ( %SNMP::Info::Layer2::MIBS,
|
||||
'CISCO-STACK-MIB' => 'moduleType',
|
||||
'CISCO-VTP-MIB' => 'vtpVlanIndex'
|
||||
);
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS, %SNMP::Info::CiscoPortSecurity::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS, %SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS, %SNMP::Info::CiscoStack::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
# these are in CISCO-STACK-MIB
|
||||
'sysip' => 'sysIpAddr',
|
||||
'netmask' => 'sysNetMask',
|
||||
'broadcast' => 'sysBroadcast',
|
||||
'serial' => 'chassisSerialNumber',
|
||||
'model' => 'chassisModel',
|
||||
'ps1_type' => 'chassisPs1Type',
|
||||
'ps1_status' => 'chassisPs1Status',
|
||||
'ps2_type' => 'chassisPs2Type',
|
||||
'ps2_status' => 'chassisPs2Status',
|
||||
'slots' => 'chassisNumSlots',
|
||||
'fan' => 'chassisFanStatus',
|
||||
);
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::CiscoPortSecurity::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
%SNMP::Info::CiscoStack::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
'i_type2' => 'ifType',
|
||||
# CISCO-STACK-MIB::moduleEntry
|
||||
# These are blades in a catalyst device
|
||||
'm_type' => 'moduleType',
|
||||
'm_model' => 'moduleModel',
|
||||
'm_serial' => 'moduleSerialNumber',
|
||||
'm_status' => 'moduleStatus',
|
||||
'm_name' => 'moduleName',
|
||||
'm_ports' => 'moduleNumPorts',
|
||||
'm_ports_status' => 'modulePortStatus',
|
||||
'm_hwver' => 'moduleHwVersion',
|
||||
'm_fwver' => 'moduleFwVersion',
|
||||
'm_swver' => 'moduleSwVersion',
|
||||
# Router Blades :
|
||||
'm_ip' => 'moduleIPAddress',
|
||||
'm_sub1' => 'moduleSubType',
|
||||
'm_sub2' => 'moduleSubType2',
|
||||
# CISCO-STACK-MIB::portEntry
|
||||
'p_name' => 'portName',
|
||||
'p_type' => 'portType',
|
||||
'p_status' => 'portOperStatus',
|
||||
'p_status2' => 'portAdditionalStatus',
|
||||
'p_speed' => 'portAdminSpeed',
|
||||
'p_duplex' => 'portDuplex',
|
||||
'p_port' => 'portIfIndex',
|
||||
# CISCO-STACK-MIB::PortCpbEntry
|
||||
'p_speed_admin' => 'portCpbSpeed',
|
||||
'p_duplex_admin' => 'portCpbDuplex',
|
||||
# CISCO-VTP-MIB::VtpVlanEntry
|
||||
'v_state' => 'vtpVlanState',
|
||||
'v_type' => 'vtpVlanType',
|
||||
'v_name' => 'vtpVlanName',
|
||||
'v_mtu' => 'vtpVlanMtu',
|
||||
);
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS, %SNMP::Info::CiscoPortSecurity::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS, %SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS, %SNMP::Info::CiscoStack::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE,
|
||||
'm_ports_status' => \&munge_port_status,
|
||||
'p_duplex_admin' => \&SNMP::Info::munge_bits,
|
||||
);
|
||||
|
||||
%PORTSTAT = (1 => 'other',
|
||||
2 => 'ok',
|
||||
3 => 'minorFault',
|
||||
4 => 'majorFault');
|
||||
|
||||
# Changes binary byte describing each port into ascii, and returns
|
||||
# an ascii list separated by spaces.
|
||||
sub munge_port_status {
|
||||
my $status = shift;
|
||||
my @vals = map($PORTSTAT{$_},unpack('C*',$status));
|
||||
return join(' ',@vals);
|
||||
}
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoPortSecurity::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE, %SNMP::Info::CiscoStack::MUNGE,
|
||||
);
|
||||
|
||||
# Overidden Methods
|
||||
|
||||
@@ -132,105 +87,13 @@ sub i_physical {
|
||||
my $p_port = $cat->p_port();
|
||||
|
||||
my %i_physical;
|
||||
foreach my $port (keys %$p_port) {
|
||||
foreach my $port ( keys %$p_port ) {
|
||||
my $iid = $p_port->{$port};
|
||||
$i_physical{$iid} = 1;
|
||||
$i_physical{$iid} = 1;
|
||||
}
|
||||
return \%i_physical;
|
||||
}
|
||||
|
||||
sub i_type {
|
||||
my $cat = shift;
|
||||
|
||||
my $p_port = $cat->p_port();
|
||||
my $p_type = $cat->p_type();
|
||||
|
||||
# Get more generic port types from IF-MIB
|
||||
my $i_type = $cat->i_type2();
|
||||
|
||||
# Now Override w/ port entries
|
||||
foreach my $port (keys %$p_type) {
|
||||
my $iid = $p_port->{$port};
|
||||
$i_type->{$iid} = $p_type->{$port};
|
||||
}
|
||||
|
||||
return $i_type;
|
||||
}
|
||||
|
||||
# p_* functions are indexed to physical port. let's index these
|
||||
# to snmp iid
|
||||
sub i_name {
|
||||
my $cat = shift;
|
||||
|
||||
my $p_port = $cat->p_port();
|
||||
my $p_name = $cat->p_name();
|
||||
|
||||
my %i_name;
|
||||
foreach my $port (keys %$p_name) {
|
||||
my $iid = $p_port->{$port};
|
||||
next unless defined $iid;
|
||||
$i_name{$iid} = $p_name->{$port};
|
||||
}
|
||||
return \%i_name;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $cat = shift;
|
||||
|
||||
my $p_port = $cat->p_port();
|
||||
my $p_duplex = $cat->p_duplex();
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $port (keys %$p_duplex) {
|
||||
my $iid = $p_port->{$port};
|
||||
$i_duplex{$iid} = $p_duplex->{$port};
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $cat = shift;
|
||||
|
||||
my $p_port = $cat->p_port();
|
||||
my $p_duplex_admin = $cat->p_duplex_admin();
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $port (keys %$p_duplex_admin) {
|
||||
my $iid = $p_port->{$port};
|
||||
next unless defined $iid;
|
||||
my $duplex = $p_duplex_admin->{$port};
|
||||
next unless defined $duplex;
|
||||
|
||||
my $string = 'other';
|
||||
# see CISCO-STACK-MIB for a description of the bits
|
||||
$string = 'half' if ($duplex =~ /001$/ or $duplex =~ /0100.$/);
|
||||
$string = 'full' if ($duplex =~ /010$/ or $duplex =~ /100.0$/);
|
||||
# we'll call it auto if both full and half are turned on, or if the
|
||||
# specifically 'auto' flag bit is set.
|
||||
$string = 'auto'
|
||||
if ($duplex =~ /1..$/ or $duplex =~ /110..$/ or $duplex =~ /..011$/);
|
||||
|
||||
$i_duplex_admin{$iid} = $string;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
# $cat->interfaces() - Maps the ifIndex table to a physical port
|
||||
sub interfaces {
|
||||
my $self = shift;
|
||||
my $interfaces = $self->i_index();
|
||||
my $portnames = $self->p_port();
|
||||
my %portmap = reverse %$portnames;
|
||||
|
||||
my %interfaces = ();
|
||||
foreach my $iid (keys %$interfaces) {
|
||||
my $if = $interfaces->{$iid};
|
||||
$interfaces{$if} = $portmap{$iid};
|
||||
}
|
||||
|
||||
return \%interfaces;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
@@ -240,16 +103,74 @@ sub os {
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $cat = shift;
|
||||
my $cat = shift;
|
||||
my $os_ver = $cat->SUPER::os_ver();
|
||||
return $os_ver if defined $os_ver;
|
||||
|
||||
my $m_swver = $cat->m_swver();
|
||||
return undef unless defined $m_swver;
|
||||
return unless defined $m_swver;
|
||||
|
||||
# assume .1 entry is the chassis and the sw version we want.
|
||||
return $m_swver->{1} if defined $m_swver->{1};
|
||||
return undef;
|
||||
return;
|
||||
}
|
||||
|
||||
# Workaround for incomplete bp_index
|
||||
sub bp_index {
|
||||
my $cat = shift;
|
||||
my $p_index = $cat->p_port();
|
||||
my $b_index = $cat->p_oidx();
|
||||
|
||||
my %bp_index;
|
||||
foreach my $iid ( keys %$p_index ) {
|
||||
my $ifidx = $p_index->{$iid};
|
||||
next unless defined $ifidx;
|
||||
my $bpidx = $b_index->{$iid} || 0;
|
||||
|
||||
$bp_index{$bpidx} = $ifidx;
|
||||
}
|
||||
return \%bp_index;
|
||||
}
|
||||
|
||||
sub cisco_comm_indexing {
|
||||
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;
|
||||
@@ -257,11 +178,12 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Catalyst - Perl5 Interface to Cisco devices running Catalyst OS
|
||||
SNMP::Info::Layer2::Catalyst - SNMP Interface to Cisco Catalyst devices
|
||||
running Catalyst OS.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -269,7 +191,6 @@ Max Baker (C<max@warped.org>)
|
||||
my $cat = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
@@ -281,18 +202,25 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info subclass to provide information for Cisco Catalyst switches running CatOS.
|
||||
SNMP::Info subclass to provide information for Cisco Catalyst series switches
|
||||
running CatOS.
|
||||
|
||||
This subclass is not for all devices that have the name Catalyst. Note that some Catalyst
|
||||
switches run IOS, like the 2900 and 3550 families. Cisco Catalyst 1900 switches use their
|
||||
own MIB and have a separate subclass. Use the method above to have SNMP::Info determine the
|
||||
appropriate subclass before using this class directly.
|
||||
This class includes the Catalyst 2920, 4000, 5000, 6000 (hybrid mode)
|
||||
families.
|
||||
|
||||
Note: Some older Catalyst switches will only talk SNMP version 1. Some newer ones will not
|
||||
return all their data if connected via Version 1.
|
||||
This subclass is not for all devices that have the name Catalyst. Note that
|
||||
some Catalyst switches run IOS, like the 2900 and 3550 families. Cisco
|
||||
Catalyst 1900 switches use their own MIB and have a separate subclass. Use
|
||||
the method above to have SNMP::Info determine the appropriate subclass before
|
||||
using this class directly.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
See SNMP::Info::device_type() for specifics.
|
||||
|
||||
Note: Some older Catalyst switches will only talk SNMP version 1. Some
|
||||
newer ones will not return all their data if connected via Version 1.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $cat = new SNMP::Info::Layer2::Catalyst(...);
|
||||
|
||||
@@ -300,6 +228,16 @@ a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::CiscoStack
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoPortSecurity
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
@@ -308,13 +246,20 @@ a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item CISCO-STACK-MIB
|
||||
|
||||
=item CISCO-VTP-MIB
|
||||
|
||||
=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 L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
|
||||
requirements.
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
@@ -326,22 +271,6 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $cat->broadcast()
|
||||
|
||||
(B<sysBroadcast>)
|
||||
|
||||
=item $cat->fan()
|
||||
|
||||
(B<chassisFanStatus>)
|
||||
|
||||
=item $cat->model()
|
||||
|
||||
(B<chassisModel>)
|
||||
|
||||
=item $cat->netmask()
|
||||
|
||||
(B<sysNetMask>)
|
||||
|
||||
=item $cat->os()
|
||||
|
||||
Returns 'catalyst'
|
||||
@@ -351,41 +280,41 @@ Returns 'catalyst'
|
||||
Tries to use the value from SNMP::Info::CiscoStats->os_ver() and if it fails
|
||||
it grabs $cat->m_swver()->{1} and uses that.
|
||||
|
||||
=item $cat->ps1_type()
|
||||
|
||||
(B<chassisPs1Type>)
|
||||
|
||||
=item $cat->ps2_type()
|
||||
|
||||
(B<chassisPs2Type>)
|
||||
|
||||
=item $cat->ps1_status()
|
||||
|
||||
(B<chassisPs1Status>)
|
||||
|
||||
=item $cat->ps2_status()
|
||||
|
||||
(B<chassisPs2Status>)
|
||||
|
||||
=item $cat->serial()
|
||||
|
||||
(B<chassisSerialNumberString>)
|
||||
|
||||
=item $cat->slots()
|
||||
|
||||
(B<chassisNumSlots>)
|
||||
|
||||
=item $cat->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=item $cat->cisco_comm_indexing()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoStack
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
See documentation in 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.
|
||||
@@ -396,195 +325,52 @@ to a hash.
|
||||
|
||||
=item $cat->interfaces()
|
||||
|
||||
Crosses p_port() with i_index() to get physical names.
|
||||
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->i_type()
|
||||
=item $cat->bp_index()
|
||||
|
||||
Crosses p_port() with p_type() and returns the results.
|
||||
Returns reference to hash of bridge port table entries map back to interface
|
||||
identifier (iid)
|
||||
|
||||
Overrides with ifType if p_type() isn't available.
|
||||
|
||||
=item $cat->i_name()
|
||||
|
||||
Crosses p_name with p_port and returns results.
|
||||
|
||||
=item $cat->i_duplex()
|
||||
|
||||
Crosses p_duplex with p_port and returns results.
|
||||
|
||||
=item $cat->i_duplex_admin()
|
||||
|
||||
Crosses p_duplex_admin with p_port.
|
||||
|
||||
Munges bit_string returned from p_duplex_admin to get duplex settings.
|
||||
Crosses (C<portCrossIndex>) to (C<portIfIndex>) since some devices seem to
|
||||
have problems with F<BRIDGE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Module table
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStack
|
||||
|
||||
This table holds configuration information for each of the blades installed in
|
||||
the Catalyst device.
|
||||
See documentation in L<SNMP::Info::CiscoStack/"TABLE METHODS"> for details.
|
||||
|
||||
=over
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
=item $cat->m_type()
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
|
||||
|
||||
(B<moduleType>)
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
=item $cat->m_model()
|
||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
(B<moduleModel>)
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
=item $cat->m_serial()
|
||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
(B<moduleSerialNumber>)
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
=item $cat->m_status()
|
||||
|
||||
(B<moduleStatus>)
|
||||
|
||||
=item $cat->m_name()
|
||||
|
||||
(B<moduleName>)
|
||||
|
||||
=item $cat->m_ports()
|
||||
|
||||
(B<moduleNumPorts>)
|
||||
|
||||
=item $cat->m_ports_status()
|
||||
|
||||
Returns a list of space separated status strings for the ports.
|
||||
|
||||
To see the status of port 4 :
|
||||
|
||||
@ports_status = split(' ', $cat->m_ports_status() );
|
||||
$port4 = $ports_status[3];
|
||||
|
||||
(B<modulePortStatus>)
|
||||
|
||||
=item $cat->m_ports_hwver()
|
||||
|
||||
(B<moduleHwVersion>)
|
||||
|
||||
=item $cat->m_ports_fwver()
|
||||
|
||||
(B<moduleFwVersion>)
|
||||
|
||||
=item $cat->m_ports_swver()
|
||||
|
||||
(B<moduleSwVersion>)
|
||||
|
||||
=item $cat->m_ports_ip()
|
||||
|
||||
(B<moduleIPAddress>)
|
||||
|
||||
=item $cat->m_ports_sub1()
|
||||
|
||||
(B<moduleSubType>)
|
||||
|
||||
=item $cat->m_ports_sub2()
|
||||
|
||||
(B<moduleSubType2>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Modules - Router Blades
|
||||
|
||||
=over
|
||||
|
||||
=item $cat->m_ip()
|
||||
|
||||
(B<moduleIPAddress>)
|
||||
|
||||
=item $cat->m_sub1()
|
||||
|
||||
(B<moduleSubType>)
|
||||
|
||||
=item $cat->m_sub2()
|
||||
|
||||
(B<moduleSubType2>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Port Entry Table (CISCO-STACK-MIB::portTable)
|
||||
|
||||
=over
|
||||
|
||||
=item $cat->p_name()
|
||||
|
||||
(B<portName>)
|
||||
|
||||
=item $cat->p_type()
|
||||
|
||||
(B<portType>)
|
||||
|
||||
=item $cat->p_status()
|
||||
|
||||
(B<portOperStatus>)
|
||||
|
||||
=item $cat->p_status2()
|
||||
|
||||
(B<portAdditionalStatus>)
|
||||
|
||||
=item $cat->p_speed()
|
||||
|
||||
(B<portAdminSpeed>)
|
||||
|
||||
=item $cat->p_duplex()
|
||||
|
||||
(B<portDuplex>)
|
||||
|
||||
=item $cat->p_port()
|
||||
|
||||
(B<portIfIndex>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Port Capability Table (CISCO-STACK-MIB::portCpbTable)
|
||||
|
||||
=over
|
||||
|
||||
=item $cat->p_speed_admin()
|
||||
|
||||
(B<portCpbSpeed>)
|
||||
|
||||
=item $cat->p_duplex_admin()
|
||||
|
||||
(B<portCpbDuplex>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 VLAN Entry Table
|
||||
|
||||
See ftp://ftp.cisco.com/pub/mibs/supportlists/wsc5000/wsc5000-communityIndexing.html
|
||||
for a good treaty of how to connect to the VLANs
|
||||
|
||||
=over
|
||||
|
||||
=item $cat->v_state()
|
||||
|
||||
(B<vtpVlanState>)
|
||||
|
||||
=item $cat->v_type()
|
||||
|
||||
(B<vtpVlanType>)
|
||||
|
||||
=item $cat->v_name()
|
||||
|
||||
(B<vtpVlanName>)
|
||||
|
||||
=item $cat->v_mtu()
|
||||
|
||||
(B<vtpVlanMtu>)
|
||||
|
||||
=back
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
|
||||
details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
521
Info/Layer2/Centillion.pm
Normal file
521
Info/Layer2/Centillion.pm
Normal file
@@ -0,0 +1,521 @@
|
||||
# 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.00_003';
|
||||
|
||||
%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;
|
||||
}
|
||||
|
||||
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.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS, %SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CiscoQOS::MIBS, %SNMP::Info::CiscoRTT::MIBS,
|
||||
%SNMP::Info::CiscoImage::MIBS, %SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CDP::MIBS, %SNMP::Info::CiscoVTP::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoQOS::GLOBALS, %SNMP::Info::CiscoRTT::GLOBALS,
|
||||
%SNMP::Info::CiscoImage::GLOBALS, %SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS, %SNMP::Info::CiscoVTP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS, %SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CiscoQOS::FUNCS, %SNMP::Info::CiscoRTT::FUNCS,
|
||||
%SNMP::Info::CiscoImage::FUNCS, %SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS, %SNMP::Info::CiscoVTP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CiscoQOS::MUNGE, %SNMP::Info::CiscoRTT::MUNGE,
|
||||
%SNMP::Info::CiscoImage::MUNGE, %SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE, %SNMP::Info::CiscoVTP::MUNGE,
|
||||
);
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Cisco - SNMP Interface to L3 and L2+L3 IOS Cisco Device
|
||||
that are not covered in other classes.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $cisco = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $cisco->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Generic Cisco Routers running IOS
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoImage
|
||||
|
||||
=item SNMP::Info::CiscoRTT
|
||||
|
||||
=item SNMP::Info::CiscoQOS
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoRTT/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoQOS/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $cisco->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoRTT
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoRTT/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoQOS
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoQOS/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoRTT
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoRTT/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoQOS
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoQOS/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
File diff suppressed because it is too large
Load Diff
722
Info/Layer2/HP4000.pm
Normal file
722
Info/Layer2/HP4000.pm
Normal file
@@ -0,0 +1,722 @@
|
||||
# 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.00_003';
|
||||
|
||||
%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()
|
||||
|
||||
=cut
|
||||
209
Info/Layer2/HPVC.pm
Normal file
209
Info/Layer2/HPVC.pm
Normal file
@@ -0,0 +1,209 @@
|
||||
# SNMP::Info::Layer2::HPVC - SNMP Interface to HP VirtualConnect Switches
|
||||
#
|
||||
# Copyright (c) 2011 Jeroen van Ingen
|
||||
#
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::HPVC;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::HPVC::ISA
|
||||
= qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::HPVC::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
'HPVC-MIB' => 'vcDomainName',
|
||||
'CPQSINFO-MIB' => 'cpqSiSysSerialNum',
|
||||
'HPVCMODULE-MIB' => 'vcModuleDomainName',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
'serial1' => 'cpqSiSysSerialNum.0',
|
||||
'os_ver' => 'cpqHoSWRunningVersion.1',
|
||||
'os_bin' => 'cpqHoFwVerVersion.1',
|
||||
'productname' => 'cpqSiProductName.0',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer2::MUNGE,
|
||||
);
|
||||
|
||||
|
||||
# Method Overrides
|
||||
|
||||
sub os {
|
||||
return 'hpvc';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'hp';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $hp = shift;
|
||||
return $hp->productname();
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::HPVC - SNMP Interface to HP Virtual Connect Switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Jeroen van Ingen
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $hp = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $hp->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
HP Virtual Connect Switch via SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $hp = new SNMP::Info::Layer2::HPVC(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<HPVC-MIB>
|
||||
|
||||
=item F<CPQSINFO-MIB>
|
||||
|
||||
=item F<HPVCMODULE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
All required MIBs can be found in the netdisco-mibs package.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $hp->os()
|
||||
|
||||
Returns C<'hpvc'>
|
||||
|
||||
=item $hp->os_bin()
|
||||
|
||||
C<cpqHoFwVerVersion.1>
|
||||
|
||||
=item $hp->os_ver()
|
||||
|
||||
C<cpqHoSWRunningVersion.1>
|
||||
|
||||
=item $hp->serial()
|
||||
|
||||
C<cpqSiSysSerialNum.0>
|
||||
|
||||
=item $hp->vendor()
|
||||
|
||||
hp
|
||||
|
||||
=item $hp->model()
|
||||
|
||||
C<cpqSiProductName.0>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 MUNGES
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head1 SET METHODS
|
||||
|
||||
These are methods that provide SNMP set functionality for overridden methods
|
||||
or provide a simpler interface to complex set operations. See
|
||||
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
|
||||
operations.
|
||||
|
||||
=cut
|
||||
180
Info/Layer2/Kentrox.pm
Normal file
180
Info/Layer2/Kentrox.pm
Normal file
@@ -0,0 +1,180 @@
|
||||
package SNMP::Info::Layer2::Kentrox;
|
||||
|
||||
# Copyright (c) 2011 Netdisco Project
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::Kentrox::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Kentrox::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%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.00_003';
|
||||
|
||||
%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.00_003';
|
||||
|
||||
%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
239
Info/Layer2/Netgear.pm
Normal file
239
Info/Layer2/Netgear.pm
Normal file
@@ -0,0 +1,239 @@
|
||||
# SNMP::Info::Layer2::Netgear
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Bill Fenner
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Netgear;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer2::Netgear::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Netgear::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = ( %SNMP::Info::Layer2::MIBS, %SNMP::Info::LLDP::MIBS, );
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::LLDP::GLOBALS,
|
||||
ng_serial => '.1.3.6.1.4.1.4526.10.1.1.1.4.0',
|
||||
ng_osver => '.1.3.6.1.4.1.4526.10.1.1.1.13.0',
|
||||
);
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::LLDP::FUNCS, );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::LLDP::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'netgear';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'netgear';
|
||||
}
|
||||
|
||||
# Wish the OID-based method worked, but netgear scatters
|
||||
# the sysObjectID values across all the device MIBs, and
|
||||
# makes the device MIBs state secrets.
|
||||
# They seem to set sysDescr to the model number, though,
|
||||
# so we'll use that.
|
||||
sub model {
|
||||
my $netgear = shift;
|
||||
return $netgear->description();
|
||||
}
|
||||
|
||||
#
|
||||
# This is model-dependent. Some netgear brand devices don't implement
|
||||
# the bridge MIB forwarding table, so we use the Q-BRIDGE-MIB forwarding
|
||||
# table. Fall back to the orig functions if the qb versions don't
|
||||
# return anything.
|
||||
sub fw_mac {
|
||||
my $netgear = shift;
|
||||
my $ret = $netgear->qb_fw_mac();
|
||||
$ret = $netgear->orig_fw_mac() if ( !defined($ret) );
|
||||
return $ret;
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $netgear = shift;
|
||||
my $ret = $netgear->qb_fw_port();
|
||||
$ret = $netgear->orig_fw_port() if ( !defined($ret) );
|
||||
return $ret;
|
||||
}
|
||||
|
||||
# these seem to work for GSM models but not GS
|
||||
# https://sourceforge.net/tracker/?func=detail&aid=3085413&group_id=70362&atid=527529
|
||||
sub os_ver {
|
||||
my $self = shift;
|
||||
return if $self->model and $self->model =~ m/GS\d/i;
|
||||
return $self->ng_osver();
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $self = shift;
|
||||
return if $self->model and $self->model =~ m/GS\d/i;
|
||||
return $self->ng_serial();
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Netgear - SNMP Interface to Netgear switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Bill Fenner and Zoltan Erszenyi,
|
||||
Hacked in LLDP support from Baystack.pm by
|
||||
Nic Bernstein <nic@onlight.com>
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $netgear = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $netgear->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Netgear device through SNMP. See inherited classes' documentation for
|
||||
inherited methods.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
MIBs listed in L<SNMP::Info::Layer2/"Required MIBs"> and its inherited
|
||||
classes.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $netgear->vendor()
|
||||
|
||||
Returns 'netgear'
|
||||
|
||||
=item $netgear->os()
|
||||
|
||||
Returns 'netgear'
|
||||
|
||||
=item $netgear->model()
|
||||
|
||||
Returns description()
|
||||
|
||||
=item $netgear->os_ver()
|
||||
|
||||
Returns OS Version.
|
||||
|
||||
=item $netgear->serial()
|
||||
|
||||
Returns Serial Number.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of
|
||||
a reference to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $netgear->fw_mac()
|
||||
|
||||
Returns reference to hash of forwarding table MAC Addresses.
|
||||
|
||||
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
|
||||
the C<Q-BRIDGE-MIB> forwarding table. Fall back to the C<BRIDGE-MIB> if
|
||||
C<Q-BRIDGE-MIB> doesn't return anything.
|
||||
|
||||
=item $netgear->fw_port()
|
||||
|
||||
Returns reference to hash of forwarding table entries port interface
|
||||
identifier (iid)
|
||||
|
||||
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
|
||||
the C<Q-BRIDGE-MIB> forwarding table. Fall back to the C<BRIDGE-MIB> if
|
||||
C<Q-BRIDGE-MIB> doesn't return anything.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
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.00_003';
|
||||
|
||||
%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
225
Info/Layer2/ZyXEL_DSLAM.pm
Normal file
225
Info/Layer2/ZyXEL_DSLAM.pm
Normal file
@@ -0,0 +1,225 @@
|
||||
# SNMP::Info::Layer2::ZyXEL_DSLAM
|
||||
# $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::ZyXEL_DSLAM;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::ZyXEL_DSLAM::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::ZyXEL_DSLAM::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
'ip_adresses' => 'ipAdEntAddr',
|
||||
'i_name' => 'ifDescr',
|
||||
'i_description' => 'adslLineConfProfile',
|
||||
);
|
||||
|
||||
%MIBS
|
||||
= ( %SNMP::Info::Layer2::MIBS, 'ADSL-LINE-MIB' => 'adslLineConfProfile' );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE );
|
||||
|
||||
sub layers {
|
||||
my $zyxel = shift;
|
||||
my $layers = $zyxel->layers();
|
||||
return $layers if defined $layers;
|
||||
|
||||
# If these don't claim to have any layers, so we'll give them 1+2
|
||||
return '00000011';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'zyxel';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'zyxel';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $zyxel = shift;
|
||||
my $descr = $zyxel->description();
|
||||
|
||||
if ( $descr =~ m/version (\S+) / ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $zyxel = shift;
|
||||
|
||||
my $desc = $zyxel->description();
|
||||
|
||||
if ( $desc =~ /8-port ADSL Module\(Annex A\)/ ) {
|
||||
return "AAM1008-61";
|
||||
}
|
||||
elsif ( $desc =~ /8-port ADSL Module\(Annex B\)/ ) {
|
||||
return "AAM1008-63";
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub ip {
|
||||
my $zyxel = shift;
|
||||
my $ip_hash = $zyxel->ip_addresses();
|
||||
my $found_ip;
|
||||
|
||||
foreach my $ip ( keys %{$ip_hash} ) {
|
||||
$found_ip = $ip
|
||||
if ( defined $ip
|
||||
and $ip =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/ );
|
||||
}
|
||||
return $found_ip;
|
||||
}
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::ZyXEL_DSLAM - SNMP Interface to ZyXEL DSLAM
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Dmitry Sergienko (C<dmitry@trifle.net>)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $zyxel = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myhub',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $l2->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
ZyXEL device through SNMP. See inherited classes' documentation for
|
||||
inherited methods.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<ADSL-LINE-MIB>
|
||||
|
||||
=item Inherited Classes
|
||||
|
||||
MIBs listed in L<SNMP::Info::Layer2/"Required MIBs"> and their inherited
|
||||
classes.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $zyxel->vendor()
|
||||
|
||||
Returns 'ZyXEL' :)
|
||||
|
||||
=item $zyxel->os()
|
||||
|
||||
Returns 'ZyXEL'
|
||||
|
||||
=item $zyxel->os_ver()
|
||||
|
||||
Culls Version from description()
|
||||
|
||||
=item $zyxel->ip()
|
||||
|
||||
Returns IP Address of DSLAM.
|
||||
|
||||
(C<ipAdEntAddr>)
|
||||
|
||||
=item $zyxel->model()
|
||||
|
||||
Tries to cull out model out of the description field.
|
||||
|
||||
=item $zyxel->layers()
|
||||
|
||||
Returns 00000011.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $zyxel->i_name()
|
||||
|
||||
Returns reference to map of IIDs to port name (C<ifDescr>).
|
||||
|
||||
=item $zyxel->i_description()
|
||||
|
||||
Returns reference to map of IIDs to human-set port description (profile name).
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
689
Info/Layer3.pm
689
Info/Layer3.pm
@@ -1,134 +1,201 @@
|
||||
# SNMP::Info::Layer3 - SNMP Interface to Layer3 devices
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker -- All changes from Version 0.7 on
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::Bridge;
|
||||
use SNMP::Info::EtherLike;
|
||||
use SNMP::Info::Entity;
|
||||
use SNMP::Info::PowerEthernet;
|
||||
use SNMP::Info::IPv6;
|
||||
use SNMP::Info::AdslLine;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
|
||||
|
||||
@SNMP::Info::Layer3::ISA = qw/SNMP::Info SNMP::Info::CDP SNMP::Info::Bridge
|
||||
SNMP::Info::EtherLike SNMP::Info::CiscoStats Exporter/;
|
||||
@SNMP::Info::Layer3::ISA = qw/
|
||||
SNMP::Info::PowerEthernet SNMP::Info::IPv6
|
||||
SNMP::Info::Entity SNMP::Info::EtherLike
|
||||
SNMP::Info::Bridge SNMP::Info::AdslLine
|
||||
SNMP::Info Exporter/;
|
||||
@SNMP::Info::Layer3::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$INIT = 0;
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = ( %SNMP::Info::MIBS,
|
||||
%SNMP::Info::Bridge::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::EtherLike::MIBS,
|
||||
'ENTITY-MIB' => 'entPhysicalName',
|
||||
'CISCO-PRODUCTS-MIB' => 'sysName',
|
||||
'OSPF-MIB' => 'ospfRouterId',
|
||||
);
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS,
|
||||
%SNMP::Info::AdslLine::MIBS,
|
||||
%SNMP::Info::Bridge::MIBS,
|
||||
%SNMP::Info::EtherLike::MIBS,
|
||||
%SNMP::Info::Entity::MIBS,
|
||||
%SNMP::Info::PowerEthernet::MIBS,
|
||||
%SNMP::Info::IPv6::MIBS,
|
||||
'IP-MIB' => 'ipNetToMediaIfIndex',
|
||||
'OSPF-MIB' => 'ospfRouterId',
|
||||
'BGP4-MIB' => 'bgpIdentifier',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
# Inherit the super class ones
|
||||
%SNMP::Info::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::Bridge::GLOBALS,
|
||||
%SNMP::Info::EtherLike::GLOBALS,
|
||||
'mac' => 'ifPhysAddress.1',
|
||||
'chassis' => 'entPhysicalDescr.1',
|
||||
'router_ip' => 'ospfRouterId.0',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::Bridge::FUNCS,
|
||||
%SNMP::Info::EtherLike::FUNCS,
|
||||
# IFMIB
|
||||
'i_name2' => 'ifName',
|
||||
# Address Translation Table (ARP Cache)
|
||||
'at_index' => 'atIfIndex',
|
||||
'at_paddr' => 'atPhysAddress',
|
||||
'at_netaddr' => 'atNetAddress',
|
||||
'ospf_ip' => 'ospfHostIpAddress'
|
||||
);
|
||||
# Inherit the super class ones
|
||||
%SNMP::Info::GLOBALS,
|
||||
%SNMP::Info::AdslLine::GLOBALS,
|
||||
%SNMP::Info::Bridge::GLOBALS,
|
||||
%SNMP::Info::EtherLike::GLOBALS,
|
||||
%SNMP::Info::Entity::GLOBALS,
|
||||
%SNMP::Info::PowerEthernet::GLOBALS,
|
||||
%SNMP::Info::IPv6::GLOBALS,
|
||||
'mac' => 'ifPhysAddress.1',
|
||||
'serial1' =>
|
||||
'.1.3.6.1.4.1.9.3.6.3.0', # OLD-CISCO-CHASSIS-MIB::chassisId.0
|
||||
'router_ip' => 'ospfRouterId.0',
|
||||
'bgp_id' => 'bgpIdentifier.0',
|
||||
'bgp_local_as' => 'bgpLocalAs.0',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
%SNMP::Info::AdslLine::FUNCS,
|
||||
%SNMP::Info::Bridge::FUNCS,
|
||||
%SNMP::Info::EtherLike::FUNCS,
|
||||
%SNMP::Info::Entity::FUNCS,
|
||||
%SNMP::Info::PowerEthernet::FUNCS,
|
||||
%SNMP::Info::IPv6::FUNCS,
|
||||
|
||||
# Obsolete Address Translation Table (ARP Cache)
|
||||
'old_at_index' => 'atIfIndex',
|
||||
'old_at_paddr' => 'atPhysAddress',
|
||||
'old_at_netaddr' => 'atNetAddress',
|
||||
|
||||
# IP-MIB IP Net to Media Table (ARP Cache)
|
||||
'at_index' => 'ipNetToMediaIfIndex',
|
||||
'at_paddr' => 'ipNetToMediaPhysAddress',
|
||||
'at_netaddr' => 'ipNetToMediaNetAddress',
|
||||
|
||||
# OSPF-MIB::ospfIfTable
|
||||
'ospf_if_ip' => 'ospfIfIpAddress',
|
||||
'ospf_if_area' => 'ospfIfAreaId',
|
||||
'ospf_if_type' => 'ospfIfType',
|
||||
'ospf_if_hello' => 'ospfIfHelloInterval',
|
||||
'ospf_if_dead' => 'ospfIfRtrDeadInterval',
|
||||
'ospf_if_admin' => 'ospfIfAdminStat',
|
||||
'ospf_if_state' => 'ospfIfState',
|
||||
|
||||
# OSPF-MIB::ospfNbrTable
|
||||
'ospf_ip' => 'ospfHostIpAddress',
|
||||
'ospf_peers' => 'ospfNbrIpAddr',
|
||||
'ospf_peer_id' => 'ospfNbrRtrId',
|
||||
'ospf_peer_state' => 'ospfNbrState',
|
||||
|
||||
# BGP4-MIB::bgpPeerTable
|
||||
'bgp_peers' => 'bgpPeerLocalAddr',
|
||||
'bgp_peer_id' => 'bgpPeerIdentifier',
|
||||
'bgp_peer_state' => 'bgpPeerState',
|
||||
'bgp_peer_as' => 'bgpPeerRemoteAs',
|
||||
'bgp_peer_addr' => 'bgpPeerRemoteAddr',
|
||||
'bgp_peer_fsm_est_trans' => 'bgpPeerFsmEstablishedTransitions',
|
||||
'bgp_peer_in_tot_msgs' => 'bgpPeerInTotalMessages',
|
||||
'bgp_peer_in_upd_el_time' => 'bgpPeerInUpdateElapsedTime',
|
||||
'bgp_peer_in_upd' => 'bgpPeerInUpdates',
|
||||
'bgp_peer_out_tot_msgs' => 'bgpPeerOutTotalMessages',
|
||||
'bgp_peer_out_upd' => 'bgpPeerOutUpdates',
|
||||
|
||||
# IP-MIB Net to Physical Table (ARP Cache)
|
||||
'n2p_paddr' => 'ipNetToPhysicalPhysAddress',
|
||||
'n2p_lastupdate' => 'ipNetToPhysicalLastUpdated',
|
||||
'n2p_ptype' => 'ipNetToPhysicalType',
|
||||
'n2p_pstate' => 'ipNetToPhysicalState',
|
||||
'n2p_pstatus' => 'ipNetToPhysicalRowStatus',
|
||||
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
%SNMP::Info::EtherLike::MUNGE,
|
||||
'at_paddr' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
%SNMP::Info::AdslLine::MUNGE,
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
%SNMP::Info::EtherLike::MUNGE,
|
||||
%SNMP::Info::Entity::MUNGE,
|
||||
%SNMP::Info::PowerEthernet::MUNGE,
|
||||
%SNMP::Info::IPv6::MUNGE,
|
||||
'old_at_paddr' => \&SNMP::Info::munge_mac,
|
||||
'at_paddr' => \&SNMP::Info::munge_mac,
|
||||
'n2p_paddr' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
# Method OverRides
|
||||
|
||||
sub root_ip {
|
||||
my $l3 = shift;
|
||||
|
||||
my $router_ip = $l3->router_ip();
|
||||
my $ospf_ip = $l3->ospf_ip();
|
||||
my $router_ip = $l3->router_ip();
|
||||
my $ospf_ip = $l3->ospf_ip();
|
||||
|
||||
# return the first one found here (should be only)
|
||||
if (defined $ospf_ip and scalar(keys %$ospf_ip)){
|
||||
foreach my $key (keys %$ospf_ip){
|
||||
# if the router ip exists and is a route advertised by the device we prefer
|
||||
# it over the others
|
||||
return $router_ip
|
||||
if (( defined $router_ip )
|
||||
and ( $router_ip ne '0.0.0.0' )
|
||||
and ( grep { $ospf_ip->{$_} eq $router_ip } (keys %$ospf_ip))
|
||||
and ( $l3->snmp_connect_ip($router_ip) ) );
|
||||
|
||||
# return the first one found here (should be only one)
|
||||
if ( defined $ospf_ip and scalar( keys %$ospf_ip ) ) {
|
||||
foreach my $key ( keys %$ospf_ip ) {
|
||||
my $ip = $ospf_ip->{$key};
|
||||
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 $router_ip if defined $router_ip;
|
||||
return undef;
|
||||
return;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $l3 = shift;
|
||||
|
||||
my $interfaces = $l3->interfaces();
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $l3->interfaces($partial) || {};
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if (keys %$interfaces) {
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
|
||||
# lo -> cisco aironet 350 loopback
|
||||
if ($interfaces->{$if} =~ /(tunnel|loopback|lo|null)/i){
|
||||
if ( $interfaces->{$if} =~ /(tunnel|loopback|\blo\b|null)/i ) {
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
@@ -137,20 +204,41 @@ sub i_ignore {
|
||||
|
||||
sub serial {
|
||||
my $l3 = shift;
|
||||
|
||||
my $chassis = $l3->chassis();
|
||||
|
||||
return $1 if (defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i);
|
||||
|
||||
my $serial1 = $l3->serial1();
|
||||
my $e_descr = $l3->e_descr() || {};
|
||||
my $e_serial = $l3->e_serial() || {};
|
||||
|
||||
my $serial2 = $e_serial->{1} || undef;
|
||||
my $chassis = $e_descr->{1} || undef;
|
||||
|
||||
# precedence
|
||||
# serial2,chassis parse,serial1
|
||||
return $serial2 if ( defined $serial2 and $serial2 !~ /^\s*$/ );
|
||||
return $1
|
||||
if ( defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i );
|
||||
return $serial1 if ( defined $serial1 and $serial1 !~ /^\s*$/ );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
# $l3->model() - the sysObjectID returns an IID to an entry in
|
||||
# $l3->model() - the sysObjectID returns an IID to an entry in
|
||||
# the CISCO-PRODUCT-MIB. Look it up and return it.
|
||||
sub model {
|
||||
my $l3 = shift;
|
||||
my $id = $l3->id();
|
||||
|
||||
unless ( defined $id ) {
|
||||
print
|
||||
" SNMP::Info::Layer3::model() - Device does not support sysObjectID\n"
|
||||
if $l3->debug();
|
||||
return;
|
||||
}
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^cisco//i;
|
||||
$model =~ s/^catalyst//;
|
||||
$model =~ s/^cat//;
|
||||
@@ -158,31 +246,35 @@ sub model {
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $l3 = shift;
|
||||
my $i_index = $l3->i_index();
|
||||
my $i_alias = $l3->i_alias();
|
||||
my $i_name2 = $l3->i_name2();
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $l3->i_index($partial);
|
||||
my $i_alias = $l3->i_alias($partial);
|
||||
my $i_name2 = $l3->orig_i_name($partial);
|
||||
|
||||
my %i_name;
|
||||
foreach my $iid (keys %$i_name2){
|
||||
my $name = $i_name2->{$iid};
|
||||
foreach my $iid ( keys %$i_name2 ) {
|
||||
my $name = $i_name2->{$iid};
|
||||
my $alias = $i_alias->{$iid};
|
||||
$i_name{$iid} = (defined $alias and $alias !~ /^\s*$/) ?
|
||||
$alias :
|
||||
$name;
|
||||
$i_name{$iid}
|
||||
= ( defined $alias and $alias !~ /^\s*$/ )
|
||||
? $alias
|
||||
: $name;
|
||||
}
|
||||
|
||||
return \%i_name;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $l3 = shift;
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $el_index = $l3->el_index($partial);
|
||||
my $el_duplex = $l3->el_duplex($partial);
|
||||
|
||||
my $el_index = $l3->el_index();
|
||||
my $el_duplex = $l3->el_duplex();
|
||||
|
||||
my %i_index;
|
||||
foreach my $el_port (keys %$el_duplex){
|
||||
foreach my $el_port ( keys %$el_duplex ) {
|
||||
my $iid = $el_index->{$el_port};
|
||||
next unless defined $iid;
|
||||
my $duplex = $el_duplex->{$el_port};
|
||||
@@ -198,18 +290,20 @@ sub i_duplex {
|
||||
|
||||
# $l3->interfaces() - Map the Interfaces to their physical names
|
||||
sub interfaces {
|
||||
my $l3 = shift;
|
||||
my $interfaces = $l3->i_index();
|
||||
my $descriptions = $l3->i_description();
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $l3->i_index($partial);
|
||||
my $descriptions = $l3->i_description($partial);
|
||||
|
||||
my %interfaces = ();
|
||||
foreach my $iid (keys %$interfaces){
|
||||
foreach my $iid ( keys %$interfaces ) {
|
||||
my $desc = $descriptions->{$iid};
|
||||
next unless defined $desc;
|
||||
|
||||
$interfaces{$iid} = $desc;
|
||||
}
|
||||
|
||||
|
||||
return \%interfaces;
|
||||
}
|
||||
|
||||
@@ -217,21 +311,52 @@ sub vendor {
|
||||
my $l3 = shift;
|
||||
|
||||
my $descr = $l3->description();
|
||||
my $id = $l3->id();
|
||||
|
||||
return 'cisco' if ($descr =~ /(cisco|ios)/i);
|
||||
return 'foundry' if ($descr =~ /foundry/i);
|
||||
# .1.3.6.1.4.1.9.1 is the CISCO-PRODUCTS-MIB
|
||||
# .1.3.6.1.4.1.9.9.368.4 is an old tree that Cisco CSSs were numbered from
|
||||
return 'cisco' if $id =~ /^\Q.1.3.6.1.4.1.9.1.\E\d+$/;
|
||||
return 'cisco' if $id =~ /^\Q.1.3.6.1.4.1.9.9.368.4.\E\d+/;
|
||||
return 'cisco' if ( $descr =~ /(cisco|\bios\b)/i );
|
||||
return 'brocade' if ( $descr =~ /foundry/i );
|
||||
|
||||
return 'unknown';
|
||||
|
||||
}
|
||||
|
||||
sub at_index {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $l3->orig_at_index($partial) || $l3->old_at_index($partial);
|
||||
}
|
||||
|
||||
sub at_paddr {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $l3->orig_at_paddr($partial) || $l3->old_at_paddr($partial);
|
||||
}
|
||||
|
||||
sub at_netaddr {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $l3->orig_at_netaddr($partial) || $l3->old_at_netaddr($partial);
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3 - Perl5 Interface to network devices serving Layer3 or Layers 2 & 3
|
||||
SNMP::Info::Layer3 - SNMP Interface to network devices serving Layer3 or
|
||||
Layers 2 & 3
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -239,14 +364,13 @@ Max Baker (C<max@warped.org>)
|
||||
my $l3 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $l3->class();
|
||||
my $class = $l3->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
# Let's get some basic Port information
|
||||
@@ -262,14 +386,15 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This class is usually used as a superclass for more specific device classes listed under
|
||||
SNMP::Info::Layer3::* Please read all docs under SNMP::Info first.
|
||||
This class is usually used as a superclass for more specific device classes
|
||||
listed under SNMP::Info::Layer3::* Please read all docs under SNMP::Info
|
||||
first.
|
||||
|
||||
Provides generic methods for accessing SNMP data for Layer 3 network devices.
|
||||
Includes support for Layer2+3 devices.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $l3 = new SNMP::Info::Layer3(...);
|
||||
|
||||
@@ -279,33 +404,43 @@ a more specific class using the method above.
|
||||
|
||||
=item SNMP::Info
|
||||
|
||||
=item SNMP::Info::Bridge
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
=item SNMP::Info::Bridge (For L2/L3 devices)
|
||||
|
||||
=item SNMP::Info::EtherLike
|
||||
|
||||
=item SNMP::Info::Entity
|
||||
|
||||
=item SNMP::Info::PowerEthernet
|
||||
|
||||
=item SNMP::Info::IPv6
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item CISCO-PRODUCTS-MIB
|
||||
=item F<IP-MIB>
|
||||
|
||||
=item ENTITY-MIB
|
||||
=item F<OSPF-MIB>
|
||||
|
||||
=item OSPF-MIB
|
||||
|
||||
=item Inherited Classes
|
||||
|
||||
MIBs required by the inherited classes listed above.
|
||||
=item F<BGP4-MIB>
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Bridge/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::EtherLike/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Entity/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::PowerEthernet/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::IPv6/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
@@ -313,21 +448,27 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $l3->chassis()
|
||||
|
||||
Returns Chassis type (model).
|
||||
|
||||
(B<entPhysicalDescr.1>)
|
||||
|
||||
=item $l3->mac()
|
||||
|
||||
Returns root port mac address
|
||||
|
||||
(B<ifPhysAddress.1>)
|
||||
(C<ifPhysAddress.1>)
|
||||
|
||||
=item $l3->router_ip()
|
||||
|
||||
(B<ospfRouterId.0>)
|
||||
(C<ospfRouterId.0>)
|
||||
|
||||
=item $l3->bgp_id()
|
||||
|
||||
(C<bgpIdentifier.0>)
|
||||
|
||||
Returns the BGP identifier of the local system
|
||||
|
||||
=item $l3->bgp_local_as()
|
||||
|
||||
Returns the local autonomous system number
|
||||
|
||||
(C<bgpLocalAs.0>)
|
||||
|
||||
=back
|
||||
|
||||
@@ -337,41 +478,44 @@ Returns root port mac address
|
||||
|
||||
=item $l3->model()
|
||||
|
||||
Trys to reference $l3->id() to one of the product MIBs listed above
|
||||
Tries to reference $l3->id() to one of the product MIBs listed above
|
||||
|
||||
Removes 'cisco' from cisco devices for readability.
|
||||
|
||||
=item $l3->serial()
|
||||
|
||||
Trys to cull a serial number from $l3->chassis()
|
||||
Tries to cull a serial number from F<ENTITY-MIB>, description, and
|
||||
F<OLD-CISCO->... MIB.
|
||||
|
||||
=item $l3->vendor()
|
||||
|
||||
Trys to cull a Vendor name from B<sysDescr>
|
||||
Tries to cull a Vendor name from C<sysDescr>
|
||||
|
||||
=item $l3->root_ip()
|
||||
|
||||
Returns the primary IP used to communicate with the device. Returns the first
|
||||
found: OSPF Router ID (C<ospfRouterId>) or any OSPF Host IP Address
|
||||
(C<ospfHostIpAddress>).
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See L<SNMP::Info/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Bridge
|
||||
=head2 Global Methods imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
See L<SNMP::Info::Bridge/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
=head2 Global Methods imported from SNMP::Info::EtherLike
|
||||
|
||||
See documentation in SNMP::Info::CDP for details.
|
||||
See L<SNMP::Info::EtherLike/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
=head2 Global Methods imported from SNMP::Info::Entity
|
||||
|
||||
See documentation in SNMP::Info::CiscoStats for details.
|
||||
See L<SNMP::Info::Entity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::EtherLike
|
||||
|
||||
See documentation in SNMP::Info::EtherLike for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
@@ -382,7 +526,8 @@ to a hash.
|
||||
|
||||
=item $l3->interfaces()
|
||||
|
||||
Returns the map between SNMP Interface Identifier (iid) and physical port name.
|
||||
Returns the map between SNMP Interface Identifier (iid) and physical port
|
||||
name.
|
||||
|
||||
Only returns those iids that have a description listed in $l3->i_description()
|
||||
|
||||
@@ -396,7 +541,7 @@ Currently looks for tunnel,loopback,lo,null from $l3->interfaces()
|
||||
|
||||
Returns reference to hash of iid to human set name.
|
||||
|
||||
Defaults to B<ifName>, but checks for an B<ifAlias>
|
||||
Defaults to C<ifName>, but checks for an C<ifAlias>
|
||||
|
||||
=item $l3->i_duplex()
|
||||
|
||||
@@ -405,52 +550,244 @@ Returns reference to hash of iid to current link duplex setting.
|
||||
Maps $l3->el_index() to $l3->el_duplex, then culls out
|
||||
full,half, or auto and sets the map to that value.
|
||||
|
||||
see SNMP::Info::Etherlike for the el_index() and el_duplex() methods.
|
||||
See L<SNMP::Info::Etherlike> for the el_index() and el_duplex() methods.
|
||||
|
||||
=back
|
||||
|
||||
=head2 ARP Cache Entries
|
||||
=head2 F<IP-MIB> Arp Cache Table (C<ipNetToMediaTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $l3->at_index()
|
||||
|
||||
Returns reference to map of IID to Arp Cache Entry
|
||||
Returns reference to hash. Maps ARP table entries to Interface IIDs
|
||||
|
||||
(B<atIfIndex>)
|
||||
(C<ipNetToMediaIfIndex>)
|
||||
|
||||
If the device doesn't support C<ipNetToMediaIfIndex>, this will try
|
||||
the deprecated C<atIfIndex>.
|
||||
|
||||
=item $l3->at_paddr()
|
||||
|
||||
Returns reference to hash of Arp Cache Entries to MAC address
|
||||
Returns reference to hash. Maps ARP table entries to MAC addresses.
|
||||
|
||||
(B<atPhysAddress>)
|
||||
(C<ipNetToMediaPhysAddress>)
|
||||
|
||||
If the device doesn't support C<ipNetToMediaPhysAddress>, this will try
|
||||
the deprecated C<atPhysAddress>.
|
||||
|
||||
=item $l3->at_netaddr()
|
||||
|
||||
Returns reference to hash. Maps ARP table entries to IP addresses.
|
||||
|
||||
(C<ipNetToMediaNetAddress>)
|
||||
|
||||
If the device doesn't support C<ipNetToMediaNetAddress>, this will try
|
||||
the deprecated C<atNetAddress>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 ARP Cache Entries
|
||||
|
||||
The C<atTable> has been deprecated since 1991. You should never need
|
||||
to use these methods. See C<ipNetToMediaTable> above.
|
||||
|
||||
=over
|
||||
|
||||
=item $l3->old_at_index()
|
||||
|
||||
Returns reference to map of IID to Arp Cache Entry
|
||||
|
||||
(C<atIfIndex>)
|
||||
|
||||
=item $l3->old_at_paddr()
|
||||
|
||||
Returns reference to hash of Arp Cache Entries to MAC address
|
||||
|
||||
(C<atPhysAddress>)
|
||||
|
||||
=item $l3->old_at_netaddr()
|
||||
|
||||
Returns reference to hash of Arp Cache Entries to IP Address
|
||||
|
||||
(B<atNetAddress>)
|
||||
(C<atNetAddress>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 BGP Peer Table (C<bgpPeerTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $l3->bgp_peers()
|
||||
|
||||
Returns reference to hash of BGP peer to local IP address
|
||||
|
||||
(C<bgpPeerLocalAddr>)
|
||||
|
||||
=item $l3->bgp_peer_id()
|
||||
|
||||
Returns reference to hash of BGP peer to BGP peer identifier
|
||||
|
||||
(C<bgpPeerIdentifier>)
|
||||
|
||||
=item $l3->bgp_peer_state()
|
||||
|
||||
Returns reference to hash of BGP peer to BGP peer state
|
||||
|
||||
(C<bgpPeerState>)
|
||||
|
||||
=item $l3->bgp_peer_as()
|
||||
|
||||
Returns reference to hash of BGP peer to BGP peer autonomous system number
|
||||
|
||||
(C<bgpPeerRemoteAs>)
|
||||
|
||||
=item $l3->bgp_peer_addr()
|
||||
|
||||
Returns reference to hash of BGP peer to BGP peer IP address
|
||||
|
||||
(C<bgpPeerRemoteAddr>)
|
||||
|
||||
=item $l3->bgp_peer_fsm_est_trans()
|
||||
|
||||
Returns reference to hash of BGP peer to the total number of times the BGP FSM
|
||||
transitioned into the established state
|
||||
|
||||
(C<bgpPeerFsmEstablishedTransitions>)
|
||||
|
||||
=item $l3->bgp_peer_in_tot_msgs()
|
||||
|
||||
Returns reference to hash of BGP peer to the total number of messages received
|
||||
from the remote peer on this connection
|
||||
|
||||
(C<bgpPeerInTotalMessages>)
|
||||
|
||||
=item $l3->bgp_peer_in_upd_el_time()
|
||||
|
||||
Returns reference to hash of BGP peer to the elapsed time in seconds since
|
||||
the last BGP UPDATE message was received from the peer.
|
||||
|
||||
(C<bgpPeerInUpdateElapsedTime>)
|
||||
|
||||
=item $l3->bgp_peer_in_upd()
|
||||
|
||||
Returns reference to hash of BGP peer to the number of BGP UPDATE messages
|
||||
received on this connection
|
||||
|
||||
(C<bgpPeerInUpdates>)
|
||||
|
||||
=item $l3->bgp_peer_out_tot_msgs()
|
||||
|
||||
Returns reference to hash of BGP peer to the total number of messages
|
||||
transmitted to the remote peer on this connection
|
||||
|
||||
(C<bgpPeerOutTotalMessages>)
|
||||
|
||||
=item $l3->bgp_peer_out_upd()
|
||||
|
||||
Returns reference to hash of BGP peer to the number of BGP UPDATE messages
|
||||
transmitted on this connection
|
||||
|
||||
(C<bgpPeerOutUpdates>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 OSPF Interface Table (C<ospfIfTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $l3->ospf_if_ip()
|
||||
|
||||
Returns reference to hash of OSPF interface IP addresses
|
||||
|
||||
(C<ospfIfIpAddress>)
|
||||
|
||||
=item $l3->ospf_if_area()
|
||||
|
||||
Returns reference to hash of the OSPF area to which the interfaces connect
|
||||
|
||||
(C<ospfIfAreaId>)
|
||||
|
||||
=item $l3->ospf_if_type()
|
||||
|
||||
Returns reference to hash of the OSPF interfaces' type
|
||||
|
||||
(C<ospfIfType>)
|
||||
|
||||
=item $l3->ospf_if_hello()
|
||||
|
||||
Returns reference to hash of the OSPF interfaces' hello interval
|
||||
|
||||
(C<ospfIfHelloInterval>)
|
||||
|
||||
=item $l3->ospf_if_dead()
|
||||
|
||||
Returns reference to hash of the OSPF interfaces' dead interval
|
||||
|
||||
(C<ospfIfRtrDeadInterval>)
|
||||
|
||||
=item $l3->ospf_if_admin()
|
||||
|
||||
Returns reference to hash of the OSPF interfaces' administrative status
|
||||
|
||||
(C<ospfIfAdminStat>)
|
||||
|
||||
=item $l3->ospf_if_state()
|
||||
|
||||
Returns reference to hash of the OSPF interfaces' state
|
||||
|
||||
(C<ospfIfState>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 OSPF Neighbor Table (C<ospfNbrTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $l3->ospf_peers()
|
||||
|
||||
Returns reference to hash of IP addresses the neighbor is using in its
|
||||
IP Source Addresses
|
||||
|
||||
(C<ospfNbrIpAddr>)
|
||||
|
||||
=item $l3->ospf_peer_id()
|
||||
|
||||
Returns reference to hash of neighbor Router IDs
|
||||
|
||||
(C<ospfNbrRtrId>)
|
||||
|
||||
=item $l3->ospf_peer_state()
|
||||
|
||||
Returns reference to hash of state of the relationship with the neighbor
|
||||
routers
|
||||
|
||||
(C<ospfNbrState>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See L<SNMP::Info/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in SNMP::Info::CDP for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in SNMP::Info::CiscoStats for details.
|
||||
See L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::EtherLike
|
||||
|
||||
See documentation in SNMP::Info::EtherLike for details.
|
||||
See L<SNMP::Info::EtherLike/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Entity
|
||||
|
||||
See L<SNMP::Info::Entity/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::PowerEthernet
|
||||
|
||||
See L<SNMP::Info::PowerEthernet/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::IPv6
|
||||
|
||||
See L<SNMP::Info::IPv6/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,86 +1,89 @@
|
||||
# SNMP::Info::Layer3::Aironet
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Aironet;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
|
||||
@SNMP::Info::Layer3::Aironet::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Aironet::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Aironet::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$INIT = 0;
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
'AWCVX-MIB' => 'awcIfTable',
|
||||
'IEEE802dot11-MIB' => 'dot11StationID',
|
||||
);
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
'AWCVX-MIB' => 'awcIfTable',
|
||||
'IEEE802dot11-MIB' => 'dot11StationID',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
'mac' => 'dot11StationID.2',
|
||||
# AWC Ethernet Table
|
||||
'awc_duplex' => 'awcEtherDuplex.0',
|
||||
);
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
'mac' => 'dot11StationID.2',
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
'i_mac2' => 'ifPhysAddress',
|
||||
'i_mtu2' => 'ifMtu',
|
||||
'i_ssid' => 'dot11DesiredSSID',
|
||||
# Bridge-mib overrides
|
||||
'fw_mac2' => 'dot1dTpFdbAddress',
|
||||
'fw_port2' => 'dot1dTpFdbPort',
|
||||
'bp_index2' => 'dot1dBasePortIfIndex',
|
||||
# AWC Interface Table (awcIfTable)
|
||||
'awc_default_mac' => 'awcIfDefaultPhyAddress',
|
||||
'awc_mac' => 'awcIfPhyAddress',
|
||||
'awc_ip' => 'awcIfIpAddress',
|
||||
'awc_netmask' => 'awcIfIpNetMask',
|
||||
'awc_msdu' => 'awcIfMSDUMaxLength',
|
||||
);
|
||||
# AWC Ethernet Table
|
||||
'awc_duplex' => 'awcEtherDuplex.0',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
'i_mac2' => 'ifPhysAddress',
|
||||
'i_mtu2' => 'ifMtu',
|
||||
'i_ssid' => 'dot11DesiredSSID',
|
||||
|
||||
# Bridge-mib overrides
|
||||
'fw_mac2' => 'dot1dTpFdbAddress',
|
||||
'fw_port2' => 'dot1dTpFdbPort',
|
||||
'bp_index2' => 'dot1dBasePortIfIndex',
|
||||
|
||||
# AWC Interface Table (awcIfTable)
|
||||
'awc_default_mac' => 'awcIfDefaultPhyAddress',
|
||||
'awc_mac' => 'awcIfPhyAddress',
|
||||
'awc_ip' => 'awcIfIpAddress',
|
||||
'awc_netmask' => 'awcIfIpNetMask',
|
||||
'awc_msdu' => 'awcIfMSDUMaxLength',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
'i_mac2' => \&SNMP::Info::munge_mac,
|
||||
'awc_mac' => \&SNMP::Info::munge_mac,
|
||||
'fw_mac2' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
'i_mac2' => \&SNMP::Info::munge_mac,
|
||||
'awc_mac' => \&SNMP::Info::munge_mac,
|
||||
'fw_mac2' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
sub os {
|
||||
return 'aironet';
|
||||
@@ -88,35 +91,35 @@ sub os {
|
||||
|
||||
sub os_ver {
|
||||
my $aironet = shift;
|
||||
my $descr = $aironet->description();
|
||||
my $descr = $aironet->description() || '';
|
||||
|
||||
# CAP340 11.21
|
||||
if ($descr =~ /AP\d{3}\s+(\d{2}\.\d{2})/){
|
||||
return $1;
|
||||
# CAP340 11.21, AP4800-E 11.21
|
||||
if ( $descr =~ /AP\d{3,4}(-\D+)?\s+(\d{2}\.\d{2})/ ) {
|
||||
return $2;
|
||||
}
|
||||
|
||||
if ($descr =~ /Series\s*AP\s+(\d{2}\.\d{2})/){
|
||||
|
||||
if ( $descr =~ /Series\s*AP\s+(\d{2}\.\d{2})/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
return undef;
|
||||
return;
|
||||
}
|
||||
|
||||
# Override wireless port with static info
|
||||
sub bp_index {
|
||||
my $aironet = shift;
|
||||
my $aironet = shift;
|
||||
my $interfaces = $aironet->interfaces();
|
||||
my $bp_index = $aironet->bp_index2();
|
||||
|
||||
foreach my $iid (keys %$interfaces){
|
||||
my $bp_index = $aironet->bp_index2();
|
||||
|
||||
foreach my $iid ( keys %$interfaces ) {
|
||||
my $port = $interfaces->{$iid};
|
||||
|
||||
# Hardwire the wireless port to the transparent bridge port
|
||||
if ($port =~ /awc/){
|
||||
$bp_index->{0}=$iid;
|
||||
if ( $port =~ /awc/ ) {
|
||||
$bp_index->{0} = $iid;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return $bp_index;
|
||||
}
|
||||
|
||||
@@ -125,17 +128,19 @@ sub fw_mac {
|
||||
my $aironet = shift;
|
||||
my $fw_mac = $aironet->fw_mac2();
|
||||
my $fw_port = $aironet->fw_port2();
|
||||
my $bs_mac = $aironet->bs_mac();
|
||||
|
||||
my $bs_mac = $aironet->bs_mac();
|
||||
|
||||
# remove port 0 forwarding table entries, only port 0 static entries
|
||||
foreach my $fw (keys %$fw_mac){
|
||||
foreach my $fw ( keys %$fw_mac ) {
|
||||
my $port = $fw_port->{$fw};
|
||||
next unless defined $port;
|
||||
delete $fw_mac->{$fw} if $port == 0;
|
||||
}
|
||||
|
||||
foreach my $bs (keys %$bs_mac){
|
||||
$fw_mac->{$bs} = $bs_mac->{$bs};
|
||||
foreach my $bs ( keys %$bs_mac ) {
|
||||
my $entry = $bs;
|
||||
$entry =~ s/\.0$//;
|
||||
$fw_mac->{$entry} = $bs_mac->{$bs};
|
||||
}
|
||||
|
||||
return $fw_mac;
|
||||
@@ -145,28 +150,28 @@ sub fw_mac {
|
||||
sub fw_port {
|
||||
my $aironet = shift;
|
||||
my $fw_port = $aironet->fw_port2();
|
||||
my $bs_port = $aironet->bs_port();
|
||||
my $bs_port = $aironet->bs_port();
|
||||
|
||||
|
||||
foreach my $bs (keys %$bs_port){
|
||||
$fw_port->{$bs} = $bs_port->{$bs};
|
||||
foreach my $bs ( keys %$bs_port ) {
|
||||
my $entry = $bs;
|
||||
$entry =~ s/\.0$//;
|
||||
$fw_port->{$entry} = $bs_port->{$bs};
|
||||
}
|
||||
|
||||
return $fw_port;
|
||||
}
|
||||
|
||||
|
||||
sub i_duplex {
|
||||
my $aironet = shift;
|
||||
my $aironet = shift;
|
||||
my $interfaces = $aironet->interfaces();
|
||||
my $awc_duplex = $aironet->awc_duplex();
|
||||
|
||||
|
||||
my %i_duplex;
|
||||
|
||||
foreach my $iid (keys %$interfaces){
|
||||
foreach my $iid ( keys %$interfaces ) {
|
||||
my $name = $interfaces->{$iid};
|
||||
|
||||
if ($name =~ /fec/){
|
||||
if ( $name =~ /fec/ ) {
|
||||
$i_duplex{$iid} = $awc_duplex;
|
||||
}
|
||||
}
|
||||
@@ -180,7 +185,7 @@ sub i_mac {
|
||||
my $i_mac = $aironet->i_mac2();
|
||||
my $awc_mac = $aironet->awc_mac();
|
||||
|
||||
foreach my $iid (keys %$awc_mac){
|
||||
foreach my $iid ( keys %$awc_mac ) {
|
||||
next unless defined $i_mac->{$iid};
|
||||
$i_mac->{$iid} = $awc_mac->{$iid};
|
||||
}
|
||||
@@ -189,14 +194,14 @@ sub i_mac {
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $aironet = shift;
|
||||
my $aironet = shift;
|
||||
my $interfaces = $aironet->interfaces();
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if (keys %$interfaces){
|
||||
$i_ignore{$if}++ if ($interfaces->{$if} =~ /(rptr|lo)/);
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
$i_ignore{$if}++ if ( $interfaces->{$if} =~ /(rptr|lo)/ );
|
||||
}
|
||||
|
||||
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
@@ -210,11 +215,12 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Aironet - Perl5 Interface to Cisco Aironet Wireless Devices running Aironet software, not IOS
|
||||
SNMP::Info::Layer3::Aironet - Perl5 Interface to Cisco Aironet Wireless
|
||||
Devices running Aironet software, not IOS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -222,7 +228,6 @@ Max Baker (C<max@warped.org>)
|
||||
my $aironet = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
@@ -234,8 +239,8 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info subclass to provide access to SNMP data for an Aironet device running Aironet software,
|
||||
not cisco IOS.
|
||||
SNMP::Info subclass to provide access to SNMP data for an Aironet device
|
||||
running Aironet software, not cisco IOS.
|
||||
|
||||
Note there are two classes for Aironet devices :
|
||||
|
||||
@@ -251,8 +256,8 @@ This class is for devices running Cisco IOS software (newer)
|
||||
|
||||
=back
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $aironet = new SNMP::Info::Layer3::Aironet(...);
|
||||
|
||||
@@ -268,14 +273,14 @@ a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item AWCVX-MIB
|
||||
=item F<AWCVX-MIB>
|
||||
|
||||
=item IEEE802dot11-MIB
|
||||
=item F<IEEE802dot11-MIB>
|
||||
|
||||
=back
|
||||
|
||||
These MIBs are now included in the v2.tar.gz archive available from ftp.cisco.com. Make sure you
|
||||
have a current version.
|
||||
These MIBs are now included in the v2.tar.gz archive available from
|
||||
ftp.cisco.com. Make sure you have a current version.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
@@ -287,13 +292,13 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
Gives the admin duplex setting for the Ethernet Port.
|
||||
|
||||
B<awcEtherDuplex.0>
|
||||
C<awcEtherDuplex.0>
|
||||
|
||||
=item $aironet->mac()
|
||||
|
||||
Gives the MAC Address of the wireless side
|
||||
|
||||
B<dot11StationID.2>
|
||||
C<dot11StationID.2>
|
||||
|
||||
=item $aironet->os()
|
||||
|
||||
@@ -311,9 +316,9 @@ Returns 'cisco'.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in SNMP::Info::Layer3 for details.
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
@@ -324,18 +329,18 @@ to a hash.
|
||||
|
||||
=item $aironet->bp_index()
|
||||
|
||||
Takes the bp_index() value from SNMP::Info::Bridge and overrides the wireless port
|
||||
to be assigned to the transparent bridge port (port 0)
|
||||
Takes the bp_index() value from SNMP::Info::Bridge and overrides the wireless
|
||||
port to be assigned to the transparent bridge port (port 0)
|
||||
|
||||
=item $aironet->fw_mac()
|
||||
|
||||
Adds static table entries from bs_mac() to port 0 so that wireless MAC addresses will
|
||||
be reported. Forwarding table entries for port 0 are removed.
|
||||
Adds static table entries from bs_mac() to port 0 so that wireless MAC
|
||||
addresses will be reported. Forwarding table entries for port 0 are removed.
|
||||
|
||||
=item $aironet->fw_port()
|
||||
|
||||
Adds the static table port mappings to the forwarding table port mappings by adding
|
||||
bs_port() to fw_port()
|
||||
Adds the static table port mappings to the forwarding table port mappings by
|
||||
adding bs_port() to fw_port()
|
||||
|
||||
=item $aironet->i_duplex()
|
||||
|
||||
@@ -359,34 +364,34 @@ Ignores ports that are of type ``rptr'' and ``lo''.
|
||||
|
||||
Gives the default MAC address of each interface.
|
||||
|
||||
B<awcIfDefaultPhyAddress>
|
||||
C<awcIfDefaultPhyAddress>
|
||||
|
||||
=item $aironet->awc_mac()
|
||||
|
||||
Gives the actual MAC address of each interface.
|
||||
|
||||
B<awcIfPhyAddress>
|
||||
C<awcIfPhyAddress>
|
||||
|
||||
=item $aironet->awc_ip()
|
||||
|
||||
Gives the IP Address assigned to each interface.
|
||||
|
||||
B<awcIfIpAddress>
|
||||
C<awcIfIpAddress>
|
||||
|
||||
=item $aironet->awc_netmask()
|
||||
|
||||
Gives the NetMask for each interface.
|
||||
|
||||
B<awcIfIpNetMask>
|
||||
C<awcIfIpNetMask>
|
||||
|
||||
=item $aironet->awc_msdu()
|
||||
|
||||
B<awcIfMSDUMaxLength>
|
||||
C<awcIfMSDUMaxLength>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in SNMP::Info::Layer3 for details.
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
489
Info/Layer3/AlcatelLucent.pm
Normal file
489
Info/Layer3/AlcatelLucent.pm
Normal file
@@ -0,0 +1,489 @@
|
||||
# SNMP::Info::Layer3::AlcatelLucent
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Bill Fenner
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::AlcatelLucent;
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::MAU;
|
||||
use SNMP::Info::AMAP;
|
||||
# Use LLDP
|
||||
# (or at least try. The versions I've seen have two problems:
|
||||
# 1. they report ifIndex values as 'local'; we don't support ifIndex
|
||||
# but *could*
|
||||
# 2. They report 0.0.0.0 as the management address
|
||||
# )
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer3::AlcatelLucent::ISA = qw/SNMP::Info::AMAP SNMP::Info::LLDP
|
||||
SNMP::Info::MAU SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::AlcatelLucent::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::MAU::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::AMAP::MIBS,
|
||||
'ALCATEL-IND1-DEVICES' => 'familyOmniSwitch7000',
|
||||
'ALCATEL-IND1-CHASSIS-MIB' => 'chasEntPhysOperStatus',
|
||||
'ALU-POWER-ETHERNET-MIB' => 'pethPsePortDetectionStatus',
|
||||
);
|
||||
|
||||
# Alcatel provides their own version of the POWER-ETHERNET-MIB,
|
||||
# off in vendor-space, without renaming any of the objects.
|
||||
# This means we have to *not* load the POWER-ETHERNET-MIB
|
||||
# but can then still use the standard PowerEthernet module,
|
||||
# but cannot try both so we hope Alcatel doesn't stop supporting
|
||||
# their private version even if they get around to supporting the
|
||||
# standard.
|
||||
delete $MIBS{'POWER-ETHERNET-MIB'};
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS, %SNMP::Info::MAU::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS, %SNMP::Info::AMAP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::MAU::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS, %SNMP::Info::AMAP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::MAU::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE, %SNMP::Info::AMAP::MUNGE,
|
||||
);
|
||||
|
||||
# use MAU-MIB for admin. duplex and admin. speed
|
||||
*SNMP::Info::Layer3::AlcatelLucent::i_duplex_admin
|
||||
= \&SNMP::Info::MAU::mau_i_duplex_admin;
|
||||
*SNMP::Info::Layer3::AlcatelLucent::i_speed_admin
|
||||
= \&SNMP::Info::MAU::mau_i_speed_admin;
|
||||
|
||||
sub model {
|
||||
my $alu = shift;
|
||||
my $id = $alu->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^device//;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'AOS';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'alcatel-lucent';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $alu = shift;
|
||||
|
||||
my $descr = $alu->description();
|
||||
if ( $descr =~ m/^(\S+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
# No clue what this will try but hey
|
||||
return $alu->SUPER::os_ver();
|
||||
}
|
||||
|
||||
# ps1_type, ps1_status, ps2_type, ps2_status:
|
||||
# Find the list of power supplies in the ENTITY-MIB
|
||||
# e_class = powerSupply
|
||||
# e_descr = ps_type
|
||||
# chasEntPhysOperStatus = ps_status
|
||||
sub _power_supplies {
|
||||
my $alu = shift;
|
||||
|
||||
my $e_class = $alu->e_class();
|
||||
my @supplies = ();
|
||||
|
||||
foreach my $key ( sort { int($a) cmp int($b) } keys %$e_class ) {
|
||||
if ( $e_class->{$key} eq 'powerSupply' ) {
|
||||
push( @supplies, int($key) );
|
||||
}
|
||||
}
|
||||
return @supplies;
|
||||
}
|
||||
|
||||
sub _ps_type {
|
||||
my $alu = shift;
|
||||
my $psnum = shift;
|
||||
my @ps = $alu->_power_supplies();
|
||||
|
||||
if ( $psnum > $#ps ) {
|
||||
return "none";
|
||||
}
|
||||
my $supply = $ps[$psnum];
|
||||
my $descr = $alu->e_descr($supply);
|
||||
return $descr->{$supply};
|
||||
}
|
||||
|
||||
sub _ps_status {
|
||||
my $alu = shift;
|
||||
my $psnum = shift;
|
||||
my @ps = $alu->_power_supplies();
|
||||
|
||||
if ( $psnum > $#ps ) {
|
||||
return "not present";
|
||||
}
|
||||
my $supply = $ps[$psnum];
|
||||
my $status = $alu->chasEntPhysOperStatus($supply);
|
||||
return $status->{$supply};
|
||||
}
|
||||
|
||||
sub ps1_type {
|
||||
my $alu = shift;
|
||||
return $alu->_ps_type(0);
|
||||
}
|
||||
|
||||
sub ps2_type {
|
||||
my $alu = shift;
|
||||
return $alu->_ps_type(1);
|
||||
}
|
||||
|
||||
sub ps1_status {
|
||||
my $alu = shift;
|
||||
return $alu->_ps_status(0);
|
||||
}
|
||||
|
||||
sub ps2_status {
|
||||
my $alu = shift;
|
||||
return $alu->_ps_status(1);
|
||||
}
|
||||
|
||||
# The interface description contains the software version, so
|
||||
# to avoid losing historical information through a software upgrade
|
||||
# we use interface name instead.
|
||||
sub interfaces {
|
||||
my $alu = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $alu->orig_i_name($partial);
|
||||
}
|
||||
|
||||
# Use Q-BRIDGE-MIB
|
||||
sub fw_mac {
|
||||
my $alu = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $alu->qb_fw_mac($partial);
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $alu = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $alu->qb_fw_port($partial);
|
||||
}
|
||||
|
||||
# Work around buggy bp_index in 6.3.1.871.R01 and 6.3.1.975.R01
|
||||
sub bp_index {
|
||||
my $alu = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $bp_index = $alu->SUPER::bp_index($partial);
|
||||
|
||||
#
|
||||
# This device sometimes reports an ifIndex and sometimes reports
|
||||
# dot1dBasePort for the dot1d port values - e.g.,
|
||||
# in 6.3.1.871.R01 both dot1dTpFdbPort and dot1qTpFdbPort report
|
||||
# the ifIndex; in 6.3.1.975.R01 dot1dTpFdbPort has been updated
|
||||
# to report the dot1dBasePort but dot1qTpFdbPort still returns an
|
||||
# ifIndex. For this reason, we augment the dot1dBasePort
|
||||
# mapping with ifIndex->ifIndex mappings -- we can do this because
|
||||
# the ifIndex and dot1dBasePort spaces don't overlap, at least for
|
||||
# the ports we care about.
|
||||
my @keys = keys %$bp_index;
|
||||
foreach my $idx (@keys) {
|
||||
my $ifIndex = $bp_index->{$idx};
|
||||
$bp_index->{$ifIndex} = $ifIndex;
|
||||
}
|
||||
|
||||
#
|
||||
# In addition, aggregates aren't reported at all in bp_index.
|
||||
# We grab them from i_index.
|
||||
my $i_index = $alu->i_index();
|
||||
foreach my $idx ( keys %$i_index ) {
|
||||
my $ifIndex = $i_index->{$idx};
|
||||
if ( int($ifIndex) > 40000001 ) {
|
||||
$bp_index->{$ifIndex} = $ifIndex;
|
||||
|
||||
# dot1dTpFdbPort seems to use 4098, 4099, 4100 for
|
||||
# 40000001, 40000002, 40000003. I guess this is
|
||||
# 4096 + 1 + aggregate number.
|
||||
my $tmp = sprintf( "%d", int($ifIndex) - 39995903 );
|
||||
$bp_index->{$tmp} = $ifIndex;
|
||||
}
|
||||
}
|
||||
return $bp_index;
|
||||
}
|
||||
|
||||
# Workaround for unimplemented Q-BRIDGE-MIB::dot1qPvid
|
||||
# If there is only one VLAN on which a given port is output
|
||||
# untagged, then call that one the PVID. This is a guess that
|
||||
# works in obvious configurations but may be wrong in
|
||||
# subtle cases (like there's one output VLAN but a different
|
||||
# input one - the only way to know that is via the dot1qPvid
|
||||
# object)
|
||||
#
|
||||
# Newer versions have implemented dot1qPvid (but wrong, but
|
||||
# that's just life)
|
||||
#sub i_vlan {
|
||||
# my $alu = shift;
|
||||
#
|
||||
# my $qb_v_untagged = $alu->qb_v_untagged();
|
||||
# my $bp_index = $alu->bp_index();
|
||||
# my $vlan_list = {};
|
||||
# foreach my $vlan (keys %$qb_v_untagged) {
|
||||
# my $portlist = $qb_v_untagged->{$vlan};
|
||||
# my $port;
|
||||
# for ($port = 0; $port <= $#$portlist; $port++) {
|
||||
# if ($portlist->[$port]) {
|
||||
# my $ifindex = $bp_index->{$port + 1};
|
||||
# if ($ifindex) {
|
||||
# push(@{$vlan_list->{$ifindex}}, int($vlan));
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
#
|
||||
# my $i_vlan = {};
|
||||
# foreach my $ifindex (keys %$vlan_list) {
|
||||
# if ($#{$vlan_list->{$ifindex}} == 0) {
|
||||
# $i_vlan->{$ifindex} = ${$vlan_list->{$ifindex}}[0];
|
||||
# }
|
||||
# }
|
||||
# return $i_vlan;
|
||||
#}
|
||||
|
||||
# Power-Ethernet ifIndex mapping. I've only seen this from a
|
||||
# fixed-config single-module system, so this is only a plausible
|
||||
# guess as to the mapping on a stack or modular system.
|
||||
sub peth_port_ifindex {
|
||||
my $alu = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $peth_port_status = $alu->peth_port_status($partial);
|
||||
my $peth_port_ifindex = {};
|
||||
|
||||
foreach my $key ( keys %$peth_port_status ) {
|
||||
my @oid = split( m/\./, $key );
|
||||
$peth_port_ifindex->{$key} = int( $oid[0] ) * 1000 + int( $oid[1] );
|
||||
}
|
||||
return $peth_port_ifindex;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::AlcatelLucent - SNMP Interface to Alcatel-Lucent OmniSwitch
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Bill Fenner
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $alu = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $alu->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Alcatel-Lucent OmniSwitch devices
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::MAU
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<ALCATEL-IND1-DEVICES>
|
||||
|
||||
=item F<ALCATEL-IND1-CHASSIS-MIB>
|
||||
|
||||
=item F<ALU-POWER-ETHERNET-MIB>
|
||||
|
||||
Note that Alcatel-Lucent distributes their own proprietary version of the
|
||||
F<POWER-ETHERNET-MIB>, but the MIB module name that they distribute is
|
||||
simply F<POWER-ETHERNET-MIB>. This module must be hand-edited to change the
|
||||
module name to F<ALU-POWER-ETHERNET-MIB> so that it can be used simultaneously
|
||||
with the standard F<POWER-ETHERNET-MIB>.
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $alu->vendor()
|
||||
|
||||
Returns 'alcatel-lucent'
|
||||
|
||||
=item $alu->model()
|
||||
|
||||
Tries to reference $alu->id() to one of the product MIBs listed above
|
||||
|
||||
Removes 'device' from the name for readability.
|
||||
|
||||
=item $alu->os()
|
||||
|
||||
Returns 'AOS'
|
||||
|
||||
=item $alu->os_ver()
|
||||
|
||||
Grabs the os version from C<sysDescr>
|
||||
|
||||
=item $alu->ps1_type()
|
||||
|
||||
Return the type of the first power supply from the F<ENTITY-MIB>
|
||||
|
||||
=item $alu->ps2_type()
|
||||
|
||||
Return the type of the second power supply from the F<ENTITY-MIB>
|
||||
|
||||
=item $alu->ps1_status()
|
||||
|
||||
Return the status of the first power supply from the F<ALCATEL-IND1-CHASSIS-MIB>
|
||||
|
||||
=item $alu->ps2_status()
|
||||
|
||||
Return the status of the second power supply from the F<ALCATEL-IND1-CHASSIS-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $alu->interfaces()
|
||||
|
||||
Returns interface name from C<ifName>, since the default return value
|
||||
of C<ifDescr> includes the OS version.
|
||||
|
||||
=item $alu->fw_mac()
|
||||
|
||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
|
||||
|
||||
=item $alu->fw_port()
|
||||
|
||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
|
||||
|
||||
=item $alu->bp_index()
|
||||
|
||||
Work around various bugs in the F<BRIDGE-MIB> and
|
||||
F<Q-BRIDGE-MIB> implementations, by returning both
|
||||
C<ifIndex> and C<dot1dBasePort> mappings to C<ifIndex> values.
|
||||
|
||||
=item $alu->i_duplex_admin()
|
||||
|
||||
Returns info from F<MAU-MIB>
|
||||
|
||||
=item $alu->i_speed_admin()
|
||||
|
||||
Returns info from F<MAU-MIB>
|
||||
|
||||
=item $alu->peth_port_ifindex()
|
||||
|
||||
Returns the C<ifIndex> value for power-ethernet ports
|
||||
using the OmniSwitch algorithm.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
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.00_003';
|
||||
|
||||
%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.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
'ALTIGA-VERSION-STATS-MIB' => 'alVersionString',
|
||||
'ALTIGA-SESSION-STATS-MIB' => 'alActiveSessionCount',
|
||||
'ALTIGA-HARDWARE-STATS-MIB' => 'alHardwarePs1Type',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
# From ALTIGA-VERSION-STATS-MIB
|
||||
'os_ver' => 'alVersionString',
|
||||
# From ALTIGA-SESSION-STATS-MIB
|
||||
'vpn_act_sess' => 'alActiveSessionCount',
|
||||
'vpn_total_sess' => 'alTotalSessionCount',
|
||||
'vpn_max_sess' => 'alMaxSessionCount',
|
||||
'vpn_l2l_sess' => 'alActiveLanToLanSessionCount',
|
||||
'vpn_mgmt_sess' => 'alActiveManagementSessionCount',
|
||||
'vpn_ras_sess' => 'alActiveRemoteAccessSessionCount',
|
||||
# From ALTIGA-HARDWARE-STATS-MIB
|
||||
'ps1_type' => 'alHardwarePs1Type',
|
||||
'ps1_3v_alarm' => 'alHardwarePs1Voltage3vAlarm',
|
||||
'ps1_5v_alarm' => 'alHardwarePs1Voltage5vAlarm',
|
||||
'ps2_type' => 'alHardwarePs2Type',
|
||||
'ps2_3v_alarm' => 'alHardwarePs2Voltage3vAlarm',
|
||||
'ps2_5v_alarm' => 'alHardwarePs2Voltage5vAlarm',
|
||||
'fan1_alarm' => 'alHardwareFan1RpmAlarm',
|
||||
'fan2_alarm' => 'alHardwareFan2RpmAlarm',
|
||||
'fan3_alarm' => 'alHardwareFan3RpmAlarm',
|
||||
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
'i_type2' => 'ifType',
|
||||
'i_lastchange2' => 'ifLastChange',
|
||||
'vpn_sess_status' => 'alActiveSessionRowStatus',
|
||||
'vpn_sess_user' => 'alActiveSessionUserName',
|
||||
'vpn_sess_peer_ip' => 'alActiveSessionIpAddress',
|
||||
'vpn_sess_protocol' => 'alActiveSessionProtocol',
|
||||
'vpn_sess_encr' => 'alActiveSessionEncrType',
|
||||
'vpn_sess_start' => 'alActiveSessionStartTime',
|
||||
'vpn_sess_conntime' => 'alActiveSessionConnectTime',
|
||||
'vpn_sess_out_oct' => 'alActiveSessionOctetsSent',
|
||||
'vpn_sess_in_oct' => 'alActiveSessionOctetsRcvd',
|
||||
'vpn_sess_group' => 'alActiveSessionGroupName',
|
||||
'vpn_sess_gid' => 'alActiveSessionGroupId',
|
||||
'vpn_sess_rem_ip' => 'alActiveSessionPublicIpAddress',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
'ps1_3v_alarm' => \&munge_alarm,
|
||||
'ps1_5v_alarm' => \&munge_alarm,
|
||||
'ps2_3v_alarm' => \&munge_alarm,
|
||||
'ps2_5v_alarm' => \&munge_alarm,
|
||||
'fan1_alarm' => \&munge_alarm,
|
||||
'fan2_alarm' => \&munge_alarm,
|
||||
'fan3_alarm' => \&munge_alarm,
|
||||
|
||||
);
|
||||
|
||||
# Variable to modify behaviour of "interfaces" subroutine.
|
||||
# * When set to 0, "interfaces" returns only fixed interfaces from the IF-MIB,
|
||||
# * When set to 1, "interfaces" returns fixed interfaces from IF-MIB and LAN-to-LAN tunnels from ALTIGA-SESSION-MIB
|
||||
# TODO: This should be an instance method, not a class global
|
||||
$int_include_vpn = 1;
|
||||
|
||||
# Variable to prepended to each tunnel index when tunnel is added to %interfaces, to avoid overwriting "real" ifIndex entries
|
||||
$fake_idx = 3076;
|
||||
|
||||
# Variable to classify session types into categories: 0 - unclassified, 1 - LAN-to-LAN or fixed, 2 - RAS or dynamic, 3 - administrative
|
||||
$type_class = {
|
||||
'pptp' => 2,
|
||||
'l2tp' => 2,
|
||||
'ipsec' => 2,
|
||||
'http' => 3,
|
||||
'ftp' => 3,
|
||||
'telnet' => 3,
|
||||
'snmp' => 3,
|
||||
'tftp' => 3,
|
||||
'console' => 3,
|
||||
'debugTelnet' => 3,
|
||||
'debugConsole' => 3,
|
||||
'other' => 3,
|
||||
'ike' => 0,
|
||||
'l2tpOverIpSec' => 2,
|
||||
'ipsecLanToLan' => 1,
|
||||
'ipsecOverUdp' => 2,
|
||||
'ssh' => 3,
|
||||
'vcaLanToLan' => 1,
|
||||
'ipsecOverTcp' => 2,
|
||||
'pppoe' => 2,
|
||||
'ipsecOverNatT' => 2,
|
||||
'ipsecLan2LanOverNatT' => 1,
|
||||
'l2tpOverIpsecOverNatT' => 2,
|
||||
'userHttps' => 2,
|
||||
'pop3s' => 2,
|
||||
'imap4s' => 2,
|
||||
'smtps' => 2,
|
||||
'httpsTunnel' => 2,
|
||||
};
|
||||
|
||||
sub vendor {
|
||||
return 'altiga';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'altiga';
|
||||
}
|
||||
|
||||
# $altiga->interfaces() - Map the Interfaces to their physical names
|
||||
# Add interface number to interface name to prevent duplicate ifDescr
|
||||
# Included statically configured VPN tunnels if ($int_include_vpn)
|
||||
sub interfaces {
|
||||
my $altiga = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $altiga->i_index($partial);
|
||||
my $descriptions = $altiga->i_description($partial);
|
||||
|
||||
my %int_rev = ();
|
||||
my %interfaces = ();
|
||||
foreach my $iid (sort {$a cmp $b} keys %$interfaces) {
|
||||
my $desc = $descriptions->{$iid};
|
||||
next unless defined $desc;
|
||||
if (!exists $int_rev{$desc}) {
|
||||
$interfaces{$iid} = $desc;
|
||||
$int_rev{$desc} = $iid;
|
||||
} else {
|
||||
my $done = 0;
|
||||
my $unique_desc;
|
||||
my $cnt = 1;
|
||||
until ($done) {
|
||||
$cnt++;
|
||||
$unique_desc = sprintf("%s (%d)", $desc, $cnt);
|
||||
if (!exists $int_rev{$unique_desc}) {
|
||||
$done++;
|
||||
}
|
||||
}
|
||||
$int_rev{$unique_desc} = $iid;
|
||||
$interfaces{$iid} = $unique_desc;
|
||||
$interfaces{ $int_rev{$desc} } = sprintf("%s (%d)", $desc, 1);
|
||||
}
|
||||
}
|
||||
if ($int_include_vpn) {
|
||||
my $tun_type = $altiga->vpn_sess_protocol();
|
||||
my $peer = $altiga->vpn_sess_peer_ip();
|
||||
my $remote = $altiga->vpn_sess_rem_ip();
|
||||
my $group = $altiga->vpn_sess_gid();
|
||||
foreach my $tunnel (keys %$tun_type) {
|
||||
if ($type_class->{$tun_type->{$tunnel}} eq 1) {
|
||||
$interfaces{"$fake_idx.$tunnel"} = sprintf("%s VPN to %s", uc($tun_type->{$tunnel}), $remote->{$tunnel});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return \%interfaces;
|
||||
}
|
||||
|
||||
sub i_type {
|
||||
my $altiga = shift;
|
||||
my $partial = shift;
|
||||
my $types = $altiga->i_type2();
|
||||
if ($int_include_vpn) {
|
||||
my $tun_type = $altiga->vpn_sess_protocol();
|
||||
foreach my $tunnel (keys %$tun_type) {
|
||||
$types->{"$fake_idx.$tunnel"} = $tun_type->{$tunnel};
|
||||
}
|
||||
}
|
||||
return $types;
|
||||
}
|
||||
|
||||
sub i_lastchange {
|
||||
my $altiga = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# TODO: This is what munges are for.
|
||||
my $lastchange = $altiga->i_lastchange2();
|
||||
if ($int_include_vpn) {
|
||||
my $tun_start = $altiga->vpn_sess_start();
|
||||
foreach my $tunnel (keys %$tun_start) {
|
||||
$lastchange->{"$fake_idx.$tunnel"} = $tun_start->{$tunnel};
|
||||
}
|
||||
}
|
||||
return $lastchange;
|
||||
}
|
||||
|
||||
sub ps1_status {
|
||||
my $altiga = shift;
|
||||
my $alarm_3v = $altiga->ps1_3v_alarm() || "";
|
||||
my $alarm_5v = $altiga->ps1_5v_alarm() || "";
|
||||
return sprintf("3V: %s, 5V: %s", $alarm_3v, $alarm_5v);
|
||||
}
|
||||
|
||||
sub ps2_status {
|
||||
my $altiga = shift;
|
||||
my $alarm_3v = $altiga->ps2_3v_alarm() || "";
|
||||
my $alarm_5v = $altiga->ps2_5v_alarm() || "";
|
||||
return sprintf("3V: %s, 5V: %s", $alarm_3v, $alarm_5v);
|
||||
}
|
||||
|
||||
sub fan {
|
||||
my $altiga = shift;
|
||||
my $alarm_fan1 = $altiga->fan1_alarm() || "";
|
||||
my $alarm_fan2 = $altiga->fan2_alarm() || "";
|
||||
my $alarm_fan3 = $altiga->fan3_alarm() || "";
|
||||
return sprintf("Fan 1: %s, Fan 2: %s, Fan 3: %s", $alarm_fan1, $alarm_fan2, $alarm_fan3);
|
||||
}
|
||||
|
||||
sub munge_alarm {
|
||||
my $alarm = shift;
|
||||
if ($alarm eq 'false') {
|
||||
return 'OK';
|
||||
} elsif ($alarm eq 'true') {
|
||||
return 'FAIL';
|
||||
} else {
|
||||
return "(n/a)";
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Altiga - SNMP Interface to Cisco (formerly Altiga) VPN concentrators
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Jeroen van Ingen Schenau
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $altiga = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'my_vpn_host',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $altiga->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Cisco (formerly Altiga) VPN concentrators
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 Class Variables (options)
|
||||
|
||||
=over
|
||||
|
||||
=item $SNMP::Info::Layer3::Altiga::int_include_vpn
|
||||
|
||||
Variable to modify behavior of "interfaces" subroutine.
|
||||
|
||||
* When set to 0, "interfaces" returns only fixed interfaces from the IF-MIB,
|
||||
* When set to 1, "interfaces" returns fixed interfaces from IF-MIB and
|
||||
LAN-to-LAN tunnels from ALTIGA-SESSION-MIB (default)
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $altiga->vendor()
|
||||
|
||||
Returns 'altiga'
|
||||
|
||||
=item $altiga->os()
|
||||
|
||||
Returns 'altiga'
|
||||
|
||||
=item $altiga->os_ver()
|
||||
|
||||
Tries to determine OS version from the C<sysDescr.0> field. Returns version or C<sysDescr.0>
|
||||
|
||||
=item $altiga->fan()
|
||||
|
||||
Combines results from C<fan1_alarm>, C<fan2_alarm>, and C<fam3_alarm> methods.
|
||||
|
||||
=item $altiga->ps1_status()
|
||||
|
||||
Combines C<ps1_3v_alarm> and C<ps1_5v_alarm> methods.
|
||||
|
||||
=item $altiga->ps2_status()
|
||||
|
||||
Combines C<ps2_3v_alarm> and C<ps2_5v_alarm> methods.
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $altiga->interfaces()
|
||||
|
||||
This method overrides the interfaces() method inherited from SNMP::Info.
|
||||
It provides a mapping between the Interface Table Index (iid) and the physical
|
||||
port name, adding a port number to the port name to prevent duplicate names.
|
||||
|
||||
=item $altiga->i_lastchange()
|
||||
|
||||
Filters out the results depending on the value of $SNMP::Info::Layer3::Altiga::int_include_vpn
|
||||
|
||||
=item $altiga->i_type()
|
||||
|
||||
Filters out the results depending on the value of $SNMP::Info::Layer3::Altiga::int_include_vpn
|
||||
|
||||
=back
|
||||
|
||||
=head1 MUNGES
|
||||
|
||||
=over
|
||||
|
||||
=item munge_alarm()
|
||||
|
||||
Changes C<true> and C<false> to C<FAIL>, C<OK>, and C<(n/a)>.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
257
Info/Layer3/Arista.pm
Normal file
257
Info/Layer3/Arista.pm
Normal file
@@ -0,0 +1,257 @@
|
||||
# SNMP::Info::Layer3::Arista
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Arista Networks, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of Arista Networks, Inc. nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Arista;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::MAU;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer3::Arista::ISA = qw/SNMP::Info::LLDP SNMP::Info::MAU
|
||||
SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Arista::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::MAU::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
'ARISTA-PRODUCTS-MIB' => 'aristaProducts',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::MAU::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::MAU::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::MAU::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
);
|
||||
|
||||
# use MAU-MIB for admin. duplex and admin. speed
|
||||
*SNMP::Info::Layer3::Arista::i_duplex_admin
|
||||
= \&SNMP::Info::MAU::mau_i_duplex_admin;
|
||||
*SNMP::Info::Layer3::Arista::i_speed_admin
|
||||
= \&SNMP::Info::MAU::mau_i_speed_admin;
|
||||
|
||||
sub vendor {
|
||||
return 'arista';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'EOS';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $arista = shift;
|
||||
my $descr = $arista->description();
|
||||
my $os_ver = undef;
|
||||
|
||||
$os_ver = $1 if ( $descr =~ /\s+EOS\s+version\s+(\S+)\s+/ );
|
||||
return $os_ver;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $arista = shift;
|
||||
my $id = $arista->id();
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^arista//;
|
||||
return $model;
|
||||
}
|
||||
|
||||
# Use Q-BRIDGE-MIB
|
||||
|
||||
sub fw_mac {
|
||||
my $arista = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $arista->qb_fw_mac($partial);
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $arista = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $arista->qb_fw_port($partial);
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Arista - SNMP Interface to Arista Networks EOS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Bill Fenner
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $arista = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $arista->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Arista Networks EOS-based devices
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::MAU
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<ARISTA-PRODUCTS-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $arista->vendor()
|
||||
|
||||
Returns 'Arista Networks, Inc.'
|
||||
|
||||
=item $arista->model()
|
||||
|
||||
Tries to reference $arista->id() to one of the product MIBs listed above
|
||||
|
||||
Removes 'arista' from the name for readability.
|
||||
|
||||
=item $arista->os()
|
||||
|
||||
Returns 'EOS'
|
||||
|
||||
=item $arista->os_ver()
|
||||
|
||||
Grabs the os version from C<sysDescr>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $arista->fw_mac()
|
||||
|
||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
|
||||
|
||||
=item $arista->fw_port()
|
||||
|
||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
|
||||
|
||||
=item $arista->i_duplex_admin()
|
||||
|
||||
Returns info from F<MAU-MIB>
|
||||
|
||||
=item $arista->i_speed_admin()
|
||||
|
||||
Returns info from F<MAU-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
648
Info/Layer3/Aruba.pm
Normal file
648
Info/Layer3/Aruba.pm
Normal file
@@ -0,0 +1,648 @@
|
||||
# SNMP::Info::Layer3::Aruba
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Aruba;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::Aruba::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Aruba::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
'WLSX-SWITCH-MIB' => 'wlsxHostname',
|
||||
'WLSX-WLAN-MIB' => 'wlanAPFQLN',
|
||||
'WLSR-AP-MIB' => 'wlsrHideSSID',
|
||||
#'ALCATEL-IND1-TP-DEVICES' => 'familyOmniAccessWireless',
|
||||
);
|
||||
|
||||
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, );
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
|
||||
# WLSX-SWITCH-MIB::wlsxSwitchAccessPointTable
|
||||
# Table index leafs do not return information
|
||||
# therefore unable to use apBSSID. We extract
|
||||
# the information from the IID instead.
|
||||
'aruba_ap_name' => 'apLocation',
|
||||
'aruba_ap_ip' => 'apIpAddress',
|
||||
'aruba_ap_essid' => 'apESSID',
|
||||
'aruba_ap_ssidbcast' => 'wlsrHideSSID',
|
||||
|
||||
# WLSX-WLAN-MIB::wlsxWlanAPTable
|
||||
'aruba_perap_fqln' => 'wlanAPFQLN',
|
||||
|
||||
# WLSR-AP-MIB::wlsrConfigTable
|
||||
'aruba_ap_channel' => 'apCurrentChannel',
|
||||
|
||||
# WLSX-SWITCH-MIB::wlsxSwitchStationMgmtTable
|
||||
# Table index leafs do not return information
|
||||
# therefore unable to use staAccessPointBSSID
|
||||
# or staPhyAddress. We extract the information from
|
||||
# the IID instead.
|
||||
#'fw_port' => 'staAccessPointBSSID',
|
||||
#'fw_mac' => 'staPhyAddress',
|
||||
'fw_user' => 'staUserName',
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
|
||||
|
||||
sub layers {
|
||||
return '00000111';
|
||||
}
|
||||
|
||||
sub os {
|
||||
my $aruba = shift;
|
||||
my %osmap = (
|
||||
'alcatel-lucent' => 'aos-w',
|
||||
);
|
||||
return $osmap{$aruba->vendor()} || 'airos';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
my $aruba = shift;
|
||||
my $id = $aruba->id() || 'undef';
|
||||
my %oidmap = (
|
||||
6486 => 'alcatel-lucent',
|
||||
);
|
||||
$id = $1 if (defined($id) && $id =~ /^\.1\.3\.6\.1\.4\.1\.(\d+)/);
|
||||
|
||||
if (defined($id) and exists($oidmap{$id})) {
|
||||
return $oidmap{$id};
|
||||
}
|
||||
else {
|
||||
return 'aruba';
|
||||
}
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $aruba = shift;
|
||||
my $descr = $aruba->description();
|
||||
return unless defined $descr;
|
||||
|
||||
if ( $descr =~ m/Version\s+(\d+\.\d+\.\d+\.\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $aruba = shift;
|
||||
my $id = $aruba->id();
|
||||
return unless defined $id;
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
# Thin APs do not support ifMIB requirement
|
||||
#
|
||||
# We return all BSSIDs as pseudo-ports on the controller.
|
||||
|
||||
sub i_index {
|
||||
my $aruba = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $aruba->orig_i_index($partial) || {};
|
||||
my $ap_index = $aruba->aruba_ap_name($partial) || {};
|
||||
|
||||
my %if_index;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
|
||||
$if_index{$iid} = $index;
|
||||
}
|
||||
|
||||
# Get Attached APs as Interfaces
|
||||
foreach my $ap_id ( keys %$ap_index ) {
|
||||
|
||||
# Convert the 0.254.123.456 index entry to a MAC address.
|
||||
my $mac = join( ':',
|
||||
map { sprintf( "%02x", $_ ) } split( /\./, $ap_id ) );
|
||||
|
||||
$if_index{$ap_id} = $mac;
|
||||
}
|
||||
return \%if_index;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $aruba = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $aruba->i_index($partial) || {};
|
||||
my $i_descr = $aruba->i_description($partial) || {};
|
||||
|
||||
my %if;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
|
||||
if ( $index =~ /^\d+$/ ) {
|
||||
|
||||
# Replace the Index with the ifDescr field.
|
||||
my $port = $i_descr->{$iid};
|
||||
next unless defined $port;
|
||||
$if{$iid} = $port;
|
||||
}
|
||||
|
||||
elsif ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
|
||||
$if{$index} = $index;
|
||||
}
|
||||
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
return \%if;
|
||||
}
|
||||
|
||||
# Most items are indexed by BSSID.
|
||||
# aruba_perap_fqln is indexed by AP, so we use the
|
||||
# [haven't decided yet] index to figure out all of the
|
||||
# BSSIDs served by a given radio.
|
||||
sub aruba_ap_fqln {
|
||||
my $aruba = shift;
|
||||
# I don't think $partial is meaningful in this context
|
||||
|
||||
my $perap_fqln = $aruba->aruba_perap_fqln();
|
||||
my $channel = $aruba->wlanAPBssidChannel();
|
||||
my $aruba_ap_fqln = {};
|
||||
|
||||
# Channel index is: AP, radio, BSSID
|
||||
foreach my $idx (keys %$channel) {
|
||||
my @oid = split(/\./, $idx );
|
||||
my $ap = join(".", @oid[0..5]);
|
||||
my $bssid = join(".", @oid[7..12]);
|
||||
$aruba_ap_fqln->{$bssid} = $perap_fqln->{$ap};
|
||||
}
|
||||
|
||||
return $aruba_ap_fqln;
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $aruba = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $aruba->i_index($partial) || {};
|
||||
my $i_name2 = $aruba->orig_i_name($partial) || {};
|
||||
my $ap_name = $aruba->aruba_ap_name($partial) || {};
|
||||
my $ap_fqln = $aruba->aruba_ap_fqln($partial) || {};
|
||||
|
||||
my %i_name;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
|
||||
if ( $index =~ /^\d+$/ ) {
|
||||
my $name = $i_name2->{$iid};
|
||||
next unless defined $name;
|
||||
$i_name{$index} = $name;
|
||||
}
|
||||
|
||||
elsif ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
|
||||
my $name = $ap_fqln->{$iid} || $ap_name->{$iid};
|
||||
next unless defined $name;
|
||||
$i_name{$index} = $name;
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
return \%i_name;
|
||||
}
|
||||
|
||||
sub i_ssidlist {
|
||||
my $aruba = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $aruba->i_index($partial) || {};
|
||||
my $ap_ssid = $aruba->aruba_ap_essid($partial) || {};
|
||||
|
||||
my %i_ssid;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
|
||||
if ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
|
||||
my $ssid = $ap_ssid->{$iid};
|
||||
next unless defined $ssid;
|
||||
$i_ssid{$index} = $ssid;
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
return \%i_ssid;
|
||||
}
|
||||
|
||||
sub i_80211channel {
|
||||
my $aruba = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $aruba->i_index($partial) || {};
|
||||
my $ap_ch = $aruba->aruba_ap_channel($partial) || {};
|
||||
|
||||
my %i_ch;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
|
||||
if ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
|
||||
my $ch = $ap_ch->{$iid};
|
||||
next unless defined $ch;
|
||||
$i_ch{$index} = $ch;
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
return \%i_ch;
|
||||
}
|
||||
|
||||
sub i_ssidbcast {
|
||||
my $aruba = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $aruba->i_index($partial) || {};
|
||||
my $ap_bc = $aruba->aruba_ap_ssidbcast($partial) || {};
|
||||
|
||||
my %i_bc;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
|
||||
if ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
|
||||
my $bc = $ap_bc->{$iid};
|
||||
next unless defined $bc;
|
||||
$bc = ( $bc ? 0 : 1 );
|
||||
$i_bc{$index} = $bc;
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
return \%i_bc;
|
||||
}
|
||||
|
||||
# Wireless switches do not support the standard Bridge MIB
|
||||
sub bp_index {
|
||||
my $aruba = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $aruba->orig_i_index($partial) || {};
|
||||
my $ap_index = $aruba->aruba_ap_name($partial) || {};
|
||||
|
||||
my %bp_index;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
|
||||
$bp_index{$iid} = $index;
|
||||
}
|
||||
|
||||
# Get Attached APs as Interfaces
|
||||
foreach my $ap_id ( keys %$ap_index ) {
|
||||
|
||||
# Convert the 0.254.123.456 index entry to a MAC address.
|
||||
my $mac = join( ':',
|
||||
map { sprintf( "%02x", $_ ) } split( /\./, $ap_id ) );
|
||||
|
||||
$bp_index{$mac} = $mac;
|
||||
}
|
||||
return \%bp_index;
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $aruba = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $fw_idx = $aruba->fw_user($partial) || {};
|
||||
|
||||
my %fw_port;
|
||||
foreach my $iid ( keys %$fw_idx ) {
|
||||
if ( $iid
|
||||
=~ /(\d+\.\d+\.\d+\.\d+\.\d+\.\d+).(\d+\.\d+\.\d+\.\d+\.\d+\.\d+)/
|
||||
)
|
||||
{
|
||||
my $port = join( ':',
|
||||
map { sprintf( "%02x", $_ ) } split( /\./, $2 ) );
|
||||
$fw_port{$iid} = $port;
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
return \%fw_port;
|
||||
}
|
||||
|
||||
sub fw_mac {
|
||||
my $aruba = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $fw_idx = $aruba->fw_user($partial) || {};
|
||||
|
||||
my %fw_mac;
|
||||
foreach my $iid ( keys %$fw_idx ) {
|
||||
if ( $iid
|
||||
=~ /(\d+\.\d+\.\d+\.\d+\.\d+\.\d+).(\d+\.\d+\.\d+\.\d+\.\d+\.\d+)/
|
||||
)
|
||||
{
|
||||
my $mac = join( ':',
|
||||
map { sprintf( "%02x", $_ ) } split( /\./, $1 ) );
|
||||
$fw_mac{$iid} = $mac;
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
return \%fw_mac;
|
||||
}
|
||||
|
||||
# Return the BSSID in i_mac.
|
||||
sub i_mac {
|
||||
my $aruba = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# Start with the i_mac entries for the physical ports.
|
||||
my $i_mac = $aruba->orig_i_mac($partial) || {};
|
||||
|
||||
# Add in all the BSSID entries.
|
||||
my $i_index = $aruba->i_index($partial) || {};
|
||||
foreach my $iid (keys %$i_index) {
|
||||
my $index = $i_index->{$iid};
|
||||
if ($index =~ /:/) {
|
||||
$i_mac->{$index} = $index;
|
||||
}
|
||||
}
|
||||
|
||||
return $i_mac;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Aruba - SNMP Interface to Aruba wireless switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $aruba = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $aruba->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::Layer3::Aruba is a subclass of SNMP::Info that provides an
|
||||
interface to Aruba wireless switches. The Aruba platform utilizes
|
||||
intelligent wireless switches which control thin access points. The thin
|
||||
access points themselves are unable to be polled for end station information.
|
||||
|
||||
This class emulates bridge functionality for the wireless switch. This enables
|
||||
end station MAC addresses collection and correlation to the thin access point
|
||||
the end station is using for communication.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $aruba = new SNMP::Info::Layer3::Aruba(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<WLSX-SWITCH-MIB>
|
||||
|
||||
=item F<WLSR-AP-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $aruba->model()
|
||||
|
||||
Returns model type. Cross references $aruba->id() with product IDs in the
|
||||
Aruba MIB.
|
||||
|
||||
=item $aruba->vendor()
|
||||
|
||||
Returns 'aruba'
|
||||
|
||||
=item $aruba->os()
|
||||
|
||||
Returns 'airos'
|
||||
|
||||
=item $aruba->os_ver()
|
||||
|
||||
Returns the software version extracted from C<sysDescr>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $aruba->layers()
|
||||
|
||||
Returns 00000011. Class emulates Layer 2 functionality for Thin APs through
|
||||
proprietary MIBs.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $aruba->i_index()
|
||||
|
||||
Returns reference to map of IIDs to Interface index.
|
||||
|
||||
Extends C<ifIndex> to support thin APs as device interfaces.
|
||||
|
||||
=item $aruba->interfaces()
|
||||
|
||||
Returns reference to map of IIDs to ports. Thin APs are implemented as device
|
||||
interfaces. The thin AP BSSID is used as the port identifier.
|
||||
|
||||
=item $aruba->i_name()
|
||||
|
||||
Interface name. Returns (C<ifName>) for Ethernet interfaces and
|
||||
(C<wlanAPFQLN> or C<apLocation>) for thin AP interfaces.
|
||||
|
||||
=item $aruba->i_mac()
|
||||
|
||||
Interface MAC address. Returns interface MAC address for Ethernet
|
||||
interfaces and BSSID for thin AP interfaces.
|
||||
|
||||
=item $aruba->bp_index()
|
||||
|
||||
Simulates bridge MIB by returning reference to a hash containing the index for
|
||||
both the keys and values.
|
||||
|
||||
=item $aruba->fw_port()
|
||||
|
||||
(C<staAccessPointBSSID>) as extracted from the IID.
|
||||
|
||||
=item $aruba->fw_mac()
|
||||
|
||||
(C<staPhyAddress>) as extracted from the IID.
|
||||
|
||||
=item $aruba->i_ssidlist()
|
||||
|
||||
Returns reference to hash. SSID's recognized by the radio interface.
|
||||
|
||||
(C<apESSID>)
|
||||
|
||||
=item $aruba->i_ssidbcast()
|
||||
|
||||
Returns reference to hash. Indicates whether the SSID is broadcast, true or
|
||||
false.
|
||||
|
||||
(C<wlsrHideSSID>)
|
||||
|
||||
=item $aruba->i_80211channel()
|
||||
|
||||
Returns reference to hash. Current operating frequency channel of the radio
|
||||
interface.
|
||||
|
||||
(C<apCurrentChannel>)
|
||||
|
||||
=item $aruba->aruba_ap_fqln()
|
||||
|
||||
Returns F<aruba_perap_fqln> indexed by BSSID instead of by AP.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Aruba Switch AP Table (C<wlsxSwitchAccessPointTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $aruba->aruba_ap_name()
|
||||
|
||||
(C<apLocation>)
|
||||
|
||||
=item $aruba->aruba_ap_ip()
|
||||
|
||||
(C<apIpAddress>)
|
||||
|
||||
=item $aruba->aruba_ap_essid()
|
||||
|
||||
(C<apESSID>)
|
||||
|
||||
=item $aruba->aruba_ap_ssidbcast()
|
||||
|
||||
(C<wlsrHideSSID>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Aruba AP Table (C<wlsxWlanAPTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $aruba->aruba_perap_fqln()
|
||||
|
||||
(C<wlanAPFQLN>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Aruba Switch Station Management Table (C<wlsxSwitchStationMgmtTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $aruba->fw_user()
|
||||
|
||||
(C<staUserName>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Aruba Wireless AP Configuration Table (C<wlsrConfigTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $aruba->aruba_ap_channel()
|
||||
|
||||
(C<apCurrentChannel>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
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.00_003';
|
||||
|
||||
%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,170 +1,118 @@
|
||||
# SNMP::Info::Layer3::C3550
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2003, Regents of the University of California
|
||||
# Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond.
|
||||
# Copyright (c) 2004 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::C3550;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::CiscoStack;
|
||||
use SNMP::Info::LLDP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoImage;
|
||||
use SNMP::Info::CiscoPortSecurity;
|
||||
use SNMP::Info::CiscoPower;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::CiscoStpExtensions;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
# NOTE : Top-most items gets precedence for @ISA
|
||||
@SNMP::Info::Layer3::C3550::ISA = qw/
|
||||
SNMP::Info::CiscoVTP
|
||||
SNMP::Info::CiscoStpExtensions
|
||||
SNMP::Info::CiscoStack
|
||||
SNMP::Info::LLDP
|
||||
SNMP::Info::CDP
|
||||
SNMP::Info::CiscoStats
|
||||
SNMP::Info::CiscoImage
|
||||
SNMP::Info::CiscoPortSecurity
|
||||
SNMP::Info::CiscoConfig
|
||||
SNMP::Info::CiscoPower
|
||||
SNMP::Info::Layer3
|
||||
Exporter/;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE $INIT/ ;
|
||||
@SNMP::Info::Layer3::C3550::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::C3550::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
# See SNMP::Info for the details of these data structures and
|
||||
# the interworkings.
|
||||
$INIT = 0;
|
||||
# NOTE: Order creates precedence
|
||||
# Example: v_name exists in Bridge.pm and CiscoVTP.pm
|
||||
# Bridge is called from Layer3 and CiscoStpExtensions
|
||||
# So we want CiscoVTP to come last to get the right one.
|
||||
# The @ISA order should match these orders.
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
'CISCO-STACK-MIB' => 'moduleType',
|
||||
'CISCO-VTP-MIB' => 'vtpVlanIndex'
|
||||
);
|
||||
%SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoPower::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS, %SNMP::Info::CiscoPortSecurity::MIBS,
|
||||
%SNMP::Info::CiscoImage::MIBS, %SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS, %SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoStack::MIBS, %SNMP::Info::CiscoStpExtensions::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
);
|
||||
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
'ports2' => 'ifNumber',
|
||||
# these are in CISCO-STACK-MIB
|
||||
'serial' => 'chassisSerialNumberString',
|
||||
'ps1_type' => 'chassisPs1Type',
|
||||
'ps1_status' => 'chassisPs1Status',
|
||||
'ps2_type' => 'chassisPs2Type',
|
||||
'ps2_status' => 'chassisPs2Status',
|
||||
'fan' => 'chassisFanStatus'
|
||||
);
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::CiscoPower::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoPortSecurity::GLOBALS,
|
||||
%SNMP::Info::CiscoImage::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoStack::GLOBALS,
|
||||
%SNMP::Info::CiscoStpExtensions::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
'i_type2' => 'ifType',
|
||||
# CISCO-STACK-MIB::portEntry
|
||||
'p_name' => 'portName',
|
||||
'p_type' => 'portType',
|
||||
'p_status' => 'portOperStatus',
|
||||
'p_status2' => 'portAdditionalStatus',
|
||||
'p_speed' => 'portAdminSpeed',
|
||||
'p_duplex' => 'portDuplex',
|
||||
'p_port' => 'portIfIndex',
|
||||
# CISCO-STACK-MIB::PortCpbEntry
|
||||
'p_speed_admin' => 'portCpbSpeed',
|
||||
'p_duplex_admin' => 'portCpbDuplex',
|
||||
# CISCO-VTP-MIB::VtpVlanEntry
|
||||
'v_state' => 'vtpVlanState',
|
||||
'v_type' => 'vtpVlanType',
|
||||
'v_name' => 'vtpVlanName',
|
||||
'v_mtu' => 'vtpVlanMtu',
|
||||
);
|
||||
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::CiscoPower::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS, %SNMP::Info::CiscoPortSecurity::FUNCS,
|
||||
%SNMP::Info::CiscoImage::FUNCS, %SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS, %SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoStack::FUNCS, %SNMP::Info::CiscoStpExtensions::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
'm_ports_status' => \&munge_port_status,
|
||||
'p_duplex_admin' => \&SNMP::Info::munge_bits,
|
||||
);
|
||||
|
||||
%PORTSTAT = (1 => 'other',
|
||||
2 => 'ok',
|
||||
3 => 'minorFault',
|
||||
4 => 'majorFault');
|
||||
|
||||
# Changes binary byte describing each port into ascii, and returns
|
||||
# an ascii list separated by spaces.
|
||||
sub munge_port_status {
|
||||
my $status = shift;
|
||||
my @vals = map($PORTSTAT{$_},unpack('C*',$status));
|
||||
return join(' ',@vals);
|
||||
}
|
||||
|
||||
# Overidden Methods
|
||||
|
||||
sub i_type {
|
||||
my $c3550 = shift;
|
||||
|
||||
my $p_port = $c3550->p_port();
|
||||
my $p_type = $c3550->p_type();
|
||||
|
||||
# Get more generic port types from IF-MIB
|
||||
my $i_type = $c3550->i_type2();
|
||||
|
||||
# Now Override w/ port entries
|
||||
foreach my $port (keys %$p_type) {
|
||||
my $iid = $p_port->{$port};
|
||||
$i_type->{$iid} = $p_type->{$port};
|
||||
}
|
||||
|
||||
return $i_type;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $c3550 = shift;
|
||||
|
||||
my $p_port = $c3550->p_port();
|
||||
my $p_duplex = $c3550->p_duplex();
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $port (keys %$p_duplex) {
|
||||
my $iid = $p_port->{$port};
|
||||
$i_duplex{$iid} = $p_duplex->{$port};
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $c3550 = shift;
|
||||
|
||||
my $p_port = $c3550->p_port();
|
||||
my $p_duplex_admin = $c3550->p_duplex_admin();
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $port (keys %$p_duplex_admin) {
|
||||
my $iid = $p_port->{$port};
|
||||
next unless defined $iid;
|
||||
my $duplex = $p_duplex_admin->{$port};
|
||||
next unless defined $duplex;
|
||||
|
||||
my $string = 'other';
|
||||
# see CISCO-STACK-MIB for a description of the bits
|
||||
$string = 'half' if ($duplex =~ /001$/ or $duplex =~ /0100.$/);
|
||||
$string = 'full' if ($duplex =~ /010$/ or $duplex =~ /100.0$/);
|
||||
# we'll call it auto if both full and half are turned on, or if the
|
||||
# specifically 'auto' flag bit is set.
|
||||
$string = 'auto'
|
||||
if ($duplex =~ /1..$/ or $duplex =~ /110..$/ or $duplex =~ /..011$/);
|
||||
|
||||
$i_duplex_admin{$iid} = $string;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::CiscoPower::MUNGE,
|
||||
%SNMP::Info::CiscoConfig::MUNGE, %SNMP::Info::CiscoPortSecurity::MUNGE,
|
||||
%SNMP::Info::CiscoImage::MUNGE, %SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE, %SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::CiscoStack::MUNGE, %SNMP::Info::CiscoStpExtensions::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
@@ -172,11 +120,14 @@ sub vendor {
|
||||
|
||||
sub model {
|
||||
my $c3550 = shift;
|
||||
my $id = $c3550->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
my $id = $c3550->id();
|
||||
my $model = &SNMP::translateObj($id) || $id;
|
||||
$model =~ s/^catalyst//;
|
||||
$model =~ s/(24|48)$//;
|
||||
|
||||
# turn 355048 into 3550-48
|
||||
if ( $model =~ /^(35\d\d)(\d\d(T|G)?)$/ ) {
|
||||
$model = "$1-$2";
|
||||
}
|
||||
return $model;
|
||||
}
|
||||
|
||||
@@ -184,14 +135,105 @@ sub model {
|
||||
sub ports {
|
||||
my $c3550 = shift;
|
||||
|
||||
my $ports2 = $c3550->ports2();
|
||||
|
||||
my $id = $c3550->id();
|
||||
my $id = $c3550->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
if ($model =~ /(24|48)$/) {
|
||||
if ( $model =~ /(12|24|48)(C|T|TS|G|TS-E|TS-S|T-E)?$/ ) {
|
||||
return $1;
|
||||
}
|
||||
return $ports2;
|
||||
|
||||
my $ports = $c3550->orig_ports();
|
||||
return $ports;
|
||||
}
|
||||
|
||||
# Verions prior to 12.1(22)EA1a use the older CiscoStack method
|
||||
# Newer versions use the ETHERLIKE-MIB to report operational duplex.
|
||||
# See http://www.ciscosystems.com/en/US/products/hw/switches/ps646/prod_release_note09186a00802a08ee.html
|
||||
|
||||
sub i_duplex {
|
||||
my $c3550 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $el_duplex = $c3550->el_duplex($partial);
|
||||
|
||||
# Newer software
|
||||
if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
|
||||
my %i_duplex;
|
||||
foreach my $el_port ( keys %$el_duplex ) {
|
||||
my $duplex = $el_duplex->{$el_port};
|
||||
next unless defined $duplex;
|
||||
|
||||
$i_duplex{$el_port} = 'half' if $duplex =~ /half/i;
|
||||
$i_duplex{$el_port} = 'full' if $duplex =~ /full/i;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
# Fall back to CiscoStack method
|
||||
else {
|
||||
return $c3550->SUPER::i_duplex($partial);
|
||||
}
|
||||
}
|
||||
|
||||
# Software >= 12.1(22)EA1a uses portDuplex as admin setting
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $c3550 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $el_duplex = $c3550->el_duplex($partial);
|
||||
|
||||
# Newer software
|
||||
if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
|
||||
my $p_port = $c3550->p_port() || {};
|
||||
my $p_duplex = $c3550->p_duplex() || {};
|
||||
|
||||
my $i_duplex_admin = {};
|
||||
foreach my $port ( keys %$p_duplex ) {
|
||||
my $iid = $p_port->{$port};
|
||||
next unless defined $iid;
|
||||
next if ( defined $partial and $iid !~ /^$partial$/ );
|
||||
|
||||
$i_duplex_admin->{$iid} = $p_duplex->{$port};
|
||||
}
|
||||
return $i_duplex_admin;
|
||||
}
|
||||
|
||||
# Fall back to CiscoStack method
|
||||
else {
|
||||
return $c3550->SUPER::i_duplex_admin($partial);
|
||||
}
|
||||
}
|
||||
|
||||
sub set_i_duplex_admin {
|
||||
|
||||
# map a textual duplex to an integer one the switch understands
|
||||
my %duplexes = qw/half 1 full 2 auto 4/;
|
||||
|
||||
my $c3550 = shift;
|
||||
my ( $duplex, $iid ) = @_;
|
||||
|
||||
my $el_duplex = $c3550->el_duplex($iid);
|
||||
|
||||
# Auto duplex only supported on newer software
|
||||
if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
|
||||
my $p_port = $c3550->p_port() || {};
|
||||
my %reverse_p_port = reverse %$p_port;
|
||||
|
||||
$duplex = lc($duplex);
|
||||
|
||||
return 0 unless defined $duplexes{$duplex};
|
||||
|
||||
$iid = $reverse_p_port{$iid};
|
||||
|
||||
return $c3550->set_p_duplex( $duplexes{$duplex}, $iid );
|
||||
}
|
||||
else {
|
||||
return $c3550->SUPER::set_i_duplex_admin;
|
||||
}
|
||||
}
|
||||
|
||||
sub cisco_comm_indexing {
|
||||
return 1;
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -199,22 +241,23 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::C3550 - Perl5 Interface to Cisco Catalyst 3550 Layer 2/3 Switches running IOS
|
||||
SNMP::Info::Layer3::C3550 - SNMP Interface to Cisco Catalyst 3550 Layer 2/3
|
||||
Switches running IOS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $c3550 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
@@ -225,12 +268,12 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
Abstraction subclass for Cisco Catalyst 3550 Layer 2/3 Switches.
|
||||
|
||||
These devices run IOS but have some of the same charactersitics as the Catalyst WS-C family (5xxx,6xxx).
|
||||
For example, forwarding tables are held in VLANs, and extened interface information
|
||||
is gleened from CISCO-SWITCH-MIB.
|
||||
These devices run IOS but have some of the same characteristics as the
|
||||
Catalyst WS-C family (5xxx,6xxx). For example, forwarding tables are held in
|
||||
VLANs, and extended interface information is gleaned from F<CISCO-SWITCH-MIB>.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $c3550 = new SNMP::Info::Layer3::C3550(...);
|
||||
|
||||
@@ -240,15 +283,52 @@ a more specific class using the method above.
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::CiscoSTPExtensions
|
||||
|
||||
=item SNMP::Info::CiscoPower
|
||||
|
||||
=item SNMP::Info::CiscoPortSecurity
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CiscoStack
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoImage
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item CISCO-STACK-MIB
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
=item CISCO-VTP-MIB
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoPower/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
|
||||
requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStack/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
@@ -258,41 +338,68 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $c3550->serial()
|
||||
(B<chassisSerialNumberString>)
|
||||
|
||||
=item $c3550->model()
|
||||
(B<chassisModel>)
|
||||
|
||||
=item $c3550->ps1_type()
|
||||
(B<chassisPs1Type>)
|
||||
|
||||
=item $c3550->ps2_type()
|
||||
(B<chassisPs2Type>)
|
||||
|
||||
=item $c3550->ps1_status()
|
||||
(B<chassisPs1Status>)
|
||||
|
||||
=item $c3550->ps2_status()
|
||||
(B<chassisPs2Status>)
|
||||
|
||||
=item $c3550->slots()
|
||||
(B<chassisNumSlots>)
|
||||
|
||||
=item $c3550->fan()
|
||||
(B<chassisFanStatus>)
|
||||
|
||||
=item $c3550->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
Returns 'cisco'
|
||||
|
||||
=item $c3550->model()
|
||||
|
||||
Will take the translated model number and try to format it better.
|
||||
|
||||
355048 -> 3550-48
|
||||
355012G -> 3550-12G
|
||||
|
||||
=item $c3550->ports()
|
||||
|
||||
Tries to cull the number of ports from the model number.
|
||||
|
||||
=item $c3550->cisco_comm_indexing()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in SNMP::Info::Layer3 for details.
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoPower
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoStack
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
@@ -301,103 +408,81 @@ to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $c3550->i_type()
|
||||
|
||||
Crosses p_port() with p_type() and returns the results.
|
||||
|
||||
Overrides with ifType if p_type() isn't available.
|
||||
|
||||
=item $c3550->i_name()
|
||||
|
||||
Crosses p_name with p_port and returns results.
|
||||
|
||||
=item $c3550->i_duplex()
|
||||
|
||||
Crosses p_duplex with p_port and returns results.
|
||||
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()
|
||||
|
||||
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.
|
||||
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().
|
||||
|
||||
=back
|
||||
See L<SNMP::Info::CiscoStack> for its i_duplex() and p_duplex() methods.
|
||||
|
||||
=head2 Port Entry Table (CISCO-STACK-MIB::portTable)
|
||||
=item $c3550->set_i_duplex_admin(duplex, ifIndex)
|
||||
|
||||
=over
|
||||
Sets port duplex, must be supplied with duplex and port C<ifIndex>.
|
||||
|
||||
=item $c3550->p_name()
|
||||
Speed choices are 'auto', 'half', 'full'.
|
||||
|
||||
(B<portName>)
|
||||
Crosses $c3550->p_port() with $c3550->p_duplex() to utilize port C<ifIndex>.
|
||||
|
||||
=item $c3550->p_type()
|
||||
|
||||
(B<portType>)
|
||||
|
||||
=item $c3550->p_status()
|
||||
|
||||
(B<portOperStatus>)
|
||||
|
||||
=item $c3550->p_status2()
|
||||
|
||||
(B<portAdditionalStatus>)
|
||||
|
||||
=item $c3550->p_speed()
|
||||
|
||||
(B<portAdminSpeed>)
|
||||
|
||||
=item $c3550->p_duplex()
|
||||
|
||||
(B<portDuplex>)
|
||||
|
||||
=item $c3550->p_port()
|
||||
|
||||
(B<portIfIndex>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Port Capability Table (CISCO-STACK-MIB::portCpbTable)
|
||||
|
||||
=over
|
||||
|
||||
=item $c3550->p_speed_admin()
|
||||
|
||||
(B<portCpbSpeed>)
|
||||
|
||||
=item $c3550->p_duplex_admin()
|
||||
|
||||
(B<portCpbDuplex>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 VLAN Entry Table
|
||||
|
||||
See ftp://ftp.cisco.com/pub/mibs/supportlists/wsc5000/wsc5000-communityIndexing.html
|
||||
for a good treaty of how to connect to the VLANs
|
||||
|
||||
=over
|
||||
|
||||
=item $c3550->v_state()
|
||||
|
||||
(B<vtpVlanState>)
|
||||
|
||||
=item $c3550->v_type()
|
||||
|
||||
(B<vtpVlanType>)
|
||||
|
||||
=item $c3550->v_name()
|
||||
|
||||
(B<vtpVlanName>)
|
||||
|
||||
=item $c3550->v_mtu()
|
||||
|
||||
(B<vtpVlanMtu>)
|
||||
Example:
|
||||
my %if_map = reverse %{$c3550->interfaces()};
|
||||
$c3550->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't change port duplex. ",$c3550->error(1);
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in SNMP::Info::Layer3 for details.
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoPower
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPower/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
|
||||
details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStack
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStack/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
319
Info/Layer3/C4000.pm
Normal file
319
Info/Layer3/C4000.pm
Normal file
@@ -0,0 +1,319 @@
|
||||
# SNMP::Info::Layer3::C4000
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Bill Fenner
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::C4000;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoImage;
|
||||
use SNMP::Info::CiscoPortSecurity;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::MAU;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::C4000::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
|
||||
SNMP::Info::CiscoStats SNMP::Info::CiscoImage
|
||||
SNMP::Info::CiscoPortSecurity
|
||||
SNMP::Info::CiscoConfig SNMP::Info::MAU
|
||||
SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::C4000::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::MAU::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CiscoPortSecurity::MIBS,
|
||||
%SNMP::Info::CiscoImage::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
'CISCO-ENVMON-MIB' => 'ciscoEnvMonMIB',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::MAU::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoPortSecurity::GLOBALS,
|
||||
%SNMP::Info::CiscoImage::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
'ps1_type' => 'ciscoEnvMonSupplyStatusDescr.1',
|
||||
'ps1_status' => 'ciscoEnvMonSupplyState.1',
|
||||
'ps2_type' => 'ciscoEnvMonSupplyStatusDescr.2',
|
||||
'ps2_status' => 'ciscoEnvMonSupplyState.2',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::MAU::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CiscoPortSecurity::FUNCS,
|
||||
%SNMP::Info::CiscoImage::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
'fan_state' => 'ciscoEnvMonFanState',
|
||||
'fan_descr' => 'ciscoEnvMonFanStatusDescr',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::MAU::MUNGE,
|
||||
%SNMP::Info::CiscoConfig::MUNGE, %SNMP::Info::CiscoPortSecurity::MUNGE,
|
||||
%SNMP::Info::CiscoImage::MUNGE, %SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE, %SNMP::Info::CiscoVTP::MUNGE,
|
||||
);
|
||||
|
||||
# Override Inheritance for these specific methods
|
||||
# use MAU-MIB for admin. duplex and admin. speed
|
||||
*SNMP::Info::Layer3::C4000::i_duplex_admin
|
||||
= \&SNMP::Info::MAU::mau_i_duplex_admin;
|
||||
*SNMP::Info::Layer3::C4000::i_speed_admin
|
||||
= \&SNMP::Info::MAU::mau_i_speed_admin;
|
||||
|
||||
sub fan {
|
||||
my $c4000 = shift;
|
||||
my $fan_state = $c4000->fan_state();
|
||||
my $fan_descr = $c4000->fan_descr();
|
||||
my $ret = "";
|
||||
my $s = "";
|
||||
foreach my $i ( sort { $a <=> $b } keys %$fan_state ) {
|
||||
$ret .= $s . $fan_descr->{$i} . ": " . $fan_state->{$i};
|
||||
$s = ", ";
|
||||
}
|
||||
return if ( $s eq "" );
|
||||
return $ret;
|
||||
}
|
||||
|
||||
sub cisco_comm_indexing { return 1; }
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::C4000 - SNMP Interface to Cisco Catalyst 4000 Layer 2/3
|
||||
Switches running IOS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Bill Fenner
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $c4000 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $c4000->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Abstraction subclass for Cisco Catalyst 4000 Layer 2/3 Switches.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $c4000 = new SNMP::Info::Layer3::C4000(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoImage
|
||||
|
||||
=item SNMP::Info::CiscoPortSecurity
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=item SNMP::Info::MAU
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
|
||||
requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $c4000->cisco_comm_indexing()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
|
||||
=item $c4000->fan()
|
||||
|
||||
Returns fan status
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $c4000->i_duplex()
|
||||
|
||||
Parses mau_index and mau_link to return the duplex information for
|
||||
interfaces.
|
||||
|
||||
=item $c4000->i_duplex_admin()
|
||||
|
||||
Parses C<mac_index>,C<mau_autostat>,C<mau_type_admin> in
|
||||
order to find the admin duplex setting for all the interfaces.
|
||||
|
||||
Returns either (auto,full,half).
|
||||
|
||||
=item $c4000->i_speed_admin()
|
||||
|
||||
Returns administrative speed for interfaces.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
|
||||
details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
449
Info/Layer3/C6500.pm
Normal file
449
Info/Layer3/C6500.pm
Normal file
@@ -0,0 +1,449 @@
|
||||
# SNMP::Info::Layer3::C6500
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008-2009 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::C6500;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoStack;
|
||||
use SNMP::Info::LLDP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoImage;
|
||||
use SNMP::Info::CiscoPortSecurity;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::CiscoPower;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::CiscoStpExtensions;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
# NOTE : Top-most items gets precedence for @ISA
|
||||
@SNMP::Info::Layer3::C6500::ISA = qw/
|
||||
SNMP::Info::CiscoVTP
|
||||
SNMP::Info::CiscoStpExtensions
|
||||
SNMP::Info::CiscoStack
|
||||
SNMP::Info::LLDP
|
||||
SNMP::Info::CDP
|
||||
SNMP::Info::CiscoImage
|
||||
SNMP::Info::CiscoStats
|
||||
SNMP::Info::CiscoPortSecurity
|
||||
SNMP::Info::CiscoConfig
|
||||
SNMP::Info::CiscoPower
|
||||
SNMP::Info::Layer3
|
||||
Exporter
|
||||
/;
|
||||
|
||||
@SNMP::Info::Layer3::C6500::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
# NOTE: Order creates precedence
|
||||
# Example: v_name exists in Bridge.pm and CiscoVTP.pm
|
||||
# Bridge is called from Layer3 and CiscoStpExtensions
|
||||
# So we want CiscoVTP to come last to get the right one.
|
||||
# The @ISA order should match these orders.
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoPower::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS, %SNMP::Info::CiscoPortSecurity::MIBS,
|
||||
%SNMP::Info::CiscoImage::MIBS, %SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CDP::MIBS, %SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::CiscoStack::MIBS, %SNMP::Info::CiscoStpExtensions::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::CiscoPower::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoPortSecurity::GLOBALS,
|
||||
%SNMP::Info::CiscoImage::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
%SNMP::Info::CiscoStack::GLOBALS,
|
||||
%SNMP::Info::CiscoStpExtensions::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::CiscoPower::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS, %SNMP::Info::CiscoPortSecurity::FUNCS,
|
||||
%SNMP::Info::CiscoImage::FUNCS, %SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS, %SNMP::Info::LLDP::FUNCS,
|
||||
%SNMP::Info::CiscoStack::FUNCS, %SNMP::Info::CiscoStpExtensions::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
);
|
||||
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::CiscoPower::MUNGE,
|
||||
%SNMP::Info::CiscoConfig::MUNGE, %SNMP::Info::CiscoPortSecurity::MUNGE,
|
||||
%SNMP::Info::CiscoImage::MUNGE, %SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE, %SNMP::Info::LLDP::MUNGE,
|
||||
%SNMP::Info::CiscoStack::MUNGE, %SNMP::Info::CiscoStpExtensions::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub cisco_comm_indexing { return 1; }
|
||||
|
||||
# Newer versions use the ETHERLIKE-MIB to report operational duplex.
|
||||
|
||||
sub i_duplex {
|
||||
my $c6500 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $el_duplex = $c6500->el_duplex($partial);
|
||||
|
||||
# Newer software
|
||||
if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
|
||||
my %i_duplex;
|
||||
foreach my $el_port ( keys %$el_duplex ) {
|
||||
my $duplex = $el_duplex->{$el_port};
|
||||
next unless defined $duplex;
|
||||
|
||||
$i_duplex{$el_port} = 'half' if $duplex =~ /half/i;
|
||||
$i_duplex{$el_port} = 'full' if $duplex =~ /full/i;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
# Fall back to CiscoStack method
|
||||
else {
|
||||
return $c6500->SUPER::i_duplex($partial);
|
||||
}
|
||||
}
|
||||
|
||||
# Newer software uses portDuplex as admin setting
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $c6500 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $el_duplex = $c6500->el_duplex($partial);
|
||||
|
||||
# Newer software
|
||||
if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
|
||||
my $p_port = $c6500->p_port() || {};
|
||||
my $p_duplex = $c6500->p_duplex() || {};
|
||||
|
||||
my $i_duplex_admin = {};
|
||||
foreach my $port ( keys %$p_duplex ) {
|
||||
my $iid = $p_port->{$port};
|
||||
next unless defined $iid;
|
||||
next if ( defined $partial and $iid !~ /^$partial$/ );
|
||||
|
||||
$i_duplex_admin->{$iid} = $p_duplex->{$port};
|
||||
}
|
||||
return $i_duplex_admin;
|
||||
}
|
||||
|
||||
# Fall back to CiscoStack method
|
||||
else {
|
||||
return $c6500->SUPER::i_duplex_admin($partial);
|
||||
}
|
||||
}
|
||||
|
||||
sub set_i_duplex_admin {
|
||||
|
||||
# map a textual duplex to an integer one the switch understands
|
||||
my %duplexes = qw/half 1 full 2 auto 4/;
|
||||
|
||||
my $c6500 = shift;
|
||||
my ( $duplex, $iid ) = @_;
|
||||
|
||||
my $el_duplex = $c6500->el_duplex($iid);
|
||||
|
||||
# Auto duplex only supported on newer software
|
||||
if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
|
||||
my $p_port = $c6500->p_port() || {};
|
||||
my %reverse_p_port = reverse %$p_port;
|
||||
|
||||
$duplex = lc($duplex);
|
||||
|
||||
return 0 unless defined $duplexes{$duplex};
|
||||
|
||||
$iid = $reverse_p_port{$iid};
|
||||
|
||||
return $c6500->set_p_duplex( $duplexes{$duplex}, $iid );
|
||||
}
|
||||
else {
|
||||
return $c6500->SUPER::set_i_duplex_admin;
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::C6500 - SNMP Interface to Cisco Catalyst 6500 Layer 2/3
|
||||
Switches running IOS and/or CatOS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $c6500 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $c6500->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Abstraction subclass for Cisco Catalyst 6500 Layer 2/3 Switches.
|
||||
|
||||
These devices run IOS but have some of the same characteristics as the
|
||||
Catalyst WS-C family (5xxx). For example, forwarding tables are held in
|
||||
VLANs, and extended interface information is gleaned from F<CISCO-SWITCH-MIB>.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $c6500 = new SNMP::Info::Layer3::C6500(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CiscoStack
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoImage
|
||||
|
||||
=item SNMP::Info::CiscoPortSecurity
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=item SNMP::Info::CiscoPower
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::CiscoStpExtensions
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStack/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
|
||||
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
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $c6500->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=item $c6500->cisco_comm_indexing()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoStack
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoPower
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $c6500->i_duplex()
|
||||
|
||||
Returns reference to hash of iid to current link duplex setting.
|
||||
|
||||
Newer software versions return duplex based upon the result of
|
||||
$c6500->el_duplex(). Otherwise it uses the result of the call to
|
||||
CiscoStack::i_duplex().
|
||||
|
||||
See L<SNMP::Info::Etherlike> for el_duplex() method and
|
||||
L<SNMP::Info::CiscoStack> for its i_duplex() method.
|
||||
|
||||
=item $c6500->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of iid to administrative duplex setting.
|
||||
|
||||
Newer software versions return duplex based upon the result of
|
||||
$c6500->p_duplex(). Otherwise it uses the result of the call to
|
||||
CiscoStack::i_duplex().
|
||||
|
||||
See L<SNMP::Info::CiscoStack> for its i_duplex() and p_duplex() methods.
|
||||
|
||||
=item $c6500->set_i_duplex_admin(duplex, ifIndex)
|
||||
|
||||
Sets port duplex, must be supplied with duplex and port C<ifIndex>.
|
||||
|
||||
Speed choices are 'auto', 'half', 'full'.
|
||||
|
||||
Crosses $c6500->p_port() with $c6500->p_duplex() to utilize port C<ifIndex>.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$c6500->interfaces()};
|
||||
$c6500->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't change port duplex. ",$c6500->error(1);
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStack
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStack/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
|
||||
details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoPower
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPower/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
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.00_003';
|
||||
|
||||
%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
|
||||
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.00_003';
|
||||
|
||||
%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.00_003';
|
||||
|
||||
%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
|
||||
436
Info/Layer3/Dell.pm
Normal file
436
Info/Layer3/Dell.pm
Normal file
@@ -0,0 +1,436 @@
|
||||
# SNMP::Info::Layer3::Dell - SNMP Interface to Dell devices
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Dell;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer3::Dell::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Dell::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
'RADLAN-Physicaldescription-MIB' => 'rlPhdStackReorder',
|
||||
'RADLAN-rlInterfaces' => 'rlIfNumOfLoopbackPorts',
|
||||
'RADLAN-HWENVIROMENT' => 'rlEnvPhysicalDescription',
|
||||
'Dell-Vendor-MIB' => 'productIdentificationVersion',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
'os_ver' => 'productIdentificationVersion',
|
||||
'dell_id_name' => 'productIdentificationDisplayName',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
|
||||
# RADLAN-rlInterfaces:swIfTable
|
||||
'dell_duplex_admin' => 'swIfDuplexAdminMode',
|
||||
'dell_duplex' => 'swIfDuplexOperMode',
|
||||
'dell_tag_mode' => 'swIfTaggedMode',
|
||||
'dell_i_type' => 'swIfType',
|
||||
'dell_fc_admin' => 'swIfFlowControlMode',
|
||||
'dell_speed_admin' => 'swIfSpeedAdminMode',
|
||||
'dell_auto' => 'swIfSpeedDuplexAutoNegotiation',
|
||||
'dell_fc' => 'swIfOperFlowControlMode',
|
||||
|
||||
# RADLAN-Physicaldescription-MIB:rlPhdUnitGenParamTable
|
||||
'dell_unit' => 'rlPhdUnitGenParamStackUnit',
|
||||
'dell_sw_ver' => 'rlPhdUnitGenParamSoftwareVersion',
|
||||
'dell_fw_ver' => 'rlPhdUnitGenParamFirmwareVersion',
|
||||
'dell_hw_ver' => 'rlPhdUnitGenParamHardwareVersion',
|
||||
'dell_serial_no' => 'rlPhdUnitGenParamSerialNum',
|
||||
'dell_asset_no' => 'rlPhdUnitGenParamAssetTag',
|
||||
|
||||
# RADLAN-COPY-MIB:rlCopyTable
|
||||
'dell_cp_idx' => 'rlCopyIndex',
|
||||
'dell_cp_sloc' => 'rlCopySourceLocation',
|
||||
'dell_cp_sip' => 'rlCopySourceIpAddress',
|
||||
'dell_cp_sunit' => 'rlCopySourceUnitNumber',
|
||||
'dell_cp_sfile' => 'rlCopySourceFileName',
|
||||
'dell_cp_stype' => 'rlCopySourceFileType',
|
||||
'dell_cp_dloc' => 'rlCopyDestinationLocation',
|
||||
'dell_cp_dip' => 'rlCopyDestinationIpAddress',
|
||||
'dell_cp_dunit' => 'rlCopyDestinationUnitNumber',
|
||||
'dell_cp_dfile' => 'rlCopyDestinationFileName',
|
||||
'dell_cp_dtype' => 'rlCopyDestinationFileType',
|
||||
'dell_cp_state' => 'rlCopyOperationState',
|
||||
'dell_cp_bkgnd' => 'rlCopyInBackground',
|
||||
'dell_cp_rstatus' => 'rlCopyRowStatus',
|
||||
|
||||
# RADLAN-HWENVIROMENT:rlEnvMonSupplyStatusTable
|
||||
'dell_pwr_src' => 'rlEnvMonSupplySource',
|
||||
'dell_pwr_state' => 'rlEnvMonSupplyState',
|
||||
'dell_pwr_desc' => 'rlEnvMonSupplyStatusDescr',
|
||||
|
||||
# RADLAN-HWENVIROMENT:rlEnvMonFanStatusTable
|
||||
'dell_fan_state' => 'rlEnvMonFanState',
|
||||
'dell_fan_desc' => 'rlEnvMonFanStatusDescr',
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE, );
|
||||
|
||||
# Method OverRides
|
||||
|
||||
sub model {
|
||||
my $dell = shift;
|
||||
|
||||
my $name = $dell->dell_id_name();
|
||||
my $descr = $dell->description();
|
||||
|
||||
if ( defined $name and $name =~ m/(\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
# Don't have a vendor MIB for D-Link
|
||||
else {
|
||||
return $descr;
|
||||
}
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
my $dell = shift;
|
||||
|
||||
return $dell->_vendor();
|
||||
}
|
||||
|
||||
sub os {
|
||||
my $dell = shift;
|
||||
|
||||
return $dell->_vendor();
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $dell = shift;
|
||||
|
||||
my $numbers = $dell->dell_serial_no();
|
||||
|
||||
foreach my $key ( keys %$numbers ) {
|
||||
my $serial = $numbers->{$key};
|
||||
return $serial if ( defined $serial and $serial !~ /^\s*$/ );
|
||||
next;
|
||||
}
|
||||
|
||||
# Last resort
|
||||
return $dell->SUPER::serial();
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $dell = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_descr = $dell->i_description($partial) || {};
|
||||
my $i_name = $dell->orig_i_name($partial) || {};
|
||||
|
||||
# Descriptions are all the same on some Dells, so use name instead if
|
||||
# available
|
||||
foreach my $iid ( keys %$i_name ) {
|
||||
my $name = $i_name->{$iid};
|
||||
next unless defined $name;
|
||||
$i_descr->{$iid} = $name;
|
||||
}
|
||||
|
||||
return $i_descr;
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $dell = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $dell->interfaces($partial) || {};
|
||||
my $dell_duplex = $dell->dell_duplex_admin($partial) || {};
|
||||
my $dell_auto = $dell->dell_auto($partial) || {};
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
my $duplex = $dell_duplex->{$if};
|
||||
next unless defined $duplex;
|
||||
my $auto = $dell_auto->{$if} || 'false';
|
||||
|
||||
$duplex = 'half' if ( $duplex =~ /half/i and $auto =~ /false/i );
|
||||
$duplex = 'full' if ( $duplex =~ /half/i and $auto =~ /false/i );
|
||||
$duplex = 'auto' if $auto =~ /true/i;
|
||||
$i_duplex_admin{$if} = $duplex;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
# Use same methods as netgear. Some device didn't implement the bridge MIB
|
||||
# forwarding table and some don't return MACs for VLANs other than default yet
|
||||
# don't support community indexing, so we use the Q-BRIDGE-MIB forwarding
|
||||
# table. Fall back to the orig functions if the qb versions don't
|
||||
# return anything.
|
||||
sub fw_mac {
|
||||
my $dell = shift;
|
||||
my $ret = $dell->qb_fw_mac();
|
||||
$ret = $dell->orig_fw_mac() if ( !defined($ret) );
|
||||
return $ret;
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $dell = shift;
|
||||
my $ret = $dell->qb_fw_port();
|
||||
$ret = $dell->orig_fw_port() if ( !defined($ret) );
|
||||
return $ret;
|
||||
}
|
||||
|
||||
sub _vendor {
|
||||
my $dell = shift;
|
||||
|
||||
my $id = $dell->id() || 'undef';
|
||||
my %oidmap = (
|
||||
2 => 'ibm',
|
||||
171 => 'dlink',
|
||||
674 => 'dell',
|
||||
3955 => 'linksys',
|
||||
);
|
||||
$id = $1 if ( defined($id) && $id =~ /^\.1\.3\.6\.1\.4\.1\.(\d+)/ );
|
||||
|
||||
if ( defined($id) and exists( $oidmap{$id} ) ) {
|
||||
return $oidmap{$id};
|
||||
}
|
||||
else {
|
||||
return 'dlink';
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Dell - SNMP Interface to Dell Power Connect Network
|
||||
Devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $dell = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $dell->class();
|
||||
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from an
|
||||
Dell Power Connect device through SNMP. D-Link and the IBM BladeCenter
|
||||
Gigabit Ethernet Switch Module also use this module based upon MIB support.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $dell = new SNMP::Info::Layer3::Dell(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<Dell-Vendor-MIB>
|
||||
|
||||
=item F<RADLAN-Physicaldescription-MIB>
|
||||
|
||||
=item F<RADLAN-rlInterfaces>
|
||||
|
||||
=item F<RADLAN-HWENVIROMENT>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See classes listed above for their required MIBs.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $dell->os_ver()
|
||||
|
||||
(C<productIdentificationVersion>)
|
||||
|
||||
=item $dell->dell_id_name()
|
||||
|
||||
(C<productIdentificationDisplayName>)
|
||||
|
||||
=item $dell->model()
|
||||
|
||||
Returns model type. Returns numeric from
|
||||
(C<productIdentificationDisplayName>) if available, otherwise if returns
|
||||
description().
|
||||
|
||||
=item $dell->vendor()
|
||||
|
||||
Returns 'dell', 'dlink', or 'ibm' based upon the IANA enterprise number in
|
||||
id(). Defaults to 'dlink'.
|
||||
|
||||
=item $dell->os()
|
||||
|
||||
Returns 'dell', 'dlink', or 'ibm' based upon the IANA enterprise number in
|
||||
id(). Defaults to 'dlink'.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $dell->serial()
|
||||
|
||||
Returns serial number. Returns (C<rlPhdUnitGenParamSerialNum>) if available,
|
||||
otherwise uses the Layer3 serial method.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 RADLAN Interface Table (C<swIfTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dell->dell_duplex_admin()
|
||||
|
||||
(C<swIfDuplexAdminMode>)
|
||||
|
||||
=item $dell->dell_duplex()
|
||||
|
||||
(C<swIfDuplexOperMode>)
|
||||
|
||||
=item $dell->dell_tag_mode()
|
||||
|
||||
(C<swIfTaggedMode>)
|
||||
|
||||
=item $dell->dell_i_type()
|
||||
|
||||
(C<swIfType>)
|
||||
|
||||
=item $dell->dell_fc_admin()
|
||||
|
||||
(C<swIfFlowControlMode>)
|
||||
|
||||
=item $dell->dell_speed_admin()
|
||||
|
||||
(C<swIfSpeedAdminMode>)
|
||||
|
||||
=item $dell->dell_auto()
|
||||
|
||||
(C<swIfSpeedDuplexAutoNegotiation>)
|
||||
|
||||
=item $dell->dell_fc()
|
||||
|
||||
(C<swIfOperFlowControlMode>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $dell->interfaces()
|
||||
|
||||
Returns the map between SNMP Interface Identifier (iid) and physical port
|
||||
name. Uses name if available instead of description since descriptions are
|
||||
sometimes not unique.
|
||||
|
||||
=item $dell->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of iid to current link administrative duplex
|
||||
setting.
|
||||
|
||||
=item $dell->fw_mac()
|
||||
|
||||
Returns reference to hash of forwarding table MAC Addresses.
|
||||
|
||||
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
|
||||
the C<Q-BRIDGE-MIB> forwarding table. Fall back to the C<BRIDGE-MIB> if
|
||||
C<Q-BRIDGE-MIB> doesn't return anything.
|
||||
|
||||
=item $dell->fw_port()
|
||||
|
||||
Returns reference to hash of forwarding table entries port interface
|
||||
identifier (iid)
|
||||
|
||||
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
|
||||
the C<Q-BRIDGE-MIB> forwarding table. Fall back to the C<BRIDGE-MIB> if
|
||||
C<Q-BRIDGE-MIB> doesn't return anything.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
427
Info/Layer3/Enterasys.pm
Normal file
427
Info/Layer3/Enterasys.pm
Normal file
@@ -0,0 +1,427 @@
|
||||
# SNMP::Info::Layer3::Enterasys - SNMP Interface to Enterasys devices
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Enterasys;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::MAU;
|
||||
use SNMP::Info::LLDP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::Enterasys::ISA = qw/SNMP::Info::MAU SNMP::Info::LLDP
|
||||
SNMP::Info::CDP SNMP::Info::Layer3
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer3::Enterasys::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS, %SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS, %SNMP::Info::MAU::MIBS,
|
||||
'ENTERASYS-OIDS-MIB' => 'etsysOidDevice',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS, %SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS, %SNMP::Info::MAU::GLOBALS,
|
||||
'mac' => 'dot1dBaseBridgeAddress',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS, %SNMP::Info::MAU::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE, %SNMP::Info::MAU::MUNGE,
|
||||
);
|
||||
|
||||
sub model {
|
||||
my $enterasys = shift;
|
||||
my $id = $enterasys->id();
|
||||
|
||||
unless ( defined $id ) {
|
||||
print
|
||||
" SNMP::Info::Layer3::Enterasys::model() - Device does not support sysObjectID\n"
|
||||
if $enterasys->debug();
|
||||
return;
|
||||
}
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
$model =~ s/^etsysOidDev//i;
|
||||
$model =~ s/^etsysOidPhy//i;
|
||||
return $id unless defined $model;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'enterasys';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'enterasys';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $enterasys = shift;
|
||||
my $descr = $enterasys->description();
|
||||
return unless defined $descr;
|
||||
|
||||
if ( $descr =~ m/\bRev ([\d.]*)/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
# Use ifName as it is used for CDP and LLDP.
|
||||
sub interfaces {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# We need the original ifName, SUPER:: would give us a method definition
|
||||
# in a higher class, we could use orig_ but just call the MIB leaf since
|
||||
# that's what we really want anyway.
|
||||
return $enterasys->ifName($partial)
|
||||
|| $enterasys->i_description($partial);
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $enterasys->i_type($partial) || {};
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
if ( $interfaces->{$if} =~ /(rs232|tunnel|loopback|\blo\b|null)/i ) {
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $enterasys->mau_i_duplex($partial);
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $enterasys->mau_i_duplex_admin($partial);
|
||||
}
|
||||
|
||||
# Normal BRIDGE-MIB has issues on some devices, duplicates and
|
||||
# non-increasing oids, Use Q-BRIDGE-MIB for macsuck
|
||||
sub fw_mac {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $enterasys->qb_fw_mac($partial);
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $enterasys->qb_fw_port($partial);
|
||||
}
|
||||
|
||||
# LLDP table timefilter implementation continuously increments when walked
|
||||
# and we may never reach the end of the table. This behavior can be
|
||||
# modified with the "set snmp timefilter break disable" command,
|
||||
# unfortunately it is not the default. Query with a partial value of zero
|
||||
# which means no time filter.
|
||||
|
||||
sub lldp_ip {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift || 0;
|
||||
|
||||
return $enterasys->SUPER::lldp_ip($partial);
|
||||
}
|
||||
|
||||
# [3564920] LLDP-MIB::lldpLocPortDesc isn't always unique,
|
||||
# use LLDP-MIB::lldpLocPortId this cross references to ifName
|
||||
sub lldp_if {
|
||||
my $lldp = shift;
|
||||
my $partial = shift || 0;
|
||||
|
||||
my $addr = $lldp->lldp_rem_pid($partial) || {};
|
||||
my $i_descr = $lldp->ifName() || {};
|
||||
my %r_i_descr = reverse %$i_descr;
|
||||
|
||||
my %lldp_if;
|
||||
foreach my $key ( keys %$addr ) {
|
||||
my @aOID = split( '\.', $key );
|
||||
my $port = $aOID[1];
|
||||
next unless $port;
|
||||
# Local LLDP port may not equate to ifIndex
|
||||
# Cross reference lldpLocPortId with ifName to get ifIndex
|
||||
my $lldp_desc = $lldp->lldpLocPortId($port);
|
||||
my $desc = $lldp_desc->{$port};
|
||||
# If cross reference is successful use it, otherwise stick with lldpRemLocalPortNum
|
||||
if ( exists $r_i_descr{$desc} ) {
|
||||
$port = $r_i_descr{$desc};
|
||||
}
|
||||
|
||||
$lldp_if{$key} = $port;
|
||||
}
|
||||
return \%lldp_if;
|
||||
}
|
||||
|
||||
sub lldp_port {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift || 0;
|
||||
|
||||
return $enterasys->SUPER::lldp_port($partial);
|
||||
}
|
||||
|
||||
sub lldp_id {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift || 0;
|
||||
|
||||
return $enterasys->SUPER::lldp_id($partial);
|
||||
}
|
||||
|
||||
sub lldp_platform {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift || 0;
|
||||
|
||||
return $enterasys->SUPER::lldp_rem_sysdesc($partial);
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Enterasys - SNMP Interface to Enterasys Network Devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $enterasys = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $enterasys->class();
|
||||
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from an
|
||||
Enterasys device through SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $enterasys = new SNMP::Info::Layer3::Enterasys(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::MAU
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<ENTERASYS-OIDS-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::MAU/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $enterasys->model()
|
||||
|
||||
Returns model type. Checks $enterasys->id() against the
|
||||
F<ENTERASYS-OIDS-MIB>.
|
||||
|
||||
=item $enterasys->vendor()
|
||||
|
||||
Returns enterasys
|
||||
|
||||
=item $enterasys->os()
|
||||
|
||||
Returns enterasys
|
||||
|
||||
=item $enterasys->os_ver()
|
||||
|
||||
Returns os version extracted from C<sysDescr>
|
||||
|
||||
=item $enterasys->mac()
|
||||
|
||||
Returns base mac
|
||||
|
||||
(C<dot1dBaseBridgeAddress>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $enterasys->interfaces()
|
||||
|
||||
Mapping between the Interface Table Index (iid) and the physical port name.
|
||||
|
||||
=item $enterasys->i_ignore()
|
||||
|
||||
Returns reference to hash. Creates a key for each IID that should be ignored.
|
||||
|
||||
Currently looks for rs232, tunnel,loopback,lo,null from
|
||||
$enterasys->interfaces()
|
||||
|
||||
=item $enterasys->i_duplex()
|
||||
|
||||
See documentation for mau_i_duplex() in L<SNMP::Info::MAU/"TABLE METHODS">.
|
||||
|
||||
=item $enterasys->i_duplex_admin()
|
||||
|
||||
See documentation for mau_i_duplex_admin() in
|
||||
L<SNMP::Info::MAU/"TABLE METHODS">.
|
||||
|
||||
=item $enterasys->fw_mac()
|
||||
|
||||
Returns reference to hash of forwarding table MAC Addresses.
|
||||
|
||||
=item $enterasys->fw_port()
|
||||
|
||||
Returns reference to hash of forwarding table entries port interface
|
||||
identifier (iid).
|
||||
|
||||
(C<dot1qTpFdbPort>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Link Layer Discovery Protocol (LLDP) Overrides
|
||||
|
||||
The LLDP table time filter implementation continuously increments when
|
||||
walked and we may never reach the end of the table. This behavior can be
|
||||
modified with the C<"set snmp timefilter break disable"> command,
|
||||
unfortunately it is not the default. These methods are overridden to
|
||||
supply a partial value of zero which means no time filter.
|
||||
|
||||
=over
|
||||
|
||||
=item $enterasys->lldp_if()
|
||||
|
||||
=item $enterasys->lldp_ip()
|
||||
|
||||
=item $enterasys->lldp_port()
|
||||
|
||||
=item $enterasys->lldp_id()
|
||||
|
||||
=item $enterasys->lldp_platform()
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
1053
Info/Layer3/Extreme.pm
Normal file
1053
Info/Layer3/Extreme.pm
Normal file
File diff suppressed because it is too large
Load Diff
416
Info/Layer3/F5.pm
Normal file
416
Info/Layer3/F5.pm
Normal file
@@ -0,0 +1,416 @@
|
||||
# SNMP::Info::Layer3::F5
|
||||
#
|
||||
# Copyright (c) 2012 Eric Miller
|
||||
# All Rights Reserved
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::F5;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::F5::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::F5::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
'F5-BIGIP-SYSTEM-MIB' => 'sysAttrArpMaxEntries',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
'os_ver' => 'sysProductVersion',
|
||||
'mkt_name' => 'sysPlatformInfoMarketingName',
|
||||
'ps1_status' => 'sysChassisPowerSupplyStatus.1',
|
||||
'ps2_status' => 'sysChassisPowerSupplyStatus.2',
|
||||
|
||||
# Named serial1 to override serial1 in L3 serial method
|
||||
'serial1' => 'sysGeneralChassisSerialNum',
|
||||
'qb_vlans' => 'sysVlanNumber',
|
||||
'ports' => 'sysInterfaceNumber',
|
||||
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
|
||||
# sysInterfaceTable
|
||||
'i_index' => 'sysInterfaceName',
|
||||
'i_description' => 'sysInterfaceName',
|
||||
'i_mtu' => 'sysInterfaceMtu',
|
||||
'i_speed' => 'sysInterfaceMediaActiveSpeed',
|
||||
'i_mac' => 'sysInterfaceMacAddr',
|
||||
'i_up_admin' => 'sysInterfaceEnabled',
|
||||
'i_up' => 'sysInterfaceStatus',
|
||||
|
||||
# sysIfxStatTable
|
||||
'i_octet_in' => 'sysIfxStatHcInOctets',
|
||||
'i_octet_out' => 'sysIfxStatHcOutOctets',
|
||||
'i_pkts_ucast_in' => 'sysIfxStatHcInUcastPkts',
|
||||
'i_pkts_ucast_out' => 'sysIfxStatHcOutUcastPkts',
|
||||
|
||||
# sysInterfaceStatTable
|
||||
'i_discards_in' => 'sysInterfaceStatDropsIn',
|
||||
'i_discards_out' => 'sysInterfaceStatDropsOut',
|
||||
'i_errors_in' => 'sysInterfaceStatErrorsIn',
|
||||
'i_errors_out' => 'sysInterfaceStatErrorsOut',
|
||||
|
||||
# sysInterfaceTable
|
||||
'sys_i_duplex' => 'sysInterfaceMediaActiveDuplex',
|
||||
|
||||
# sysChassisFanTable
|
||||
'fan_state' => 'sysChassisFanStatus',
|
||||
|
||||
# sysVlanTable
|
||||
'sys_v_id' => 'sysVlanId',
|
||||
'v_name' => 'sysVlanVname',
|
||||
|
||||
# sysVlanMemberTable
|
||||
'sys_vm_tagged' => 'sysVlanMemberTagged',
|
||||
'sys_vm_name' => 'sysVlanMemberVmname',
|
||||
'sys_vmp_name' => 'sysVlanMemberParentVname',
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'f5';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'f5';
|
||||
}
|
||||
|
||||
sub fan {
|
||||
my $f5 = shift;
|
||||
my $fan_state = $f5->fan_state();
|
||||
my $ret = "";
|
||||
my $s = "";
|
||||
foreach my $i ( sort { $a <=> $b } keys %$fan_state ) {
|
||||
$ret .= $s . $i . ": " . $fan_state->{$i};
|
||||
$s = ", ";
|
||||
}
|
||||
return if ( $s eq "" );
|
||||
return $ret;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $f5 = shift;
|
||||
|
||||
my $name = $f5->mkt_name();
|
||||
|
||||
if ( defined $name ) { return $name; }
|
||||
|
||||
my $id = $f5->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
if ( !defined $model ) { return $id; }
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
# Override L3 interfaces
|
||||
sub interfaces {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $f5->i_index($partial);
|
||||
}
|
||||
|
||||
# Override L3 i_name
|
||||
sub i_name {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $f5->i_index($partial);
|
||||
}
|
||||
|
||||
# We don't have this, so fake it
|
||||
sub i_type {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $idx = $f5->i_index($partial);
|
||||
|
||||
my %i_type;
|
||||
foreach my $if ( keys %$idx ) {
|
||||
|
||||
$i_type{$if} = 'ethernetCsmacd';
|
||||
}
|
||||
return \%i_type;
|
||||
}
|
||||
|
||||
# Override L3 i_duplex
|
||||
sub i_duplex {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $duplexes = $f5->sys_i_duplex() || {};
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $if ( keys %$duplexes ) {
|
||||
my $duplex = $duplexes->{$if};
|
||||
next unless defined $duplex;
|
||||
next if ( $duplex eq 'none' );
|
||||
|
||||
$i_duplex{$if} = $duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
# Override Bridge v_index
|
||||
sub v_index {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $f5->sys_v_id($partial);
|
||||
}
|
||||
|
||||
sub i_vlan {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $index = $f5->i_index($partial) || {};
|
||||
my $tagged = $f5->sys_vm_tagged() || {};
|
||||
my $vlans = $f5->v_index() || {};
|
||||
|
||||
my $i_vlan = {};
|
||||
foreach my $iid ( keys %$tagged ) {
|
||||
my $tag = $tagged->{$iid};
|
||||
next if ( $tag eq 'true' );
|
||||
|
||||
# IID is length.vlan name index.length.interface index
|
||||
# Split out and use as the IID to get the VLAN ID and ifIndex
|
||||
my @iid_array = split /\./, $iid;
|
||||
my $len = $iid_array[0];
|
||||
my $v_idx = join '.', ( splice @iid_array, 0, $len + 1 );
|
||||
my $idx = join '.', @iid_array;
|
||||
|
||||
# Check to make sure we can map to a port
|
||||
my $p_idx = $index->{$idx};
|
||||
next unless $p_idx;
|
||||
|
||||
my $vlan = $vlans->{$v_idx};
|
||||
next unless $vlan;
|
||||
|
||||
$i_vlan->{$idx} = $vlan;
|
||||
}
|
||||
return $i_vlan;
|
||||
}
|
||||
|
||||
sub i_vlan_membership {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $index = $f5->i_index($partial) || {};
|
||||
my $tagged = $f5->sys_vm_tagged() || {};
|
||||
my $vlans = $f5->v_index() || {};
|
||||
|
||||
my $i_vlan_membership = {};
|
||||
foreach my $iid ( keys %$tagged ) {
|
||||
|
||||
# IID is length.vlan name index.length.interface index
|
||||
# Split out and use as the IID to get the VLAN ID and ifIndex
|
||||
my @iid_array = split /\./, $iid;
|
||||
my $len = $iid_array[0];
|
||||
my $v_idx = join '.', ( splice @iid_array, 0, $len + 1 );
|
||||
my $idx = join '.', @iid_array;
|
||||
|
||||
# Check to make sure we can map to a port
|
||||
my $p_idx = $index->{$idx};
|
||||
next unless $p_idx;
|
||||
|
||||
my $vlan = $vlans->{$v_idx};
|
||||
next unless $vlan;
|
||||
|
||||
push( @{ $i_vlan_membership->{$idx} }, $vlan );
|
||||
}
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::F5 - SNMP Interface to F5 network devices.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $f5 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $f5->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Abstraction subclass for F5 network devices.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $f5 = new SNMP::Info::Layer3::F5(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<F5-BIGIP-COMMON-MIB>
|
||||
|
||||
=item F<F5-BIGIP-SYSTEM-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $f5->model()
|
||||
|
||||
Return (C<sysPlatformInfoMarketingName>), otherwise tries to reference
|
||||
$f5->id() to F<F5-BIGIP-COMMON-MIB>.
|
||||
|
||||
=item $f5->vendor()
|
||||
|
||||
Returns 'f5'
|
||||
|
||||
=item $f5->os()
|
||||
|
||||
Returns 'f5'
|
||||
|
||||
=item $f5->os_ver()
|
||||
|
||||
Returns the software version reported by C<sysProductVersion>
|
||||
|
||||
=item $f5->fan()
|
||||
|
||||
Combines (C<sysChassisFanStatus>) into a single string.
|
||||
|
||||
=item $f5->ps1_status()
|
||||
|
||||
Returns status of primary power supply
|
||||
|
||||
=item $f5->ps2_status()
|
||||
|
||||
Returns status of redundant power supply
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a
|
||||
reference to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $f5->interfaces()
|
||||
|
||||
Returns reference to the map between IID and physical port.
|
||||
|
||||
(C<sysInterfaceName>).
|
||||
|
||||
=item $f5->i_duplex()
|
||||
|
||||
Returns reference to hash. Maps port operational duplexes to IIDs.
|
||||
|
||||
=item $f5->i_vlan()
|
||||
|
||||
Returns a mapping between C<ifIndex> and the default VLAN.
|
||||
|
||||
=item $f5->i_vlan_membership()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
IDs.
|
||||
|
||||
Example:
|
||||
my $interfaces = $f5->interfaces();
|
||||
my $vlans = $f5->i_vlan_membership();
|
||||
|
||||
foreach my $iid (sort keys %$interfaces) {
|
||||
my $port = $interfaces->{$iid};
|
||||
my $vlan = join(',', sort(@{$vlans->{$iid}}));
|
||||
print "Port: $port VLAN: $vlan\n";
|
||||
}
|
||||
|
||||
=item $f5->v_index()
|
||||
|
||||
Returns VLAN IDs
|
||||
|
||||
=item $f5->v_name()
|
||||
|
||||
Human-entered name for vlans.
|
||||
|
||||
=item $f5->i_name()
|
||||
|
||||
Returns the human set port name if exists.
|
||||
|
||||
=item $f5->i_type()
|
||||
|
||||
Returns C<'ethernetCsmacd'> for each C<ifIndex>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
333
Info/Layer3/Force10.pm
Normal file
333
Info/Layer3/Force10.pm
Normal file
@@ -0,0 +1,333 @@
|
||||
# SNMP::Info::Layer3::Force10
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2012 William Bulley
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Force10;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::MAU;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer3::Force10::ISA = qw/SNMP::Info::LLDP SNMP::Info::MAU
|
||||
SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Force10::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::MAU::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
'F10-PRODUCTS-MIB' => 'f10Products',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::MAU::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::MAU::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::MAU::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
);
|
||||
|
||||
# use MAU-MIB for admin. duplex and admin. speed
|
||||
*SNMP::Info::Layer3::Force10::i_duplex_admin
|
||||
= \&SNMP::Info::MAU::mau_i_duplex_admin;
|
||||
*SNMP::Info::Layer3::Force10::i_speed_admin
|
||||
= \&SNMP::Info::MAU::mau_i_speed_admin;
|
||||
|
||||
sub vendor {
|
||||
return 'force10';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'ftos';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $force10 = shift;
|
||||
my $descr = $force10->description();
|
||||
my $os_ver = undef;
|
||||
|
||||
$os_ver = $1 if ( $descr =~ /Force10\s+Application\s+Software\s+Version:\s+(\S+)/s );
|
||||
|
||||
return $os_ver;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $force10 = shift;
|
||||
my $id = $force10->id();
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
# Use Q-BRIDGE-MIB
|
||||
|
||||
sub fw_mac {
|
||||
my $force10 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $force10->qb_fw_mac($partial);
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $force10 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $force10->qb_fw_port($partial);
|
||||
}
|
||||
|
||||
sub v_name {
|
||||
my $force10 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $force10->qb_v_name($partial);
|
||||
}
|
||||
|
||||
# ------------------- stub for now-----------------
|
||||
sub i_vlan {
|
||||
my $force10 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_vlan = {};
|
||||
|
||||
return $i_vlan;
|
||||
}
|
||||
|
||||
sub i_vlan_membership {
|
||||
my $force10 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $index = $force10->bp_index();
|
||||
my $v_index = $force10->v_index();
|
||||
|
||||
my $v_ports = $force10->qb_v_egress();
|
||||
|
||||
# If given a partial it will be an ifIndex, we need to use dot1dBasePort
|
||||
if ($partial) {
|
||||
my %r_index = reverse %$index;
|
||||
$partial = $r_index{$partial};
|
||||
}
|
||||
|
||||
my $i_vlan_membership = {};
|
||||
|
||||
foreach my $idx ( sort keys %{$v_ports} ) {
|
||||
next unless ( defined $v_ports->{$idx} );
|
||||
my $portlist = $v_ports->{$idx}; # is an array reference
|
||||
my $ret = [];
|
||||
my $vlan_ndx = $idx;
|
||||
|
||||
# Convert portlist bit array to bp_index array
|
||||
for ( my $i = 0; $i <= $#$portlist; $i++ ) {
|
||||
push( @{$ret}, $i + 1 ) if ( @$portlist[$i] );
|
||||
}
|
||||
|
||||
#Create HoA ifIndex -> VLAN array
|
||||
foreach my $port ( @{$ret} ) {
|
||||
my $ifindex = $index->{$port};
|
||||
next unless ( defined($ifindex) ); # shouldn't happen
|
||||
next if ( defined $partial and $ifindex !~ /^$partial$/ );
|
||||
my $vlan_tag = $v_index->{$vlan_ndx};
|
||||
|
||||
# FIXME: would be preferable to use
|
||||
# the mapping from Q-BRIDGE-MIB::dot1qVlanFdbId
|
||||
my $mod = $vlan_tag % 4096;
|
||||
|
||||
push ( @{ $i_vlan_membership->{$ifindex} }, ($mod) );
|
||||
}
|
||||
}
|
||||
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Force10 - SNMP Interface to Force10 Networks FTOS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
William Bulley
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $force10 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $force10->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Force10 Networks FTOS-based devices.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::MAU
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<F10-PRODUCTS-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar values from SNMP:
|
||||
|
||||
=over
|
||||
|
||||
=item $force10->vendor()
|
||||
|
||||
Returns C<'force10'>
|
||||
|
||||
=item $force10->model()
|
||||
|
||||
Tries to reference $force10->id() to the Force10 product MIB listed above.
|
||||
|
||||
=item $force10->os()
|
||||
|
||||
Returns C<'ftos'>.
|
||||
|
||||
=item $force10->os_ver()
|
||||
|
||||
Grabs the operating system version from C<sysDescr>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $force10->v_name()
|
||||
|
||||
Returns the VLAN names.
|
||||
|
||||
=item $force10->i_vlan()
|
||||
|
||||
Currently not implemented.
|
||||
|
||||
=item $force10->i_vlan_membership()
|
||||
|
||||
Returns reference to hash of arrays:
|
||||
key = C<ifIndex>, value = array of VLAN IDs.
|
||||
These are the VLANs which are members of the egress list for the port.
|
||||
|
||||
=item $force10->fw_mac()
|
||||
|
||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
|
||||
|
||||
=item $force10->fw_port()
|
||||
|
||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
|
||||
|
||||
=item $force10->i_duplex_admin()
|
||||
|
||||
Returns info from F<MAU-MIB>
|
||||
|
||||
=item $force10->i_speed_admin()
|
||||
|
||||
Returns info from F<MAU-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
@@ -1,133 +1,102 @@
|
||||
# SNMP::Info::Layer3::Foundry - SNMP Interface to Foundry devices
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Foundry;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use SNMP::Info::Bridge;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::FDP;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
|
||||
|
||||
@SNMP::Info::Layer3::Foundry::ISA = qw/SNMP::Info SNMP::Info::Bridge Exporter/;
|
||||
@SNMP::Info::Layer3::Foundry::ISA = qw/SNMP::Info::FDP SNMP::Info::LLDP
|
||||
SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Foundry::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$INIT = 0;
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = ( %SNMP::Info::MIBS,
|
||||
%SNMP::Info::Bridge::MIBS,
|
||||
'FOUNDRY-SN-ROOT-MIB' => 'foundry',
|
||||
# IP-FORWARD-MIB
|
||||
# ETHERLIKE-MIB
|
||||
# RFC1398-MIB
|
||||
# RMON-MIB
|
||||
# IF-MIB
|
||||
);
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::FDP::MIBS,
|
||||
'FOUNDRY-SN-ROOT-MIB' => 'foundry',
|
||||
'FOUNDRY-SN-AGENT-MIB' => 'snChasPwrSupplyDescription',
|
||||
'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snSwGroupOperMode',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
# Inherit the super class ones
|
||||
%SNMP::Info::GLOBALS,
|
||||
%SNMP::Info::Bridge::GLOBALS,
|
||||
'mac' => 'ifPhysAddress.1',
|
||||
'chassis' => 'entPhysicalDescr.1',
|
||||
'serial' => 'snChasSerNum',
|
||||
'temp' => 'snChasActualTemperature',
|
||||
'ps1_type' => 'snChasPwrSupplyDescription.1',
|
||||
'ps1_status' => 'snChasPwrSupplyOperStatus.1',
|
||||
'fan' => 'snChasFanOperStatus.1',
|
||||
#'serial' => 'enterprises.1991.1.1.1.1.2.0',
|
||||
#'temp' => 'enterprises.1991.1.1.1.1.18.0',
|
||||
#'ps1_type' => 'enterprises.1991.1.1.1.2.1.1.2.1',
|
||||
#'ps1_status' => 'enterprises.1991.1.1.1.2.1.1.3.1',
|
||||
#'fan' => 'enterprises.1991.1.1.1.3.1.1.3.1'
|
||||
);
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
%SNMP::Info::FDP::GLOBALS,
|
||||
'mac' => 'ifPhysAddress.1',
|
||||
'chassis' => 'entPhysicalDescr.1',
|
||||
'temp' => 'snChasActualTemperature',
|
||||
'ps1_type' => 'snChasPwrSupplyDescription.1',
|
||||
'ps1_status' => 'snChasPwrSupplyOperStatus.1',
|
||||
'fan' => 'snChasFanOperStatus.1',
|
||||
'img_ver' => 'snAgImgVer',
|
||||
'ch_serial' => 'snChasSerNum',
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
%SNMP::Info::Bridge::FUNCS,
|
||||
'i_name2' => 'ifName',
|
||||
# From RFC1213-MIB
|
||||
'at_index' => 'ipNetToMediaIfIndex',
|
||||
'at_paddr' => 'ipNetToMediaPhysAddress',
|
||||
'at_netaddr' => 'ipNetToMediaNetAddress',
|
||||
# FOUNDRY-MIB
|
||||
# snSwPortInfoTable - Switch Port Information Group
|
||||
'sw_index' => 'snSwPortIfIndex',
|
||||
'sw_duplex' => 'snSwPortInfoChnMode',
|
||||
'sw_type' => 'snSwPortInfoMediaType',
|
||||
'sw_speed' => 'snSwPortInfoSpeed',
|
||||
);
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
%SNMP::Info::FDP::FUNCS,
|
||||
|
||||
# FOUNDRY-SN-SWITCH-GROUP-MIB
|
||||
# snSwPortInfoTable - Switch Port Information Group
|
||||
'sw_index' => 'snSwPortIfIndex',
|
||||
'sw_duplex' => 'snSwPortInfoChnMode',
|
||||
'sw_type' => 'snSwPortInfoMediaType',
|
||||
'sw_speed' => 'snSwPortInfoSpeed',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
'at_paddr' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
|
||||
# Method OverRides
|
||||
|
||||
# Add our i_aliases if they are set (manually)
|
||||
sub i_name {
|
||||
my $foundry = shift;
|
||||
my $i_name = $foundry->i_name2();
|
||||
|
||||
my $i_alias = $foundry->i_alias();
|
||||
|
||||
foreach my $iid (keys %$i_name){
|
||||
my $alias = $i_alias->{$iid};
|
||||
next unless defined $alias;
|
||||
next unless length($alias);
|
||||
$i_name->{$iid} = $i_alias->{$iid};
|
||||
}
|
||||
|
||||
return $i_name;
|
||||
}
|
||||
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE,
|
||||
%SNMP::Info::FDP::MUNGE,
|
||||
);
|
||||
|
||||
sub i_ignore {
|
||||
my $foundry = shift;
|
||||
|
||||
my $interfaces = $foundry->interfaces();
|
||||
my $i_descr = $foundry->i_descr();
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $foundry->interfaces($partial) || {};
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if (keys %$interfaces) {
|
||||
# lo -> cisco aironet 350 loopback
|
||||
if ($interfaces->{$if} =~ /(tunnel|loopback|lo|lb|null)/i){
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
if ( $interfaces->{$if} =~ /(tunnel|loopback|\blo\b|lb|null)/i ) {
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
@@ -136,12 +105,18 @@ sub i_ignore {
|
||||
|
||||
sub i_duplex {
|
||||
my $foundry = shift;
|
||||
my $sw_index = $foundry->sw_index();
|
||||
my $sw_duplex= $foundry->sw_duplex();
|
||||
|
||||
my $partial = shift;
|
||||
|
||||
my $sw_index = $foundry->sw_index($partial);
|
||||
my $sw_duplex = $foundry->sw_duplex($partial);
|
||||
|
||||
unless ( defined $sw_index and defined $sw_duplex ) {
|
||||
return $foundry->SUPER::i_duplex();
|
||||
}
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $sw_port (keys %$sw_duplex){
|
||||
my $iid = $sw_index->{$sw_port};
|
||||
foreach my $sw_port ( keys %$sw_duplex ) {
|
||||
my $iid = $sw_index->{$sw_port};
|
||||
my $duplex = $sw_duplex->{$sw_port};
|
||||
next if $duplex =~ /none/i;
|
||||
$i_duplex{$iid} = 'half' if $duplex =~ /half/i;
|
||||
@@ -150,83 +125,162 @@ sub i_duplex {
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_type {
|
||||
my $foundry = shift;
|
||||
my $sw_index = $foundry->sw_index();
|
||||
my $sw_type= $foundry->sw_type();
|
||||
|
||||
my %i_type;
|
||||
foreach my $sw_port (keys %$sw_type){
|
||||
my $iid = $sw_index->{$sw_port};
|
||||
my $type = $sw_type->{$sw_port};
|
||||
next unless defined $type;
|
||||
$i_type{$iid} = $type;
|
||||
}
|
||||
return \%i_type;
|
||||
}
|
||||
|
||||
sub i_speed {
|
||||
my $foundry = shift;
|
||||
my $sw_index = $foundry->sw_index();
|
||||
my $sw_speed= $foundry->sw_speed();
|
||||
|
||||
my %i_speed;
|
||||
foreach my $sw_port (keys %$sw_speed){
|
||||
my $iid = $sw_index->{$sw_port};
|
||||
my $speed = $sw_speed->{$sw_port};
|
||||
next unless defined $speed;
|
||||
$speed = 'auto' if $speed =~ /auto/i;
|
||||
$speed = '10 Mbps' if $speed =~ /s10m/i;
|
||||
$speed = '100 Mbps' if $speed =~ /s100m/i;
|
||||
$speed = '1.0 Gbps' if $speed =~ /s1g/i;
|
||||
$speed = '45 Mbps' if $speed =~ /s45M/i;
|
||||
$speed = '155 Mbps' if $speed =~ /s155M/i;
|
||||
$i_speed{$iid} = $speed;
|
||||
}
|
||||
return \%i_speed;
|
||||
}
|
||||
|
||||
# $foundry->model() - looks for xxnnnn in the description
|
||||
sub model {
|
||||
my $foundry = shift;
|
||||
my $id = $foundry->id();
|
||||
my $desc = $foundry->description();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
my $id = $foundry->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
$model = $1 if $desc =~ /\s+([a-z]{2}\d{4})\D/i;
|
||||
|
||||
# EdgeIron
|
||||
if ( $id =~ /\.1991\.1\.[45]\./ ) {
|
||||
|
||||
my $e_name = $foundry->e_name();
|
||||
|
||||
# Find entity table entry for "unit.1"
|
||||
my $unit_iid = undef;
|
||||
foreach my $e ( keys %$e_name ) {
|
||||
my $name = $e_name->{$e} || '';
|
||||
$unit_iid = $e if $name eq 'unit.1';
|
||||
}
|
||||
|
||||
# Find Model Name
|
||||
my $e_model = $foundry->e_model();
|
||||
if ( defined $e_model->{$unit_iid} ) {
|
||||
return $e_model->{$unit_iid};
|
||||
}
|
||||
}
|
||||
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^sn//;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
# $foundry->interfaces() - Map the Interfaces to their physical names
|
||||
sub interfaces {
|
||||
my $foundry = shift;
|
||||
my $interfaces = $foundry->i_index();
|
||||
|
||||
my $descriptions = $foundry->i_description();
|
||||
|
||||
my %ifs = ();
|
||||
foreach my $iid (keys %$interfaces){
|
||||
$ifs{$iid} = $descriptions->{$iid};
|
||||
}
|
||||
|
||||
return \%ifs;
|
||||
sub os {
|
||||
return 'brocade';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'foundry';
|
||||
return 'brocade';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $foundry = shift;
|
||||
|
||||
return $foundry->img_ver() if ( defined $foundry->img_ver() );
|
||||
|
||||
# Some older ones don't have this value,so we cull it from the description
|
||||
my $descr = $foundry->description();
|
||||
if ( $descr =~ m/Version (\d\S*)/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
# EdgeIron
|
||||
my $e_name = $foundry->e_name();
|
||||
|
||||
# find entity table entry for "stackmanaget.1"
|
||||
my $unit_iid = undef;
|
||||
foreach my $e ( keys %$e_name ) {
|
||||
my $name = $e_name->{$e} || '';
|
||||
$unit_iid = $e if $name eq 'stackmanaget.1';
|
||||
}
|
||||
|
||||
if ( defined $unit_iid ) {
|
||||
|
||||
# Find Model Name
|
||||
my $e_fwver = $foundry->e_fwver();
|
||||
if ( defined $e_fwver->{$unit_iid} ) {
|
||||
return $e_fwver->{$unit_iid};
|
||||
}
|
||||
}
|
||||
|
||||
# See if we report from Flash if wouldn't report from running above
|
||||
return $foundry->snAgFlashImgVer() if ( defined $foundry->snAgFlashImgVer() );
|
||||
|
||||
# Last resort
|
||||
return $foundry->SUPER::os_ver();
|
||||
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $foundry = shift;
|
||||
|
||||
# Return chassis serial number if available
|
||||
return $foundry->ch_serial() if ( $foundry->ch_serial() );
|
||||
|
||||
# If no chassis serial use first module serial
|
||||
my $mod_serials = $foundry->snAgentConfigModuleSerialNumber() || {};
|
||||
|
||||
foreach my $mod ( sort keys %$mod_serials ) {
|
||||
my $serial = $mod_serials->{$mod} || '';
|
||||
next unless defined $serial;
|
||||
return $serial;
|
||||
}
|
||||
|
||||
# EdgeIron
|
||||
my $e_name = $foundry->e_name();
|
||||
|
||||
# find entity table entry for "unit.1"
|
||||
my $unit_iid = undef;
|
||||
foreach my $e ( keys %$e_name ) {
|
||||
my $name = $e_name->{$e} || '';
|
||||
$unit_iid = $e if $name eq 'unit.1';
|
||||
}
|
||||
|
||||
if ( defined $unit_iid ) {
|
||||
|
||||
# Look up serial of found entry.
|
||||
my $e_serial = $foundry->e_serial();
|
||||
return $e_serial->{$unit_iid} if defined $e_serial->{$unit_iid};
|
||||
}
|
||||
|
||||
# Last resort
|
||||
return $foundry->SUPER::serial();
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_descr = $foundry->i_description($partial) || {};
|
||||
my $i_name = $foundry->i_name($partial) || {};
|
||||
|
||||
# Use ifName for EdgeIrons else use ifDescr
|
||||
foreach my $iid ( keys %$i_name ) {
|
||||
my $name = $i_name->{$iid};
|
||||
next unless defined $name;
|
||||
$i_descr->{$iid} = $name
|
||||
if $name =~ /^port\d+/i;
|
||||
}
|
||||
|
||||
return $i_descr;
|
||||
}
|
||||
|
||||
# Reported hangs on a EdgeIron 24G
|
||||
sub stp_p_state {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $descr = $foundry->description();
|
||||
if ( $descr =~ m/\bEdgeIron 24G\b/ ) {
|
||||
return;
|
||||
}
|
||||
|
||||
return $foundry->SUPER::stp_p_state($partial) || {};
|
||||
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Foundry - Perl5 Interface to Foundry FastIron Network Devices
|
||||
SNMP::Info::Layer3::Foundry - SNMP Interface to Brocade (Foundry) Network
|
||||
Devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -234,26 +288,22 @@ Max Baker (C<max@warped.org>)
|
||||
my $foundry = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $foundry->class();
|
||||
my $class = $foundry->class();
|
||||
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This subclass no longer supported.
|
||||
Abstraction subclass for Brocade (Foundry) Networks devices.
|
||||
|
||||
This module provides limited functionality from older Foundry devices.
|
||||
|
||||
Specifically designed for a FI4802.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above. Turn off the AutoSpecify flag.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $foundry = new SNMP::Info::Layer3::Foundry(...);
|
||||
|
||||
@@ -261,9 +311,11 @@ a more specific class using the method above. Turn off the AutoSpecify flag.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info
|
||||
=item SNMP::Info::Layer3;
|
||||
|
||||
=item SNMP::Info::Bridge
|
||||
=item SNMP::Info::FDP;
|
||||
|
||||
=item SNMP::Info::LLDP;
|
||||
|
||||
=back
|
||||
|
||||
@@ -271,16 +323,22 @@ a more specific class using the method above. Turn off the AutoSpecify flag.
|
||||
|
||||
=over
|
||||
|
||||
=item FOUNDRY-SN-ROOT-MIB
|
||||
=item F<FOUNDRY-SN-ROOT-MIB>
|
||||
|
||||
=item F<FOUNDRY-SN-AGENT-MIB>
|
||||
|
||||
=item F<FOUNDRY-SN-SWITCH-GROUP-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See classes listed above for their required MIBs.
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::FDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
The Foundry MIBS can be downloaded from www.mibdepot.com and ??
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
@@ -289,66 +347,88 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=item $foundry->model()
|
||||
|
||||
Returns model type. Checks $foundry->id() against the
|
||||
FOUNDRY-SN-ROOT-MIB and then parses out xxNNNN
|
||||
Returns model type. Checks $foundry->id() against the F<FOUNDRY-SN-ROOT-MIB>
|
||||
and removes 'C<sn>'. EdgeIron models determined through F<ENTITY-MIB>.
|
||||
|
||||
=item $foundry->vendor()
|
||||
|
||||
Returns 'foundry' :)
|
||||
Returns 'brocade'
|
||||
|
||||
=item $foundry->os()
|
||||
|
||||
Returns 'brocade'
|
||||
|
||||
=item $foundry->os_ver()
|
||||
|
||||
Returns the software version
|
||||
|
||||
=item $foundry->mac()
|
||||
|
||||
Returns MAC Address of root port.
|
||||
|
||||
(B<ifPhysAddress.1>)
|
||||
(C<ifPhysAddress.1>)
|
||||
|
||||
=item $foundry->chassis()
|
||||
|
||||
Returns Chassis type.
|
||||
|
||||
(B<entPhysicalDescr.1>)
|
||||
(C<entPhysicalDescr.1>)
|
||||
|
||||
=item $foundry->serial()
|
||||
|
||||
Returns serial number of device.
|
||||
|
||||
(B<snChasSerNum>)
|
||||
|
||||
=item $foundry->temp()
|
||||
|
||||
Returns the chassis temperature
|
||||
|
||||
(B<snChasActualTemperature>)
|
||||
(C<snChasActualTemperature>)
|
||||
|
||||
=item $foundry->ps1_type()
|
||||
|
||||
Returns the Description for the power supply
|
||||
|
||||
(B<snChasPwrSupplyDescription.1>)
|
||||
(C<snChasPwrSupplyDescription.1>)
|
||||
|
||||
=item $foundry->ps1_status()
|
||||
|
||||
Returns the status of the power supply.
|
||||
|
||||
(B<snChasPwrSupplyOperStatus.1>)
|
||||
(C<snChasPwrSupplyOperStatus.1>)
|
||||
|
||||
=item $foundry->fan()
|
||||
|
||||
Returns the status of the chassis fan.
|
||||
|
||||
(B<snChasFanOperStatus.1>)
|
||||
(C<snChasFanOperStatus.1>)
|
||||
|
||||
=item $foundry->img_ver()
|
||||
|
||||
Returns device image version.
|
||||
|
||||
(C<snAgImgVer.0>)
|
||||
|
||||
=item $foundry->ch_serial()
|
||||
|
||||
Returns chassis serial number.
|
||||
|
||||
(C<snChasSerNum.0>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Bridge
|
||||
=head2 Global Methods imported from SNMP::Info::FDP
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
See documentation in L<SNMP::Info::FDP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head2 Global Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
@@ -361,13 +441,6 @@ to a hash.
|
||||
|
||||
Returns reference to hash of interface names to iids.
|
||||
|
||||
Uses B<ifDescr>.
|
||||
|
||||
=item $foundry->i_name()
|
||||
|
||||
Returns reference to hash of interface names.
|
||||
Trys for B<ifAlias> and Defaults to B<ifName>
|
||||
|
||||
=item $foundry->i_ignore()
|
||||
|
||||
Returns reference to hash of interfaces to be ignored.
|
||||
@@ -380,46 +453,18 @@ Returns reference to hash of interface link duplex status.
|
||||
|
||||
Crosses $foundry->sw_duplex() with $foundry->sw_index()
|
||||
|
||||
=item $foundry->i_type()
|
||||
=item $foundry->stp_p_state()
|
||||
|
||||
Returns reference to hash of interface types.
|
||||
"The port's current state as defined by application of the Spanning Tree
|
||||
Protocol.
|
||||
|
||||
Crosses $foundry->sw_type() with $foundry->sw_index()
|
||||
Skipped if device is an EdgeIron 24G due to reports of hangs.
|
||||
|
||||
=item $foundry->i_speed()
|
||||
|
||||
Returns reference to hash of interface speeds .
|
||||
|
||||
Crosses $foundry->sw_speeD() with $foundry->sw_index() and
|
||||
does a little munging.
|
||||
(C<dot1dStpPortState>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 RFC1213 Arp Cache Table (B<ipNetToMediaTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $foundry->at_index()
|
||||
|
||||
Returns reference to hash. Maps ARP table entries to Interface IIDs
|
||||
|
||||
(B<ipNetToMediaIfIndex>)
|
||||
|
||||
=item $foundry->at_paddr()
|
||||
|
||||
Returns reference to hash. Maps ARP table entries to MAC addresses.
|
||||
|
||||
(B<ipNetToMediaPhysAddress>)
|
||||
|
||||
=item $foundry->at_netaddr()
|
||||
|
||||
Returns reference to hash. Maps ARP table entries to IPs
|
||||
|
||||
(B<ipNetToMediaNetAddress>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Foundry Switch Port Information Table (B<snSwPortIfTable>)
|
||||
=head2 Foundry Switch Port Information Table (C<snSwPortIfTable>)
|
||||
|
||||
=over
|
||||
|
||||
@@ -427,34 +472,38 @@ Returns reference to hash. Maps ARP table entries to IPs
|
||||
|
||||
Returns reference to hash. Maps Table to Interface IID.
|
||||
|
||||
(B<snSwPortIfIndex>)
|
||||
(C<snSwPortIfIndex>)
|
||||
|
||||
=item $foundry->sw_duplex()
|
||||
|
||||
Returns reference to hash. Current duplex status for switch ports.
|
||||
|
||||
(B<snSwPortInfoChnMode>)
|
||||
(C<snSwPortInfoChnMode>)
|
||||
|
||||
=item $foundry->sw_type()
|
||||
|
||||
Returns reference to hash. Current Port Type .
|
||||
|
||||
(B<snSwPortInfoMediaType>)
|
||||
(C<snSwPortInfoMediaType>)
|
||||
|
||||
=item $foundry->sw_speed()
|
||||
|
||||
Returns reference to hash. Current Port Speed.
|
||||
|
||||
(B<snSwPortInfoSpeed>)
|
||||
(C<snSwPortInfoSpeed>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Bridge
|
||||
=head2 Table Methods imported from SNMP::Info::FDP
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
See documentation in L<SNMP::Info::FDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
256
Info/Layer3/H3C.pm
Normal file
256
Info/Layer3/H3C.pm
Normal file
@@ -0,0 +1,256 @@
|
||||
# SNMP::Info::Layer3::H3C
|
||||
#
|
||||
# Copyright (c) 2012 Jeroen van Ingen
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::H3C;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer3::H3C::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::H3C::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
'HH3C-LswDEVM-MIB' => 'hh3cDevMFanStatus',
|
||||
'HH3C-LswINF-MIB' => 'hh3cSlotPortMax',
|
||||
'HH3C-LSW-DEV-ADM-MIB' => 'hh3cLswSysVersion',
|
||||
'HH3C-PRODUCT-ID-MIB' => 'hh3c-s5500-28C-EI',
|
||||
'HH3C-ENTITY-VENDORTYPE-OID-MIB' => 'hh3cevtOther',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
'fan' => 'hh3cDevMFanStatus.1',
|
||||
'ps1_status' => 'hh3cDevMPowerStatus.1',
|
||||
'ps2_status' => 'hh3cDevMPowerStatus.2',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
i_duplex_admin => 'hh3cifEthernetDuplex',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
my $h3c = shift;
|
||||
my $mfg = $h3c->entPhysicalMfgName(1) || {};
|
||||
return $mfg->{1};
|
||||
}
|
||||
|
||||
sub os {
|
||||
my $h3c = shift;
|
||||
my $descr = $h3c->description();
|
||||
|
||||
return $1 if ( $descr =~ /(\S+)\s+Platform Software/ );
|
||||
return;
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $h3c = shift;
|
||||
my $descr = $h3c->description();
|
||||
# my $version = $h3c->hh3cLswSysVersion(); # Don't use, indicates base version only, no release details
|
||||
my $ver_release = $h3c->entPhysicalSoftwareRev(2) || {};
|
||||
my $os_ver = undef;
|
||||
|
||||
$os_ver = "$1 $2" if ( $descr =~ /Software Version ([^,]+),.*(Release\s\S+)/i );
|
||||
|
||||
return $ver_release->{2} || $os_ver;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $l3->interfaces($partial) || {};
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
|
||||
# lo0 etc
|
||||
if ( $interfaces->{$if} =~ /\blo\d*\b/i ) {
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
# Use Q-BRIDGE-MIB
|
||||
|
||||
sub fw_mac {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $l3->qb_fw_mac($partial);
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $l3->qb_fw_port($partial);
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::H3C - SNMP Interface to L3 Devices, H3C & HP A-series
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Jeroen van Ingen
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $h3c = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $h3c->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for H3C & HP A-series devices
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<HH3C-LswDEVM-MIB>
|
||||
|
||||
=item F<HH3C-LswINF-MIB>
|
||||
|
||||
=item F<HH3C-LSW-DEV-ADM-MIB>
|
||||
|
||||
=item F<HH3C-PRODUCT-ID-MIB>
|
||||
|
||||
=item F<HH3C-ENTITY-VENDORTYPE-OID-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $h3c->vendor()
|
||||
|
||||
Returns value for C<entPhysicalMfgName.1>.
|
||||
|
||||
=item $h3c->os()
|
||||
|
||||
Returns the OS extracted from C<sysDescr>.
|
||||
|
||||
=item $h3c->os_ver()
|
||||
|
||||
Returns the software version. Either C<entPhysicalSoftwareRev.2> or extracted from
|
||||
C<sysDescr>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $h3c->i_ignore()
|
||||
|
||||
Returns reference to hash. Increments value of IID if port is to be ignored.
|
||||
|
||||
Ignores loopback
|
||||
|
||||
=item $h3c->fw_mac()
|
||||
|
||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
|
||||
|
||||
=item $h3c->fw_port()
|
||||
|
||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP> for details.
|
||||
|
||||
=cut
|
||||
414
Info/Layer3/HP9300.pm
Normal file
414
Info/Layer3/HP9300.pm
Normal file
@@ -0,0 +1,414 @@
|
||||
# SNMP::Info::Layer3::HP9300 - SNMP Interface to HP Foundry OEM devices
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::HP9300;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::FDP;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer3::HP9300::ISA = qw/SNMP::Info::FDP SNMP::Info::LLDP
|
||||
SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::HP9300::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::FDP::MIBS,
|
||||
'HP-SN-ROOT-MIB' => 'hp',
|
||||
'HP-SN-AGENT-MIB' => 'snChasPwrSupplyDescription',
|
||||
'HP-SN-SWITCH-GROUP-MIB' => 'snSwGroupOperMode',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
%SNMP::Info::FDP::GLOBALS,
|
||||
'mac' => 'ifPhysAddress.1',
|
||||
'chassis' => 'entPhysicalDescr.1',
|
||||
'temp' => 'snChasActualTemperature',
|
||||
'ps1_type' => 'snChasPwrSupplyDescription.1',
|
||||
'ps1_status' => 'snChasPwrSupplyOperStatus.1',
|
||||
'fan' => 'snChasFanOperStatus.1',
|
||||
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
%SNMP::Info::FDP::FUNCS,
|
||||
|
||||
# HP-SN-SWITCH-GROUP-MIB
|
||||
# snSwPortInfoTable - Switch Port Information Group
|
||||
# Fully qualify these since FDP class will load
|
||||
# FOUNDRY-SN-SWITCH-GROUP-MIB which contains the same leaf names
|
||||
'sw_index' => 'HP_SN_SWITCH_GROUP_MIB__snSwPortIfIndex',
|
||||
'sw_duplex' => 'HP_SN_SWITCH_GROUP_MIB__snSwPortInfoChnMode',
|
||||
'sw_type' => 'HP_SN_SWITCH_GROUP_MIB__snSwPortInfoMediaType',
|
||||
'sw_speed' => 'HP_SN_SWITCH_GROUP_MIB__snSwPortInfoSpeed',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE,
|
||||
%SNMP::Info::FDP::MUNGE,
|
||||
);
|
||||
|
||||
sub i_ignore {
|
||||
my $hp9300 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $hp9300->interfaces($partial) || {};
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
if ( $interfaces->{$if} =~ /(tunnel|loopback|\blo\b|lb|null)/i ) {
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $hp9300 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $sw_index = $hp9300->sw_index($partial);
|
||||
my $sw_duplex = $hp9300->sw_duplex($partial);
|
||||
|
||||
unless ( defined $sw_index and defined $sw_duplex ) {
|
||||
return $hp9300->SUPER::i_duplex();
|
||||
}
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $sw_port ( keys %$sw_duplex ) {
|
||||
my $iid = $sw_index->{$sw_port};
|
||||
my $duplex = $sw_duplex->{$sw_port};
|
||||
next if $duplex =~ /none/i;
|
||||
$i_duplex{$iid} = 'half' if $duplex =~ /half/i;
|
||||
$i_duplex{$iid} = 'full' if $duplex =~ /full/i;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $hp9300 = shift;
|
||||
my $id = $hp9300->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^hpSwitch//;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'hp';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'hp';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $hp9300 = shift;
|
||||
|
||||
return $hp9300->snAgImgVer() if ( defined $hp9300->snAgImgVer() );
|
||||
|
||||
# Some older ones don't have this value,so we cull it from the description
|
||||
my $descr = $hp9300->description();
|
||||
if ( $descr =~ m/Version (\d\S*)/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
# Last resort
|
||||
return $hp9300->SUPER::os_ver();
|
||||
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $hp9300 = shift;
|
||||
|
||||
# Return chassis serial number if available
|
||||
return $hp9300->snChasSerNum() if ( $hp9300->snChasSerNum() );
|
||||
|
||||
# If no chassis serial use first module serial
|
||||
my $mod_serials = $hp9300->snAgentConfigModuleSerialNumber();
|
||||
|
||||
foreach my $mod ( sort keys %$mod_serials ) {
|
||||
my $serial = $mod_serials->{$mod} || '';
|
||||
next unless defined $serial;
|
||||
return $serial;
|
||||
}
|
||||
|
||||
# Last resort
|
||||
return $hp9300->SUPER::serial();
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $hp9300 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_descr = $hp9300->i_description($partial) || {};
|
||||
my $i_name = $hp9300->i_name($partial) || {};
|
||||
|
||||
# Use ifName for EdgeIrons else use ifDescr
|
||||
foreach my $iid ( keys %$i_name ) {
|
||||
my $name = $i_name->{$iid};
|
||||
next unless defined $name;
|
||||
$i_descr->{$iid} = $name
|
||||
if $name =~ /^port\d+/i;
|
||||
}
|
||||
|
||||
return $i_descr;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::HP9300 - SNMP Interface to HP Foundry OEM Network Devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $hp9300 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $hp9300->class();
|
||||
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Abstraction subclass for HP network devices which Foundry Networks was the
|
||||
Original Equipment Manufacturer (OEM) such as the HP ProCurve 9300 series.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $hp9300 = new SNMP::Info::Layer3::HP9300(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3;
|
||||
|
||||
=item SNMP::Info::FDP;
|
||||
|
||||
=item SNMP::Info::LLDP;
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<HP-SN-ROOT-MIB>
|
||||
|
||||
=item F<HP-SN-AGENT-MIB>
|
||||
|
||||
=item F<HP-SN-SWITCH-GROUP-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::FDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $hp9300->model()
|
||||
|
||||
Returns model type. Checks $hp9300->id() against the F<HP-SN-ROOT-MIB>
|
||||
and removes C<hpSwitch>.
|
||||
|
||||
=item $hp9300->vendor()
|
||||
|
||||
Returns 'hp'
|
||||
|
||||
=item $hp9300->os()
|
||||
|
||||
Returns 'hp'
|
||||
|
||||
=item $hp9300->os_ver()
|
||||
|
||||
Returns the software version
|
||||
|
||||
=item $hp9300->mac()
|
||||
|
||||
Returns MAC Address of root port.
|
||||
|
||||
(C<ifPhysAddress.1>)
|
||||
|
||||
=item $hp9300->chassis()
|
||||
|
||||
Returns Chassis type.
|
||||
|
||||
(C<entPhysicalDescr.1>)
|
||||
|
||||
=item $hp9300->serial()
|
||||
|
||||
Returns serial number of device.
|
||||
|
||||
=item $hp9300->temp()
|
||||
|
||||
Returns the chassis temperature
|
||||
|
||||
(C<snChasActualTemperature>)
|
||||
|
||||
=item $hp9300->ps1_type()
|
||||
|
||||
Returns the Description for the power supply
|
||||
|
||||
(C<snChasPwrSupplyDescription.1>)
|
||||
|
||||
=item $hp9300->ps1_status()
|
||||
|
||||
Returns the status of the power supply.
|
||||
|
||||
(C<snChasPwrSupplyOperStatus.1>)
|
||||
|
||||
=item $hp9300->fan()
|
||||
|
||||
Returns the status of the chassis fan.
|
||||
|
||||
(C<snChasFanOperStatus.1>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::FDP
|
||||
|
||||
See documentation in L<SNMP::Info::FDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $hp9300->interfaces()
|
||||
|
||||
Returns reference to hash of interface names to iids.
|
||||
|
||||
=item $hp9300->i_ignore()
|
||||
|
||||
Returns reference to hash of interfaces to be ignored.
|
||||
|
||||
Ignores interfaces with descriptions of tunnel,loopback,null
|
||||
|
||||
=item $hp9300->i_duplex()
|
||||
|
||||
Returns reference to hash of interface link duplex status.
|
||||
|
||||
Crosses $hp9300->sw_duplex() with $hp9300->sw_index()
|
||||
|
||||
=back
|
||||
|
||||
=head2 Switch Port Information Table (C<snSwPortIfTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $hp9300->sw_index()
|
||||
|
||||
Returns reference to hash. Maps Table to Interface IID.
|
||||
|
||||
(C<snSwPortIfIndex>)
|
||||
|
||||
=item $hp9300->sw_duplex()
|
||||
|
||||
Returns reference to hash. Current duplex status for switch ports.
|
||||
|
||||
(C<snSwPortInfoChnMode>)
|
||||
|
||||
=item $hp9300->sw_type()
|
||||
|
||||
Returns reference to hash. Current Port Type .
|
||||
|
||||
(C<snSwPortInfoMediaType>)
|
||||
|
||||
=item $hp9300->sw_speed()
|
||||
|
||||
Returns reference to hash. Current Port Speed.
|
||||
|
||||
(C<snSwPortInfoSpeed>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::FDP
|
||||
|
||||
See documentation in L<SNMP::Info::FDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
765
Info/Layer3/Juniper.pm
Normal file
765
Info/Layer3/Juniper.pm
Normal file
@@ -0,0 +1,765 @@
|
||||
# SNMP::Info::Layer3::Juniper
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Bill Fenner
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Juniper;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer3::Juniper::ISA = qw/SNMP::Info::Layer3 SNMP::Info::LLDP Exporter/;
|
||||
@SNMP::Info::Layer3::Juniper::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
'JUNIPER-CHASSIS-DEFINES-MIB' => 'jnxChassisDefines',
|
||||
'JUNIPER-MIB' => 'jnxBoxAnatomy',
|
||||
'JUNIPER-VIRTUALCHASSIS-MIB' => 'jnxVirtualChassisMemberTable',
|
||||
'JUNIPER-VLAN-MIB' => 'jnxVlanMIBObjects',
|
||||
);
|
||||
|
||||
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
'serial' => 'jnxBoxSerialNo.0',
|
||||
'mac' => 'dot1dBaseBridgeAddress',
|
||||
'box_descr' => 'jnxBoxDescr'
|
||||
);
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
|
||||
# JUNIPER-VLAN-MIB::jnxExVlanTable
|
||||
'v_index' => 'jnxExVlanTag',
|
||||
'v_type' => 'jnxExVlanType',
|
||||
'v_name' => 'jnxExVlanName',
|
||||
|
||||
# JUNIPER-VLAN-MIB::jnxExVlanPortGroupTable
|
||||
'i_trunk' => 'jnxExVlanPortAccessMode',
|
||||
|
||||
# JUNPIER-MIB
|
||||
'e_contents_type' => 'jnxContentsType',
|
||||
'e_containers_type' => 'jnxContainersType',
|
||||
'e_hwver' => 'jnxContentsRevision',
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
'e_containers_type' => \&SNMP::Info::munge_e_type,
|
||||
'e_contents_type' => \&SNMP::Info::munge_e_type,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'juniper';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'junos';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $juniper = shift;
|
||||
|
||||
my $descr = $juniper->description() || '';
|
||||
my $lldp_descr = $juniper->lldp_sysdesc() || '';
|
||||
|
||||
if ( $descr =~ m/kernel JUNOS (\S+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
elsif ( $lldp_descr =~ m/version\s(\S+)\s/ ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $l3 = shift;
|
||||
my $id = $l3->id();
|
||||
|
||||
unless ( defined $id ) {
|
||||
print
|
||||
" SNMP::Info::Layer3::Juniper::model() - Device does not support sysObjectID\n"
|
||||
if $l3->debug();
|
||||
return;
|
||||
}
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^jnxProductName//i;
|
||||
return $model;
|
||||
}
|
||||
|
||||
# Override the fancy Layer3.pm serial function
|
||||
sub serial {
|
||||
my $juniper = shift;
|
||||
return $juniper->orig_serial();
|
||||
}
|
||||
|
||||
# 'i_trunk' => 'jnxExVlanPortAccessMode',
|
||||
sub i_trunk {
|
||||
my $juniper = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $access = $juniper->jnxExVlanPortAccessMode($partial);
|
||||
|
||||
my %i_trunk;
|
||||
|
||||
foreach (keys %$access)
|
||||
{
|
||||
my $old_key = $_;
|
||||
m/^\d+\.(\d+)$/o;
|
||||
my $new_key = $1;
|
||||
$i_trunk{$new_key} = $access->{$old_key};
|
||||
}
|
||||
|
||||
return \%i_trunk;
|
||||
}
|
||||
|
||||
# 'v_type' => 'jnxExVlanType',
|
||||
sub v_type {
|
||||
my $juniper = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $v_type = $juniper->jnxExVlanType($partial);
|
||||
|
||||
return $v_type;
|
||||
}
|
||||
|
||||
# 'v_index' => 'jnxExVlanTag',
|
||||
sub v_index {
|
||||
my ($juniper) = shift;
|
||||
my ($partial) = shift;
|
||||
|
||||
my ($v_index) = $juniper->jnxExVlanTag($partial);
|
||||
|
||||
return $v_index;
|
||||
}
|
||||
|
||||
sub i_vlan {
|
||||
my $juniper = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $index = $juniper->bp_index();
|
||||
|
||||
# If given a partial it will be an ifIndex, we need to use dot1dBasePort
|
||||
if ($partial) {
|
||||
my %r_index = reverse %$index;
|
||||
$partial = $r_index{$partial};
|
||||
}
|
||||
|
||||
my $v_index = $juniper->jnxExVlanTag();
|
||||
my $i_pvid = $juniper->qb_i_vlan($partial) || {};
|
||||
my $i_vlan = {};
|
||||
|
||||
foreach my $bport ( keys %$i_pvid ) {
|
||||
my $q_vlan = $i_pvid->{$bport};
|
||||
my $vlan = $v_index->{$q_vlan};
|
||||
my $ifindex = $index->{$bport};
|
||||
unless ( defined $ifindex ) {
|
||||
print " Port $bport has no bp_index mapping. Skipping.\n"
|
||||
if $DEBUG;
|
||||
next;
|
||||
}
|
||||
$i_vlan->{$ifindex} = $vlan;
|
||||
}
|
||||
|
||||
return $i_vlan;
|
||||
}
|
||||
|
||||
sub i_vlan_membership {
|
||||
my $juniper = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $index = $juniper->bp_index();
|
||||
my ($v_index) = $juniper->jnxExVlanTag($partial);
|
||||
|
||||
my $v_ports = $juniper->qb_v_egress() || {};
|
||||
|
||||
my $i_vlan_membership = {};
|
||||
|
||||
foreach my $idx ( sort keys %$v_ports ) {
|
||||
next unless ( defined $v_ports->{$idx} );
|
||||
my $portlist = $v_ports->{$idx}; # is an array reference
|
||||
my $ret = [];
|
||||
my $vlan_ndx = $idx;
|
||||
|
||||
# Convert portlist bit array to bp_index array
|
||||
for ( my $i = 0; $i <= $#$portlist; $i++ ) {
|
||||
push( @{$ret}, $i + 1 ) if ( @$portlist[$i] );
|
||||
}
|
||||
|
||||
#Create HoA ifIndex -> VLAN array
|
||||
foreach my $port ( @{$ret} ) {
|
||||
my $ifindex = $index->{$port};
|
||||
next unless ( defined($ifindex) ); # shouldn't happen
|
||||
next if ( defined $partial and $ifindex !~ /^$partial$/ );
|
||||
push ( @{ $i_vlan_membership->{$ifindex} }, $v_index->{$vlan_ndx} );
|
||||
}
|
||||
}
|
||||
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
# Use Q-BRIDGE-MIB for bridge forwarding tables
|
||||
sub fw_mac {
|
||||
my $juniper = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $juniper->qb_fw_mac($partial);
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $juniper = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $juniper->qb_fw_port($partial);
|
||||
}
|
||||
|
||||
# Pseudo ENTITY-MIB methods
|
||||
|
||||
# This class supports both virtual chassis (stackable) and physical chassis
|
||||
# based devices, identify if we have a virtual chassis so that we return
|
||||
# appropriate entPhysicalClass and correct ordering
|
||||
|
||||
sub _e_is_virtual {
|
||||
my $juniper = shift;
|
||||
|
||||
my $v_test = $juniper->jnxVirtualChassisMemberRole() || {};
|
||||
|
||||
#If we are functioning as a stack someone should be master
|
||||
foreach my $iid ( keys %$v_test ) {
|
||||
my $role = $v_test->{$iid};
|
||||
return 1 if ($role =~ /master/i);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
sub _e_virtual_index {
|
||||
my $juniper = shift;
|
||||
|
||||
my $containers = $juniper->jnxContainersWithin() || {};
|
||||
my $members = $juniper->jnxVirtualChassisMemberRole() || {};
|
||||
|
||||
my %v_index;
|
||||
foreach my $key (keys %$containers) {
|
||||
foreach my $member ( keys %$members ) {
|
||||
# Virtual chassis members start at zero
|
||||
$member++;
|
||||
# We will be duplicating and eliminating some keys,
|
||||
# but this is for the benefit of e_parent()
|
||||
my $index = sprintf ("%02d", $key) . sprintf ("%02d", $member) . "0000";
|
||||
my $iid = "$key\.$member\.0\.0";
|
||||
$v_index{$iid} = $index;
|
||||
}
|
||||
unless ($containers->{$key}) {
|
||||
my $index = sprintf ("%02d", $key) . "000000";
|
||||
$v_index{$key} = $index;
|
||||
}
|
||||
}
|
||||
return \%v_index;
|
||||
}
|
||||
|
||||
sub e_index {
|
||||
my $juniper = shift;
|
||||
|
||||
my $contents = $juniper->jnxContentsDescr() || {};
|
||||
my $containers = $juniper->jnxContainersDescr() || {};
|
||||
my $virtuals = $juniper->_e_virtual_index() || {};
|
||||
my $is_virtual = $juniper->_e_is_virtual();
|
||||
|
||||
# Format into consistent integer format so that numeric sorting works
|
||||
my %e_index;
|
||||
if ($is_virtual) {
|
||||
foreach my $key ( keys %$virtuals ) {
|
||||
$e_index{$key} = $virtuals->{$key};
|
||||
}
|
||||
}
|
||||
else {
|
||||
foreach my $key ( keys %$containers ) {
|
||||
$e_index{$key} = sprintf ("%02d", $key) . "000000";
|
||||
}
|
||||
}
|
||||
foreach my $key ( keys %$contents ) {
|
||||
$e_index{$key} = join( '', map { sprintf "%02d", $_ } split /\./, $key );
|
||||
}
|
||||
|
||||
return \%e_index;
|
||||
}
|
||||
|
||||
sub e_class {
|
||||
my $juniper = shift;
|
||||
|
||||
my $e_index = $juniper->e_index() || {};
|
||||
my $fru_type = $juniper->jnxFruType() || {};
|
||||
my $c_type = $juniper->jnxContainersDescr() || {};
|
||||
my $is_virtual = $juniper->_e_is_virtual();
|
||||
|
||||
my %e_class;
|
||||
foreach my $iid ( keys %$e_index ) {
|
||||
|
||||
my $type = $fru_type->{$iid} || 0;
|
||||
my $container = $c_type->{$iid} || 0;
|
||||
|
||||
if ( $type =~ /power/i ) {
|
||||
$e_class{$iid} = 'powerSupply';
|
||||
}
|
||||
elsif ( $type =~ /fan/i ) {
|
||||
$e_class{$iid} = 'fan';
|
||||
}
|
||||
elsif ( $type ) {
|
||||
$e_class{$iid} = 'module';
|
||||
}
|
||||
# Shouldn't get here if we have type which means
|
||||
# we only have container, chassis, and stack left
|
||||
elsif (($container =~ /chassis/i) and (!$is_virtual) ) {
|
||||
$e_class{$iid} = 'chassis';
|
||||
}
|
||||
elsif (($container =~ /chassis/i) and ($is_virtual)) {
|
||||
$e_class{$iid} = 'stack';
|
||||
}
|
||||
# Were calling the second level chassis a container in the case
|
||||
# of a virtual chassis but not sure that it really matters
|
||||
else {
|
||||
$e_class{$iid} = 'container';
|
||||
}
|
||||
}
|
||||
return \%e_class;
|
||||
}
|
||||
|
||||
sub e_descr {
|
||||
my $juniper = shift;
|
||||
|
||||
my $e_index = $juniper->e_index() || {};
|
||||
my $box_descr = $juniper->box_descr;
|
||||
my $contents = $juniper->jnxContentsDescr() || {};
|
||||
my $containers = $juniper->jnxContainersDescr() || {};
|
||||
|
||||
my %e_descr;
|
||||
foreach my $iid ( keys %$e_index ) {
|
||||
|
||||
my $content_descr = $contents->{$iid} || 0;
|
||||
my $container_descr = $containers->{$iid} || 0;
|
||||
|
||||
if ($content_descr) {
|
||||
$e_descr{$iid} = $content_descr;
|
||||
}
|
||||
elsif ($container_descr and $container_descr !~ /chassis/) {
|
||||
$e_descr{$iid} = $container_descr;
|
||||
}
|
||||
elsif ($container_descr and $container_descr =~ /chassis/) {
|
||||
$e_descr{$iid} = $box_descr;
|
||||
}
|
||||
# We should only be left with virtual entries created in
|
||||
# _e_virtual_index()
|
||||
elsif ($iid =~ /^(\d+)\.(\d+)(\.0)+?/) {
|
||||
my $descr = $containers->{$1};
|
||||
$e_descr{$iid} = $descr;
|
||||
}
|
||||
# Anything past here undef
|
||||
}
|
||||
return \%e_descr;
|
||||
}
|
||||
|
||||
sub e_serial {
|
||||
my $juniper = shift;
|
||||
|
||||
my $e_index = $juniper->e_index() || {};
|
||||
my $serials = $juniper->jnxContentsSerialNo() || {};
|
||||
my $e_class = $juniper->e_class() || {};
|
||||
my $is_virtual = $juniper->_e_is_virtual();
|
||||
my $box_serial = $juniper->serial();
|
||||
|
||||
my %e_serial;
|
||||
foreach my $iid ( keys %$e_index ) {
|
||||
my $serial = $serials->{$iid} || '';
|
||||
my $class = $e_class->{$iid} || '';
|
||||
# Chassis serial number is seperate on true chassis
|
||||
# Virtual chassis (stack) report master switch serial
|
||||
if (!$is_virtual and ($class =~ /chassis/i)){
|
||||
$e_serial{$iid} = $box_serial;
|
||||
}
|
||||
elsif (($serial !~ /^\w/) or ($serial =~ /builtin/i)) {
|
||||
next;
|
||||
}
|
||||
else {
|
||||
$e_serial{$iid} = $serial;
|
||||
}
|
||||
}
|
||||
return \%e_serial;
|
||||
}
|
||||
|
||||
sub e_fru {
|
||||
my $juniper = shift;
|
||||
|
||||
my $e_index = $juniper->e_index() || {};
|
||||
my $frus = $juniper->jnxContentsPartNo() || {};
|
||||
|
||||
my %e_fru;
|
||||
foreach my $iid ( keys %$e_index ) {
|
||||
my $fru = $frus->{$iid} || '';
|
||||
if ( ($fru !~ /^\w/) or ($fru =~ /builtin/i)) {
|
||||
$e_fru{$iid} = "false";
|
||||
}
|
||||
else {
|
||||
$e_fru{$iid} = "true";
|
||||
}
|
||||
}
|
||||
return \%e_fru;
|
||||
}
|
||||
|
||||
sub e_type {
|
||||
my $juniper = shift;
|
||||
|
||||
my $e_index = $juniper->e_index() || {};
|
||||
my $contents = $juniper->e_contents_type() || {};
|
||||
my $containers = $juniper->e_containers_type() || {};
|
||||
|
||||
my %e_type;
|
||||
foreach my $iid ( keys %$e_index ) {
|
||||
|
||||
my $content_type = $contents->{$iid} || 0;
|
||||
my $container_type = $containers->{$iid} || 0;
|
||||
|
||||
if ($content_type) {
|
||||
$content_type =~ s/\.0//;
|
||||
$e_type{$iid} = $content_type;
|
||||
}
|
||||
elsif ($container_type) {
|
||||
$container_type =~ s/\.0//;
|
||||
$e_type{$iid} = $container_type;
|
||||
}
|
||||
# We should only be left with virtual entries created in
|
||||
# _e_virtual_index()
|
||||
elsif ($iid =~ /^(\d+)\.(\d+)(\.0)+?/) {
|
||||
my $descr = $containers->{$1};
|
||||
$descr =~ s/\.0//;
|
||||
$e_type{$iid} = $descr;
|
||||
}
|
||||
# Anything past here undef
|
||||
}
|
||||
return \%e_type;
|
||||
}
|
||||
|
||||
sub e_vendor {
|
||||
my $juniper = shift;
|
||||
|
||||
my $e_idx = $juniper->e_index() || {};
|
||||
|
||||
my %e_vendor;
|
||||
foreach my $iid ( keys %$e_idx ) {
|
||||
$e_vendor{$iid} = 'juniper';
|
||||
}
|
||||
return \%e_vendor;
|
||||
}
|
||||
|
||||
sub e_pos {
|
||||
my $juniper = shift;
|
||||
|
||||
# We could look at index levels, but his will work as well
|
||||
return $juniper->e_index();
|
||||
}
|
||||
|
||||
sub e_parent {
|
||||
my $juniper = shift;
|
||||
|
||||
my $e_idx = $juniper->e_index() || {};
|
||||
my $c_within = $juniper->jnxContainersWithin() || {};
|
||||
my $e_descr = $juniper->e_descr() || {};
|
||||
my $is_virtual = $juniper->_e_is_virtual();
|
||||
|
||||
my %e_parent;
|
||||
foreach my $iid ( keys %$e_idx ) {
|
||||
next unless $iid;
|
||||
|
||||
my ($idx, $l1,$l2, $l3) = split /\./, $iid;
|
||||
my $within = $c_within->{$idx};
|
||||
my $descr = $e_descr->{$iid};
|
||||
|
||||
if ( !$is_virtual and ($iid =~ /^(\d+)\.\d+/) ) {
|
||||
$e_parent{$iid} = sprintf ("%02d", $1) . "000000";
|
||||
}
|
||||
elsif ( $is_virtual and ($descr =~ /chassis/i) and ($iid =~ /^(\d+)\.(\d+)(\.0)+?/) ) {
|
||||
$e_parent{$iid} = sprintf ("%02d", $1) . "000000";
|
||||
}
|
||||
elsif ( $is_virtual and ($iid =~ /^(\d+)\.(\d+)(\.0)+?/) ) {
|
||||
$e_parent{$iid} = sprintf ("%02d", $within) . sprintf ("%02d", $2) . "0000";
|
||||
}
|
||||
elsif ( $is_virtual and ($iid =~ /^(\d+)\.(\d+)\.[1-9]+/) ) {
|
||||
$e_parent{$iid} = sprintf ("%02d", $1) . sprintf ("%02d", $2) . "0000";
|
||||
}
|
||||
elsif ( defined $within and $iid =~ /\d+/ ) {
|
||||
$e_parent{$iid} = sprintf ("%02d", $within) . "000000";
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
return \%e_parent;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Juniper - SNMP Interface to L3 Juniper Devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Bill Fenner
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $juniper = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $juniper->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Juniper Devices running JUNOS
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<JUNIPER-VLAN-MIB> dated "200901090000Z" or later.
|
||||
|
||||
=item F<JUNIPER-CHASSIS-DEFINES-MIB>
|
||||
|
||||
=item F<JUNIPER-MIB>
|
||||
|
||||
=item F<JUNIPER-VIRTUALCHASSIS-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $juniper->vendor()
|
||||
|
||||
Returns 'juniper'
|
||||
|
||||
=item $juniper->os()
|
||||
|
||||
Returns 'junos'
|
||||
|
||||
=item $juniper->os_ver()
|
||||
|
||||
Returns the software version extracted first from C<sysDescr> or
|
||||
C<lldpLocSysDesc> if not available in C<sysDescr>.
|
||||
|
||||
=item $juniper->model()
|
||||
|
||||
Returns the model from C<sysObjectID>, with C<jnxProductName> removed from the
|
||||
beginning.
|
||||
|
||||
=item $juniper->serial()
|
||||
|
||||
Returns serial number
|
||||
|
||||
(C<jnxBoxSerialNo.0>)
|
||||
|
||||
=item $juniper->mac()
|
||||
|
||||
Returns the MAC address used by this bridge when it must be referred
|
||||
to in a unique fashion.
|
||||
|
||||
(C<dot1dBaseBridgeAddress>)
|
||||
|
||||
=item $juniper->box_descr()
|
||||
|
||||
The name, model, or detailed description of the device.
|
||||
|
||||
(C<jnxBoxDescr.0>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $juniper->v_index()
|
||||
|
||||
(C<jnxExVlanTag>)
|
||||
|
||||
=item $juniper->v_name()
|
||||
|
||||
(C<jnxExVlanName>)
|
||||
|
||||
=item $juniper->v_type()
|
||||
|
||||
(C<jnxExVlanType>)
|
||||
|
||||
=item $juniper->i_trunk()
|
||||
|
||||
(C<jnxExVlanPortAccessMode>)
|
||||
|
||||
=item $juniper->i_vlan()
|
||||
|
||||
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
|
||||
|
||||
=item $juniper->i_vlan_membership()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
IDs. These are the VLANs which are members of the egress list for the port.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Forwarding Table (C<dot1dTpFdbEntry>)
|
||||
|
||||
=over
|
||||
|
||||
=item $juniper->fw_mac()
|
||||
|
||||
Returns reference to hash of forwarding table MAC Addresses
|
||||
|
||||
(C<dot1dTpFdbAddress>)
|
||||
|
||||
=item $juniper->fw_port()
|
||||
|
||||
Returns reference to hash of forwarding table entries port interface
|
||||
identifier (iid)
|
||||
|
||||
(C<dot1dTpFdbPort>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Pseudo F<ENTITY-MIB> information
|
||||
|
||||
These methods emulate F<ENTITY-MIB> Physical Table methods using
|
||||
F<JUNIPER-MIB> and F<JUNIPER-VIRTUALCHASSIS-MIB>.
|
||||
|
||||
=over
|
||||
|
||||
=item $juniper->e_index()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Integer, Indices are combined
|
||||
into a eight digit integer, each index is two digits padded with leading zero
|
||||
if required.
|
||||
|
||||
=item $juniper->e_class()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: General hardware type.
|
||||
|
||||
=item $juniper->e_descr()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Human friendly name
|
||||
|
||||
=item $juniper->e_hwver()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Hardware version
|
||||
|
||||
=item $juniper->e_vendor()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: juniper
|
||||
|
||||
=item $juniper->e_serial()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Serial number
|
||||
|
||||
=item $juniper->e_pos()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: The relative position among all
|
||||
entities sharing the same parent.
|
||||
|
||||
=item $juniper->e_type()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Type of component/sub-component
|
||||
as defined in F<JUNIPER-CHASSIS-DEFINES-MIB>.
|
||||
|
||||
=item $juniper->e_parent()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: The value of e_index() for the
|
||||
entity which 'contains' this entity. A value of zero indicates this entity
|
||||
is not contained in any other entity.
|
||||
|
||||
=item $entity->e_fru()
|
||||
|
||||
BOOLEAN. Is a Field Replaceable unit?
|
||||
|
||||
(C<entPhysicalFRU>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
271
Info/Layer3/Lantronix.pm
Normal file
271
Info/Layer3/Lantronix.pm
Normal file
@@ -0,0 +1,271 @@
|
||||
# SNMP::Info::Layer3::Lantronix
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2012 J R Binks
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Lantronix;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::Lantronix::ISA = qw/
|
||||
SNMP::Info::Layer3
|
||||
Exporter
|
||||
/;
|
||||
@SNMP::Info::Layer3::Lantronix::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%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.00_003';
|
||||
|
||||
%MIBS = ( %SNMP::Info::Layer3::MIBS, );
|
||||
|
||||
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, );
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'microsoft';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'windows';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
return '';
|
||||
}
|
||||
|
||||
sub model {
|
||||
return 'Windows Router';
|
||||
}
|
||||
|
||||
sub serial {
|
||||
return '';
|
||||
}
|
||||
|
||||
# $l3->interfaces() - Map the Interfaces to their physical names
|
||||
# Add interface number to interface name because if MS Win
|
||||
# have identical interface cards ("HP NC7782 Gigabit Server Adapter"
|
||||
# for example), than MS Win return identical ifDescr
|
||||
sub interfaces {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $l3->i_index($partial);
|
||||
my $descriptions = $l3->i_description($partial);
|
||||
|
||||
my %interfaces = ();
|
||||
foreach my $iid ( keys %$interfaces ) {
|
||||
my $desc = $descriptions->{$iid};
|
||||
next unless defined $desc;
|
||||
|
||||
$interfaces{$iid} = sprintf( "(%U) %s", $iid, $desc );
|
||||
}
|
||||
|
||||
return \%interfaces;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Microsoft - SNMP Interface to L3 Microsoft Windows router
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
begemot
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $router = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $router->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Generic Microsoft Routers running Microsoft Windows OS
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $router->vendor()
|
||||
|
||||
Returns C<'microsoft'>
|
||||
|
||||
=item $router->os()
|
||||
|
||||
Returns C<'windows'>
|
||||
|
||||
=item $router->os_ver()
|
||||
|
||||
Returns ''
|
||||
|
||||
=item $router->model()
|
||||
|
||||
Returns C<'Windows Router'>
|
||||
|
||||
=item $router->serial()
|
||||
|
||||
Returns ''
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $router->interfaces()
|
||||
|
||||
Map the Interfaces to their physical names. Adds interface number to
|
||||
interface name because identical interface cards return identical C<ifDescr>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
175
Info/Layer3/Mikrotik.pm
Normal file
175
Info/Layer3/Mikrotik.pm
Normal file
@@ -0,0 +1,175 @@
|
||||
# SNMP::Info::Layer3::Mikrotik
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2011 Jeroen van Ingen
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Mikrotik;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::Mikrotik::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Mikrotik::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
'HOST-RESOURCES-MIB' => 'hrSystem',
|
||||
'MIKROTIK-MIB' => 'mtxrLicVersion',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
'hrSystemUptime' => 'hrSystemUptime',
|
||||
'os_ver' => 'mtxrLicVersion',
|
||||
);
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'mikrotik';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $mikrotik = shift;
|
||||
my $descr = $mikrotik->description() || '';
|
||||
my $model = undef;
|
||||
$model = $1 if ( $descr =~ /^RouterOS\s+(\S+)$/i );
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'routeros';
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Mikrotik - SNMP Interface to Mikrotik devices
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Jeroen van Ingen
|
||||
initial version based on SNMP::Info::Layer3::NetSNMP by Bradley Baetz and Bill Fenner
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $mikrotik = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $mikrotik->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Mikrotik devices
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<HOST-RESOURCES-MIB>
|
||||
|
||||
=item F<MIKROTIK-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $mikrotik->vendor()
|
||||
|
||||
Returns C<'mikrotik'>.
|
||||
|
||||
=item $mikrotik->os()
|
||||
|
||||
Returns C<'routeros'>.
|
||||
|
||||
=item $mikrotik->model()
|
||||
|
||||
Tries to extract the device model from C<sysDescr>.
|
||||
|
||||
=item $mikrotik->os_ver()
|
||||
|
||||
Returns the value of C<mtxrLicVersion>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
None.
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3> for details.
|
||||
|
||||
|
||||
=cut
|
||||
319
Info/Layer3/N1600.pm
Normal file
319
Info/Layer3/N1600.pm
Normal file
@@ -0,0 +1,319 @@
|
||||
# SNMP::Info::Layer3::N1600 - SNMP Interface to Nortel N16XX devices
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::N1600;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::SONMP;
|
||||
|
||||
@SNMP::Info::Layer3::N1600::ISA
|
||||
= qw/SNMP::Info::Layer3 SNMP::Info::SONMP Exporter/;
|
||||
@SNMP::Info::Layer3::N1600::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%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.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
'UCD-SNMP-MIB' => 'versionTag',
|
||||
'NET-SNMP-TC' => 'netSnmpAgentOIDs',
|
||||
'HOST-RESOURCES-MIB' => 'hrSystem',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
'netsnmp_vers' => 'versionTag',
|
||||
'hrSystemUptime' => 'hrSystemUptime',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'Net-SNMP';
|
||||
}
|
||||
|
||||
sub os {
|
||||
my $netsnmp = shift;
|
||||
my $descr = $netsnmp->description();
|
||||
|
||||
return $1 if ( $descr =~ /^(\S+)\s+/ );
|
||||
return;
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $netsnmp = shift;
|
||||
my $descr = $netsnmp->description();
|
||||
my $vers = $netsnmp->netsnmp_vers();
|
||||
my $os_ver = undef;
|
||||
|
||||
$os_ver = $1 if ( $descr =~ /^\S+\s+\S+\s+(\S+)\s+/ );
|
||||
if ($vers) {
|
||||
$os_ver = "???" unless defined($os_ver);
|
||||
$os_ver .= " / Net-SNMP " . $vers;
|
||||
}
|
||||
|
||||
return $os_ver;
|
||||
}
|
||||
|
||||
sub serial {
|
||||
return '';
|
||||
}
|
||||
|
||||
# sysUptime gives us the time since the SNMP daemon has restarted,
|
||||
# so return the system uptime since that's probably what the user
|
||||
# wants. (Caution: this could cause trouble if using
|
||||
# sysUptime-based discontinuity timers or other TimeStamp
|
||||
# objects.
|
||||
sub uptime {
|
||||
my $netsnmp = shift;
|
||||
my $uptime;
|
||||
|
||||
$uptime = $netsnmp->hrSystemUptime();
|
||||
return $uptime if defined $uptime;
|
||||
|
||||
return $netsnmp->SUPER::uptime();
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $l3->interfaces($partial) || {};
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
|
||||
# lo0 etc
|
||||
if ( $interfaces->{$if} =~ /\blo\d*\b/i ) {
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::NetSNMP - SNMP Interface to L3 Net-SNMP Devices
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Bradley Baetz and Bill Fenner
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $netsnmp = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $netsnmp->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Generic Net-SNMP devices
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<UCD-SNMP-MIB>
|
||||
|
||||
=item F<NET-SNMP-TC>
|
||||
|
||||
=item F<HOST-RESOURCES-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $netsnmp->vendor()
|
||||
|
||||
Returns 'Net-SNMP'.
|
||||
|
||||
=item $netsnmp->os()
|
||||
|
||||
Returns the OS extracted from C<sysDescr>.
|
||||
|
||||
=item $netsnmp->os_ver()
|
||||
|
||||
Returns the software version extracted from C<sysDescr>, along
|
||||
with the Net-SNMP version.
|
||||
|
||||
=item $netsnmp->uptime()
|
||||
|
||||
Returns the system uptime instead of the agent uptime.
|
||||
NOTE: discontinuity timers and other Time Stamp based objects
|
||||
are based on agent uptime, so use orig_uptime().
|
||||
|
||||
=item $netsnmp->serial()
|
||||
|
||||
Returns ''.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $netsnmp->i_ignore()
|
||||
|
||||
Returns reference to hash. Increments value of IID if port is to be ignored.
|
||||
|
||||
Ignores loopback
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP> for details.
|
||||
|
||||
=head1 NOTES
|
||||
|
||||
In order to cause SNMP::Info to classify your device into this class, it
|
||||
may be necessary to put a configuration line into your F<snmpd.conf>
|
||||
similar to
|
||||
|
||||
sysobjectid .1.3.6.1.4.1.8072.3.2.N
|
||||
|
||||
where N is the object ID for your OS from the C<NET-SNMP-TC> MIB (or
|
||||
255 if not listed). Some Net-SNMP installations default to an
|
||||
incorrect return value for C<system.sysObjectId>.
|
||||
|
||||
In order to recognize a Net-SNMP device as Layer3, it may be necessary
|
||||
to put a configuration line similar to
|
||||
|
||||
sysservices 76
|
||||
|
||||
in your F<snmpd.conf>.
|
||||
|
||||
=cut
|
||||
740
Info/Layer3/Netscreen.pm
Normal file
740
Info/Layer3/Netscreen.pm
Normal file
@@ -0,0 +1,740 @@
|
||||
# SNMP::Info::Layer3::Netscreen
|
||||
#
|
||||
# Copyright (c) 2012 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Netscreen;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::IEEE802dot11;
|
||||
|
||||
@SNMP::Info::Layer3::Netscreen::ISA
|
||||
= qw/SNMP::Info::Layer3 SNMP::Info::IEEE802dot11 Exporter/;
|
||||
@SNMP::Info::Layer3::Netscreen::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::IEEE802dot11::MIBS,
|
||||
'NETSCREEN-SMI' => 'netscreenSetting',
|
||||
'NETSCREEN-PRODUCTS-MIB' => 'netscreenGeneric',
|
||||
'NETSCREEN-INTERFACE-MIB' => 'nsIfIndex',
|
||||
'NETSCREEN-SET-GEN-MIB' => 'nsSetGenSwVer',
|
||||
'NETSCREEN-IP-ARP-MIB' => 'nsIpArpAOD',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::IEEE802dot11::GLOBALS,
|
||||
'os_version' => 'nsSetGenSwVer',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::IEEE802dot11::FUNCS,
|
||||
|
||||
ns_i_index => 'nsIfIndex',
|
||||
ns_i_name => 'nsIfName',
|
||||
ns_i_description => 'nsIfDescr',
|
||||
ns_i_mac => 'nsIfMAC',
|
||||
ns_i_up => 'nsIfStatus',
|
||||
ns_ip_table => 'nsIfIp',
|
||||
ns_ip_netmask => 'nsIfNetmask',
|
||||
at_index => 'nsIpArpIfIdx',
|
||||
at_paddr => 'nsIpArpMac',
|
||||
at_netaddr => 'nsIpArpIp',
|
||||
bp_index => 'nsIfInfo',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::IEEE802dot11::MUNGE,
|
||||
'ns_i_mac' => \&SNMP::Info::munge_mac,
|
||||
'at_paddr' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
sub layers {
|
||||
return '01001110';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'juniper';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'screenos';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $descr = $netscreen->description();
|
||||
if ( $descr =~ m/version (\d\S*) \(SN: / ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $e_serial = $netscreen->e_serial() || {};
|
||||
|
||||
my $serial = $e_serial->{1} || undef;
|
||||
|
||||
return $1 if ( defined $serial and $serial =~ /(\d+)/ );
|
||||
my $descr = $netscreen->description();
|
||||
if ( $descr =~ m/version .*\(SN: (\d\S*),/ ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $id = $netscreen->id();
|
||||
|
||||
unless ( defined $id ) {
|
||||
print
|
||||
" SNMP::Info::Layer3::model() - Device does not support sysObjectID\n"
|
||||
if $netscreen->debug();
|
||||
return;
|
||||
}
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^netscreen//i;
|
||||
return $model;
|
||||
}
|
||||
|
||||
# provides mapping from IF-MIB to nsIf interfaces - many to 1 (!)
|
||||
# - on WLAN devices wireless0/0(|-[ag]) -> wireless0/0 !!
|
||||
sub _if_nsif_map {
|
||||
my $netscreen = shift;
|
||||
my $i_descr = $netscreen->SUPER::i_description;
|
||||
my $ns_descr = $netscreen->i_description;
|
||||
my %if_nsif_map = ();
|
||||
my @ikeys = sort { $a <=> $b } keys %$i_descr;
|
||||
my @nskeys = sort { $a <=> $b } keys %$ns_descr;
|
||||
my $i = 0;
|
||||
my $n = 0;
|
||||
|
||||
# assumes descriptions are in the same order from both walks
|
||||
while ( $i < @ikeys && $n < @nskeys ) {
|
||||
|
||||
# find matching sub interfaces
|
||||
while (
|
||||
$i < @ikeys
|
||||
&& substr(
|
||||
$i_descr->{ $ikeys[$i] },
|
||||
0,
|
||||
length $ns_descr->{ $nskeys[$n] }
|
||||
) eq $ns_descr->{ $nskeys[$n] }
|
||||
)
|
||||
{
|
||||
|
||||
$if_nsif_map{ $ikeys[$i] } = $nskeys[$n];
|
||||
$i++;
|
||||
}
|
||||
|
||||
$n++;
|
||||
|
||||
# skip non-matching interfaces (e.g. tunnel.N)
|
||||
while (
|
||||
$i < @ikeys
|
||||
&& substr(
|
||||
$i_descr->{ $ikeys[$i] },
|
||||
0,
|
||||
length $ns_descr->{ $nskeys[$n] }
|
||||
) ne $ns_descr->{ $nskeys[$n] }
|
||||
&& $n < @nskeys
|
||||
)
|
||||
{
|
||||
|
||||
$if_nsif_map{ $ikeys[$i] } = 0; # no matching interface
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
|
||||
return \%if_nsif_map;
|
||||
}
|
||||
|
||||
# Provides mapping from nsIf interfaces to IF-MIB interfaces - many to 1
|
||||
# Example, tunnel.# interfaces are not present in IF-MIB. There exist no
|
||||
# mapping of index IID's between the tables so create mapping based on names
|
||||
sub _nsif_if_map {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $i_descr = $netscreen->SUPER::i_description;
|
||||
my $ns_descr = $netscreen->i_description;
|
||||
my %rev_i_descr = reverse %$i_descr;
|
||||
my %rev_ns_descr = reverse %$ns_descr;
|
||||
|
||||
my %nsif_if_map = ();
|
||||
foreach my $value ( values %$ns_descr ) {
|
||||
if ( exists $rev_i_descr{$value} ) {
|
||||
$nsif_if_map{ $rev_ns_descr{$value} } = $rev_i_descr{$value};
|
||||
}
|
||||
else {
|
||||
$nsif_if_map{ $rev_ns_descr{$value} } = 0;
|
||||
}
|
||||
}
|
||||
return \%nsif_if_map;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $netscreen = shift;
|
||||
return $netscreen->i_description();
|
||||
}
|
||||
|
||||
sub i_index {
|
||||
my $netscreen = shift;
|
||||
return $netscreen->ns_i_index();
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $netscreen = shift;
|
||||
return $netscreen->ns_i_name();
|
||||
}
|
||||
|
||||
sub i_description {
|
||||
my $netscreen = shift;
|
||||
|
||||
# Versions prior to 5.4 do not support nsIfDescr but do have nsIfName
|
||||
return $netscreen->ns_i_description() || $netscreen->ns_i_name();
|
||||
}
|
||||
|
||||
sub i_mac {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $ns_mac = $netscreen->ns_i_mac() || {};
|
||||
my $if_i_mac = $netscreen->SUPER::i_mac() || {};
|
||||
my $ns_i_map = $netscreen->_nsif_if_map();
|
||||
|
||||
my %i_mac = ();
|
||||
foreach my $iid ( keys %$ns_i_map ) {
|
||||
$i_mac{$iid} = $ns_mac->{$iid} || $if_i_mac->{ $ns_i_map->{$iid} };
|
||||
}
|
||||
|
||||
return \%i_mac;
|
||||
}
|
||||
|
||||
sub i_lastchange {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $if_i_lastchange = $netscreen->SUPER::i_lastchange() || {};
|
||||
my $ns_i_map = $netscreen->_nsif_if_map();
|
||||
my %i_lastchange;
|
||||
|
||||
foreach my $iid ( keys %$ns_i_map ) {
|
||||
$i_lastchange{$iid} = $if_i_lastchange->{ $ns_i_map->{$iid} };
|
||||
}
|
||||
return \%i_lastchange;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $netscreen = shift;
|
||||
return $netscreen->ns_i_up();
|
||||
}
|
||||
|
||||
sub i_up_admin {
|
||||
my $netscreen = shift;
|
||||
my $i_up = $netscreen->i_up();
|
||||
my $i_up_admin = $netscreen->SUPER::i_up_admin();
|
||||
my $ns_i_map = $netscreen->_nsif_if_map();
|
||||
my %i_up_admin;
|
||||
|
||||
foreach my $iid ( keys %$ns_i_map ) {
|
||||
$i_up_admin{$iid}
|
||||
= $i_up->{$iid} eq "up" && "up"
|
||||
|| $i_up_admin->{ $ns_i_map->{$iid} }
|
||||
|| 0;
|
||||
}
|
||||
return \%i_up_admin;
|
||||
}
|
||||
|
||||
sub i_type {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $if_i_type = $netscreen->SUPER::i_type() || {};
|
||||
my $ns_i_map = $netscreen->_nsif_if_map();
|
||||
my %i_type;
|
||||
|
||||
foreach my $iid ( keys %$ns_i_map ) {
|
||||
$i_type{$iid} = $if_i_type->{ $ns_i_map->{$iid} } || "tunnel";
|
||||
}
|
||||
return \%i_type;
|
||||
}
|
||||
|
||||
sub i_mtu {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $i_type = $netscreen->SUPER::i_mtu() || {};
|
||||
my $ns_i_map = $netscreen->_nsif_if_map();
|
||||
my %i_mtu;
|
||||
|
||||
foreach my $iid ( keys %$ns_i_map ) {
|
||||
$i_mtu{$iid} = $i_type->{ $ns_i_map->{$iid} };
|
||||
}
|
||||
return \%i_mtu;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
return;
|
||||
}
|
||||
|
||||
sub i_speed {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $i_speed = $netscreen->SUPER::i_speed();
|
||||
my $i_name = $netscreen->i_name();
|
||||
my $ns_i_map = $netscreen->_nsif_if_map;
|
||||
my %i_speed;
|
||||
|
||||
foreach my $iid ( keys %$ns_i_map ) {
|
||||
$i_speed{$iid}
|
||||
= $i_speed->{ $ns_i_map->{$iid} }
|
||||
|| $i_name->{$iid} =~ /tunnel/ && "vpn"
|
||||
|| 0;
|
||||
}
|
||||
return \%i_speed;
|
||||
}
|
||||
|
||||
sub _mac_map {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $arp_mac = $netscreen->nsIpArpMac() || {};
|
||||
|
||||
my %mac_map = ();
|
||||
foreach my $iid ( keys %$arp_mac ) {
|
||||
my $oid = join( ".", ( unpack( "C6", $arp_mac->{$iid} ) ) );
|
||||
$mac_map{$oid} = $iid;
|
||||
}
|
||||
return \%mac_map;
|
||||
}
|
||||
|
||||
sub ip_index {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $ns_ip = $netscreen->ns_ip_table() || {};
|
||||
|
||||
my %ip_index = ();
|
||||
foreach my $iid ( keys %$ns_ip ) {
|
||||
$ip_index{ $ns_ip->{$iid} } = $iid if $ns_ip->{$iid} ne "0.0.0.0";
|
||||
}
|
||||
return \%ip_index;
|
||||
}
|
||||
|
||||
sub ip_table {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $ip_index = $netscreen->ip_index() || {};
|
||||
|
||||
my %ip_table = ();
|
||||
foreach my $iid ( keys %$ip_index ) {
|
||||
$ip_table{$iid} = $iid;
|
||||
}
|
||||
return \%ip_table;
|
||||
}
|
||||
|
||||
sub ip_netmask {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $ip_index = $netscreen->ip_index() || {};
|
||||
my $ns_netmask = $netscreen->ns_ip_netmask();
|
||||
|
||||
my %ip_netmask = ();
|
||||
foreach my $iid ( keys %$ip_index ) {
|
||||
$ip_netmask{$iid} = $ns_netmask->{ $ip_index->{$iid} };
|
||||
}
|
||||
return \%ip_netmask;
|
||||
}
|
||||
|
||||
sub fw_index {
|
||||
my $netscreen = shift;
|
||||
my %fw_index = ();
|
||||
my $arp_mac = $netscreen->nsIpArpMac() || {};
|
||||
|
||||
foreach my $iid ( keys %$arp_mac ) {
|
||||
my $oid = join( ".", ( unpack( "C6", $arp_mac->{$iid} ) ) );
|
||||
$fw_index{$iid} = $oid;
|
||||
}
|
||||
return \%fw_index;
|
||||
}
|
||||
|
||||
sub fw_mac {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $mac_map = $netscreen->_mac_map() || {};
|
||||
|
||||
my %fw_mac = ();
|
||||
foreach my $oid ( keys %$mac_map ) {
|
||||
my $mac
|
||||
= join( ":", ( map { sprintf "%lx", $_ } split( /\./, $oid ) ) );
|
||||
$fw_mac{$oid} = $mac;
|
||||
}
|
||||
return \%fw_mac;
|
||||
}
|
||||
|
||||
sub bp_index {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $if_info = $netscreen->nsIfInfo() || {};
|
||||
|
||||
my %bp_index = ();
|
||||
foreach my $iid ( keys %$if_info ) {
|
||||
$bp_index{ $if_info->{$iid} } = $iid;
|
||||
}
|
||||
return \%bp_index;
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $fw_index = $netscreen->fw_index();
|
||||
my $arp_if = $netscreen->nsIpArpIfIdx() || {};
|
||||
|
||||
my %fw_port;
|
||||
foreach my $iid ( keys %$arp_if ) {
|
||||
$fw_port{ $fw_index->{$iid} } = $arp_if->{$iid}
|
||||
if defined $fw_index->{$iid};
|
||||
}
|
||||
return \%fw_port;
|
||||
}
|
||||
|
||||
# need to remap from IF-MIB index to nsIf index
|
||||
sub i_ssidlist {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $i_ssidlist = $netscreen->SUPER::i_ssidlist() || {};
|
||||
my $ns_i_map = $netscreen->_if_nsif_map();
|
||||
|
||||
my %i_ssidlist;
|
||||
foreach my $iid ( keys %$i_ssidlist ) {
|
||||
$i_ssidlist{ $ns_i_map->{$iid} } = $i_ssidlist->{$iid};
|
||||
}
|
||||
return \%i_ssidlist;
|
||||
}
|
||||
|
||||
sub i_80211channel {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $i_80211channel = $netscreen->SUPER::i_80211channel() || {};
|
||||
my $ns_i_map = $netscreen->_if_nsif_map();
|
||||
|
||||
my %i_80211channel;
|
||||
foreach my $iid ( keys %$i_80211channel ) {
|
||||
$i_80211channel{ $ns_i_map->{$iid} } = $i_80211channel->{$iid};
|
||||
}
|
||||
return \%i_80211channel;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Netscreen - SNMP Interface to Juniper Netscreen Devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Kent Hamilton
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#Let SNMP::Info determine the correct subclass for you.
|
||||
|
||||
my $netscreen = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $netscreen->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Juniper Netscreen devices through SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $netscreen = new SNMP::Info::Layer3::Netscreen(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::IEEE802dot11
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<NETSCREEN-SMI>
|
||||
|
||||
=item F<NETSCREEN-PRODUCTS-MIB>
|
||||
|
||||
=item F<NETSCREEN-INTERFACE-MIB>
|
||||
|
||||
=item F<NETSCREEN-SET-GEN-MIB>
|
||||
|
||||
=item F<NETSCREEN-IP-ARP-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::IEEE802dot11/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $netscreen->model()
|
||||
|
||||
Tries to reference $netscreen->id() to F<NETSCREEN-PRODUCTS-MIB>
|
||||
|
||||
=item $netscreen->vendor()
|
||||
|
||||
Returns C<'juniper'>
|
||||
|
||||
=item $netscreen->os()
|
||||
|
||||
Returns C<'screenos'>
|
||||
|
||||
=item $netscreen->os_ver()
|
||||
|
||||
Extracts the OS version from the description string.
|
||||
|
||||
=item $netscreen->serial()
|
||||
|
||||
Returns serial number.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $netscreen->layers()
|
||||
|
||||
Returns 01001110. Device doesn't report layers properly, modified to reflect
|
||||
Layer 2 and 3 functionality.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::IEEE802dot11
|
||||
|
||||
See L<SNMP::Info::IEEE802dot11/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=head3 Interface Information
|
||||
|
||||
=over
|
||||
|
||||
=item $netscreen->interfaces()
|
||||
|
||||
Creates a map between the interface identifier (iid) and the physical port
|
||||
name.
|
||||
|
||||
Defaults to C<insIfDescr> if available, uses C<nsIfName> if not.
|
||||
|
||||
=item $netscreen->i_description()
|
||||
|
||||
Description of the interface. Uses C<insIfDescr> if available, C<nsIfName>
|
||||
if not.
|
||||
|
||||
=item $netscreen->i_ignore()
|
||||
|
||||
Returns without defining any interfaces to ignore.
|
||||
|
||||
=item $netscreen->i_index()
|
||||
|
||||
Default SNMP IID to Interface index.
|
||||
|
||||
(C<nsIfIndex>)
|
||||
|
||||
=item $netscreen->i_lastchange()
|
||||
|
||||
The value of C<sysUpTime> when this port last changed states (up,down),
|
||||
maps from C<ifIndex> to C<nsIfIndex>.
|
||||
|
||||
(C<ifLastChange>)
|
||||
|
||||
=item $netscreen->i_mac()
|
||||
|
||||
MAC address of the interface. Note this is just the MAC of the port, not
|
||||
anything connected to it. Uses C<nsIfMAC> if available, C<ifPhysAddress>
|
||||
if not.
|
||||
|
||||
=item $netscreen->i_mtu()
|
||||
|
||||
INTEGER. Interface MTU value, maps from C<ifIndex> to C<nsIfIndex>.
|
||||
|
||||
(C<ifMtu>)
|
||||
|
||||
=item $netscreen->i_name()
|
||||
|
||||
Interface Name field.
|
||||
|
||||
(C<nsIfName>)
|
||||
|
||||
=item $netscreen->i_speed()
|
||||
|
||||
Speed of the link, maps from C<ifIndex> to C<nsIfIndex>.
|
||||
|
||||
=item $netscreen->i_type()
|
||||
|
||||
Interface type. Maps from C<ifIndex> to C<nsIfIndex>.
|
||||
|
||||
(C<ifType>)
|
||||
|
||||
=item $netscreen->i_up()
|
||||
|
||||
Link Status of the interface. Typical values are 'up' and 'down'.
|
||||
|
||||
(C<nsIfStatus>)
|
||||
|
||||
=item $netscreen->i_up_admin()
|
||||
|
||||
Administrative status of the port. Checks both C<ifAdminStatus> and
|
||||
C<nsIfStatus>.
|
||||
|
||||
=back
|
||||
|
||||
=head3 IP Address Table
|
||||
|
||||
Each entry in this table is an IP address in use on this device.
|
||||
|
||||
=over
|
||||
|
||||
=item $netscreen->ip_index()
|
||||
|
||||
Maps the IP Table to the IID
|
||||
|
||||
=item $netscreen->ip_table()
|
||||
|
||||
Maps the Table to the IP address
|
||||
|
||||
(C<nsIfIp>)
|
||||
|
||||
=item $netscreen->ip_netmask()
|
||||
|
||||
Gives netmask setting for IP table entry.
|
||||
|
||||
(C<nsIfNetmask>)
|
||||
|
||||
=back
|
||||
|
||||
=head3 Forwarding Table
|
||||
|
||||
Uses C<nsIpArpTable> to emulate the forwarding table.
|
||||
|
||||
=over
|
||||
|
||||
=item $netscreen->fw_index()
|
||||
|
||||
Maps the Forwarding Table to the IID
|
||||
|
||||
=item $netscreen->fw_mac()
|
||||
|
||||
Returns reference to hash of forwarding table MAC Addresses.
|
||||
|
||||
=item $netscreen->fw_port()
|
||||
|
||||
Returns reference to hash of forwarding table entries port interface
|
||||
identifier (IID).
|
||||
|
||||
=item $netscreen->bp_index()
|
||||
|
||||
Returns reference to hash of bridge port table entries map back to interface
|
||||
identifier (IID).
|
||||
|
||||
=back
|
||||
|
||||
=head3 Wireless Information
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->i_ssidlist()
|
||||
|
||||
Returns reference to hash. SSID's recognized by the radio interface.
|
||||
Remaps from C<ifIndex> to C<nsIfIndex>.
|
||||
|
||||
(C<dot11DesiredSSID>)
|
||||
|
||||
=item $dot11->i_80211channel()
|
||||
|
||||
Returns reference to hash. Current operating frequency channel of the radio
|
||||
interface. Remaps from C<ifIndex> to C<nsIfIndex>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::IEEE802dot11
|
||||
|
||||
See L<SNMP::Info::IEEE802dot11/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
391
Info/Layer3/Nexus.pm
Normal file
391
Info/Layer3/Nexus.pm
Normal file
@@ -0,0 +1,391 @@
|
||||
# SNMP::Info::Layer3::Nexus
|
||||
#
|
||||
# Copyright (c) 2012 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Nexus;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::LLDP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoImage;
|
||||
use SNMP::Info::CiscoPortSecurity;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::CiscoPower;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::CiscoStpExtensions;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
# NOTE : Top-most items gets precedence for @ISA
|
||||
@SNMP::Info::Layer3::Nexus::ISA = qw/
|
||||
SNMP::Info::CiscoVTP
|
||||
SNMP::Info::CiscoStpExtensions
|
||||
SNMP::Info::LLDP
|
||||
SNMP::Info::CDP
|
||||
SNMP::Info::CiscoImage
|
||||
SNMP::Info::CiscoPortSecurity
|
||||
SNMP::Info::CiscoConfig
|
||||
SNMP::Info::CiscoPower
|
||||
SNMP::Info::Layer3
|
||||
Exporter
|
||||
/;
|
||||
|
||||
@SNMP::Info::Layer3::Nexus::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
# NOTE: Order creates precedence
|
||||
# Example: v_name exists in Bridge.pm and CiscoVTP.pm
|
||||
# Bridge is called from Layer3 and CiscoStpExtensions
|
||||
# So we want CiscoVTP to come last to get the right one.
|
||||
# The @ISA order should be reverse of these orders.
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::CiscoPower::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CiscoPortSecurity::MIBS,
|
||||
%SNMP::Info::CiscoImage::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::CiscoStpExtensions::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
'CISCO-ENTITY-VENDORTYPE-OID-MIB' => 'cevMIBObjects',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::CiscoPower::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoPortSecurity::GLOBALS,
|
||||
%SNMP::Info::CiscoImage::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
%SNMP::Info::CiscoStpExtensions::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
'mac' => 'dot1dBaseBridgeAddress',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::CiscoPower::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CiscoPortSecurity::FUNCS,
|
||||
%SNMP::Info::CiscoImage::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
%SNMP::Info::CiscoStpExtensions::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
);
|
||||
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::CiscoPower::MUNGE,
|
||||
%SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CiscoPortSecurity::MUNGE,
|
||||
%SNMP::Info::CiscoImage::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
%SNMP::Info::CiscoStpExtensions::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
);
|
||||
|
||||
sub cisco_comm_indexing { return 1; }
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'nx-os';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $nexus = shift;
|
||||
my $descr = $nexus->description();
|
||||
|
||||
return $1 if ( $descr =~ /\),\s+Version\s+(.+?),/ );
|
||||
return $descr;
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $nexus = shift;
|
||||
|
||||
my $e_class = $nexus->e_class();
|
||||
|
||||
foreach my $iid ( keys %$e_class ) {
|
||||
my $class = $e_class->{$iid} || '';
|
||||
if ($class =~ /chassis/) {
|
||||
my $serial = $nexus->e_serial($iid);
|
||||
return $serial->{$iid};
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
# sysObjectID returns an IID to an entry in the CISCO-ENTITY-VENDORTYPE-OID-MIB.
|
||||
# Look it up and return it.
|
||||
sub model {
|
||||
my $nexus = shift;
|
||||
my $id = $nexus->id();
|
||||
|
||||
unless ( defined $id ) {
|
||||
print
|
||||
" SNMP::Info::Layer3::Nexus::model() - Device does not support sysObjectID\n"
|
||||
if $nexus->debug();
|
||||
return;
|
||||
}
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^cevChassis//i;
|
||||
return $model;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Nexus - SNMP Interface to Cisco Nexus Switches running
|
||||
NX-OS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $nexus = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $nexus->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Abstraction subclass for Cisco Nexus Switches running NX-OS.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $nexus = new SNMP::Info::Layer3::Nexus(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoImage
|
||||
|
||||
=item SNMP::Info::CiscoPortSecurity
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=item SNMP::Info::CiscoPower
|
||||
|
||||
=item SNMP::Info::CiscoStpExtensions
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-ENTITY-VENDORTYPE-OID-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
|
||||
requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoPower/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return a scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $nexus->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=item $nexus->os()
|
||||
|
||||
Returns C<'nx-os'>
|
||||
|
||||
=item $nexus->os_ver()
|
||||
|
||||
Returns operating system version extracted from C<sysDescr>.
|
||||
|
||||
=item $nexus->serial()
|
||||
|
||||
Returns the serial number of the chassis from F<ENTITY-MIB>.
|
||||
|
||||
=item $nexus->model()
|
||||
|
||||
Tries to reference $nexus->id() to F<CISCO-ENTITY-VENDORTYPE-OID-MIB>
|
||||
|
||||
Removes C<'cevChassis'> for readability.
|
||||
|
||||
=item $nexus->mac()
|
||||
|
||||
C<dot1dBaseBridgeAddress>
|
||||
|
||||
=item $nexus->cisco_comm_indexing()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoPower
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
|
||||
details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoPower
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPower/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
220
Info/Layer3/PacketFront.pm
Normal file
220
Info/Layer3/PacketFront.pm
Normal file
@@ -0,0 +1,220 @@
|
||||
# SNMP::Info::Layer3::PacketFront
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2011 Jeroen van Ingen
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::PacketFront;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::PacketFront::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::PacketFront::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%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
|
||||
1311
Info/Layer3/Passport.pm
Normal file
1311
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.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
# Enterprise container where BEGEMOT-* lives
|
||||
'FOKUS-MIB' => 'fokus',
|
||||
# MIBs used included in Layer3 and above:
|
||||
# UDP-MIB
|
||||
# TCP-MIB
|
||||
# IF-MIB
|
||||
#
|
||||
# Stuff in these MIBs but not used for Netdisco yet for my test device:
|
||||
#
|
||||
#'BEGEMOT-SNMPD-MIB',
|
||||
#'BEGEMOT-PF-MIB',
|
||||
#'BEGEMOT-NETGRAPH-MIB',
|
||||
#'BEGEMOT-MIB2-MIB',
|
||||
#'BEGEMOT-HOSTRES-MIB',
|
||||
# HOST-RESOURCES-MIB
|
||||
# IP-FORWARD-MIB
|
||||
#
|
||||
# Nothing in these MIBs for my test device:
|
||||
#
|
||||
#'BEGEMOT-IP-MIB',
|
||||
#'BEGEMOT-MIB',
|
||||
#'BEGEMOT-BRIDGE-MIB',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'FreeBSD';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $pf = shift;
|
||||
my $descr = $pf->description() || '';
|
||||
my $model = undef;
|
||||
$model = $1 if ( $descr =~ /FreeBSD\s+(\S+)/ );
|
||||
return $model if defined $model;
|
||||
return $pf->os_ver();
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'Pf';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $pf = shift;
|
||||
my $id = $pf->id();
|
||||
|
||||
my $os_ver = &SNMP::translateObj($id);
|
||||
return $id unless defined $os_ver;
|
||||
|
||||
# From /usr/share/snmp/defs/tree.def on a Pf Machine
|
||||
# (2 begemotSnmpdDefs
|
||||
# (1 begemotSnmpdAgent
|
||||
# (1 begemotSnmpdAgentFreeBSD OID op_dummy)
|
||||
# We're leaving the 1.1 and trimming off up to the 2
|
||||
$os_ver =~ s/fokus.1.1.2.//;
|
||||
return $os_ver;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Pf - SNMP Interface to FreeBSD-Based Firewalls using Pf /Pf Sense
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $pf = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $pf->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Free-BSD PF-Based devices
|
||||
|
||||
=head1 LLDP Support
|
||||
|
||||
LLDP Support is included but untested in this Device Class. It is reported
|
||||
that the available CDP/LLDP modules for net-snmp don't work on FreeBSD (on
|
||||
which pfSense is based) as they assume certain Linux specific Ethernet
|
||||
structures. This problem is apparently solved on PF based firewall appliances
|
||||
by using the ladvd package, for which a port may be found here:
|
||||
L<http://www.freshports.org/net/ladvd/>. I'm not sure if this module ties into
|
||||
Net-SNMP or not.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<FOKUS-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $pf->vendor()
|
||||
|
||||
Returns 'FreeBSD'
|
||||
|
||||
=item $pf->model()
|
||||
|
||||
Grabs the os version from C<sysDescr>
|
||||
|
||||
=item $pf->os()
|
||||
|
||||
Returns 'Pf'
|
||||
|
||||
=item $pf->os_ver()
|
||||
|
||||
Tries to reference $pf->id() to one of the product MIBs listed above.
|
||||
Will probably return a truncation of the default OID for pf-based systems
|
||||
C<enterprises.12325.1.1.2.1.1>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
189
Info/Layer3/SonicWALL.pm
Normal file
189
Info/Layer3/SonicWALL.pm
Normal file
@@ -0,0 +1,189 @@
|
||||
package SNMP::Info::Layer3::SonicWALL;
|
||||
|
||||
# Copyright (c) 2011 Netdisco Project
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::SonicWALL::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::SonicWALL::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS, %SNMP::Info::Layer3::MIBS,
|
||||
'SNWL-COMMON-MIB' => 'snwlCommonModule',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::Layer3::GLOBALS,
|
||||
#From SNWL-COMMON-MIB
|
||||
'sw_model' => 'snwlSysModel',
|
||||
'sw_serial' => 'snwlSysSerialNumber',
|
||||
'sw_firmware' => 'snwlSysFirmwareVersion',
|
||||
);
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::Layer3::FUNCS, );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::Layer3::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'SonicWALL';
|
||||
}
|
||||
|
||||
sub os {
|
||||
my $sonicos = shift;
|
||||
my $swos = $sonicos->sw_firmware();
|
||||
if ($swos =~ /Enhanced/) {
|
||||
return 'SonicOS Enhanced';
|
||||
}
|
||||
return 'SonicOS Standard';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $sonicosver = shift;
|
||||
my $osver = $sonicosver->sw_firmware();
|
||||
if ( $osver =~ /\S+\s\S+\s(\S+)/) {
|
||||
return $1
|
||||
}
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $sw = shift;
|
||||
my $serial = $sw->sw_serial();
|
||||
return $serial;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $swmodel = shift;
|
||||
my $model = $swmodel->sw_model();
|
||||
return $model;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::SonicWALL - SNMP Interface to L3 SonicWALL Firewall
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
phishphreek@gmail.com
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $router = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $router->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Generic SonicWALL Firewalls
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $router->vendor()
|
||||
|
||||
Returns C<'SonicWALL'>
|
||||
|
||||
=item $router->os()
|
||||
|
||||
Returns C<'SonicOS'>
|
||||
|
||||
=item $router->os_ver()
|
||||
|
||||
Returns '4.2.0.0-10e'
|
||||
|
||||
=item $router->model()
|
||||
|
||||
Returns C<'PRO 3060 Enhanced'>
|
||||
|
||||
=item $router->serial()
|
||||
|
||||
Returns the MAC address of the first X0/LAN interface.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
204
Info/Layer3/Sun.pm
Normal file
204
Info/Layer3/Sun.pm
Normal file
@@ -0,0 +1,204 @@
|
||||
# SNMP::Info::Layer3::Sun
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Sun;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::Sun::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Sun::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = ( %SNMP::Info::Layer3::MIBS, );
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
'sun_hostid' => '.1.3.6.1.4.1.42.3.1.2.0',
|
||||
'motd' => '.1.3.6.1.4.1.42.3.1.3.0',
|
||||
);
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'sun';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'sun';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $sun = shift;
|
||||
my $descr = $sun->motd();
|
||||
return unless defined $descr;
|
||||
|
||||
if ( $descr =~ m/SunOS (\S+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub model {
|
||||
return 'Solaris Router';
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $sun = shift;
|
||||
my $serial = unpack( "H*", $sun->sun_hostid() );
|
||||
return $serial;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $l3->interfaces($partial) || {};
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
|
||||
# lo0
|
||||
if ( $interfaces->{$if} =~ /\blo0\b/i ) {
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Sun - SNMP Interface to L3 Sun Solaris
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
begemot
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $sun = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'mysunrouter',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $sun->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Generic Sun Routers running SunOS
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $sun->vendor()
|
||||
|
||||
Returns 'sun'
|
||||
|
||||
=item $sun->os()
|
||||
|
||||
Returns 'sun'
|
||||
|
||||
=item $sun->os_ver()
|
||||
|
||||
Returns the software version extracted from message of the day.
|
||||
|
||||
=item $sun->model()
|
||||
|
||||
Returns 'Solaris Router'
|
||||
|
||||
=item $sun->serial()
|
||||
|
||||
Returns serial number
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $sun->i_ignore()
|
||||
|
||||
Returns reference to hash. Increments value of IID if port is to be ignored.
|
||||
|
||||
Ignores loopback
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
298
Info/Layer3/Tasman.pm
Normal file
298
Info/Layer3/Tasman.pm
Normal file
@@ -0,0 +1,298 @@
|
||||
# SNMP::Info::Layer3::Tasman
|
||||
#
|
||||
# Copyright (c) 2012 Eric Miller
|
||||
# All Rights Reserved
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Tasman;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::MAU;
|
||||
|
||||
@SNMP::Info::Layer3::Tasman::ISA = qw/SNMP::Info::MAU
|
||||
SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Tasman::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::MAU::MIBS,
|
||||
'NT-ENTERPRISE-DATA-MIB' => 'ntEnterpriseRouters',
|
||||
'SYSTEM-MIB' => 'nnsysVersion',
|
||||
'CHASSIS-MIB' => 'nnchassisModel',
|
||||
'ENVIRONMENT-MIB' => 'nnenvPwrsupStatus',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::MAU::GLOBALS,
|
||||
'ps1_type' => 'nnenvPwrsupType.1',
|
||||
'ps1_status' => 'nnenvPwrsupStatus.1',
|
||||
'ps2_type' => 'nnenvPwrsupType.2',
|
||||
'ps2_status' => 'nnenvPwrsupStatus.2',
|
||||
'nn_sys_ver' => 'nnsysVersion',
|
||||
'nn_ch_model' => 'nnchassisModel',
|
||||
'nn_ch_op_stat' => 'nnchassisOperStatus',
|
||||
'nn_ch_serial' => 'nnchassisSerialNumber',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::MAU::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::MAU::MUNGE,
|
||||
);
|
||||
|
||||
# use MAU-MIB for admin. duplex and admin. speed
|
||||
*SNMP::Info::Layer3::Tasman::i_duplex_admin
|
||||
= \&SNMP::Info::MAU::mau_i_duplex_admin;
|
||||
*SNMP::Info::Layer3::Tasman::i_speed_admin
|
||||
= \&SNMP::Info::MAU::mau_i_speed_admin;
|
||||
|
||||
sub vendor {
|
||||
return 'avaya';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'tasman';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $tasman = shift;
|
||||
my $version = $tasman->nn_sys_ver() || "";
|
||||
my $descr = $tasman->description() || "";
|
||||
|
||||
# Newer versions
|
||||
return $1 if ( $version =~ /^SW:\s+(.+?)\s+/ );
|
||||
# Older versions
|
||||
return $1 if ( $descr =~ /Software Version\s+=\s+[r]*(.+),/);
|
||||
# Can't find
|
||||
return;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $tasman = shift;
|
||||
|
||||
my $id = $tasman->id();
|
||||
my $ch_model = $tasman->nn_ch_model();
|
||||
|
||||
return $ch_model if $ch_model;
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^ntSecureRouter/SR/;
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $tasman = shift;
|
||||
|
||||
# Newer versions of the software redefined the MIB in a non-backwards
|
||||
# compatible manner. Try the old OID first.
|
||||
my $serial = $tasman->nn_ch_op_stat();
|
||||
# Newer versions populate status, serial should contain some numbers
|
||||
return $serial if ($serial !~ /^\D+$/);
|
||||
|
||||
# Unfortunately newer versions don't seem to populate the newer OID.
|
||||
return $tasman->nn_ch_serial();
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Tasman - SNMP Interface to Avaya Secure Routers
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $tasman = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $tasman->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Avaya Secure Routers
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::MAU
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<NT-ENTERPRISE-DATA-MIB>
|
||||
|
||||
=item F<SYSTEM-MIB>
|
||||
|
||||
=item F<CHASSIS-MIB>
|
||||
|
||||
=item F<ENVIRONMENT-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $tasman->vendor()
|
||||
|
||||
Returns C<'avaya'>
|
||||
|
||||
=item $tasman->model()
|
||||
|
||||
Tries to get the model from C<nnchassisModel> and if not available
|
||||
cross references $tasman->id() to F<NT-ENTERPRISE-DATA-MIB>.
|
||||
|
||||
Substitutes 'SR' for C<'ntSecureRouter'> in the name for readability.
|
||||
|
||||
=item $tasman->os()
|
||||
|
||||
Returns C<'tasman'>
|
||||
|
||||
=item $tasman->os_ver()
|
||||
|
||||
Grabs the os version from C<nnsysVersion>
|
||||
|
||||
=item $tasman->ps1_type()
|
||||
|
||||
(C<nnenvPwrsupType.1>)
|
||||
|
||||
=item $tasman->ps1_status()
|
||||
|
||||
(C<nnenvPwrsupStatus.1>)
|
||||
|
||||
=item $tasman->ps2_type()
|
||||
|
||||
(C<nnenvPwrsupType.2>)
|
||||
|
||||
=item $tasman->ps2_status()
|
||||
|
||||
(C<nnenvPwrsupStatus.2>)
|
||||
|
||||
=item $tasman->nn_sys_ver()
|
||||
|
||||
(C<nnsysVersion.0>)
|
||||
|
||||
=item $tasman->nn_ch_model()
|
||||
|
||||
(C<nnchassisModel.0>)
|
||||
|
||||
=item $tasman->nn_ch_op_stat()
|
||||
|
||||
(C<nnchassisOperStatus.0>)
|
||||
|
||||
=item $tasman->nn_ch_serial()
|
||||
|
||||
(C<nnchassisSerialNumber.0>)
|
||||
|
||||
=item $tasman->serial()
|
||||
|
||||
Tries both (C<nnchassisOperStatus>) and (C<nnchassisSerialNumber>) as oid
|
||||
was redefined between versions.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over 4
|
||||
|
||||
=item $stack->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of iid to administrative duplex setting.
|
||||
|
||||
First checks for fixed gigabit ports which are always full duplex. Next checks
|
||||
the port administrative speed (C<portAdminSpeed>) which if set to
|
||||
autonegotiate then the duplex will also autonegotiate, otherwise it uses the
|
||||
reported port duplex (C<portDuplex>).
|
||||
|
||||
=item $stack->i_speed_admin()
|
||||
|
||||
Returns reference to hash of iid to administrative speed setting.
|
||||
|
||||
C<portAdminSpeed>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
194
Info/Layer3/Timetra.pm
Normal file
194
Info/Layer3/Timetra.pm
Normal file
@@ -0,0 +1,194 @@
|
||||
# SNMP::Info::Layer3::Timetra
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Bill Fenner
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Timetra;
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::Timetra::ISA = qw/SNMP::Info::Layer3
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer3::Timetra::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = ( %SNMP::Info::Layer3::MIBS, 'TIMETRA-GLOBAL-MIB' => 'timetraReg', );
|
||||
|
||||
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, );
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
|
||||
|
||||
sub model {
|
||||
my $timetra = shift;
|
||||
my $id = $timetra->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^tmnxModel//;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'TiMOS';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'alcatel-lucent';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $timetra = shift;
|
||||
|
||||
my $descr = $timetra->description();
|
||||
if ( $descr =~ m/^TiMOS-(\S+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
# No clue what this will try but hey
|
||||
return $timetra->SUPER::os_ver();
|
||||
}
|
||||
|
||||
# The interface description contains the SFP type, so
|
||||
# to avoid losing historical information through a configuration change
|
||||
# we use interface name instead.
|
||||
sub interfaces {
|
||||
my $alu = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $alu->orig_i_name($partial);
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Timetra - SNMP Interface to Alcatel-Lucent SR
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Bill Fenner
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $alu = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $alu->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Alcatel-Lucent Service Routers
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<TIMETRA-GLOBAL-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $alu->vendor()
|
||||
|
||||
Returns 'alcatel-lucent'
|
||||
|
||||
=item $alu->os()
|
||||
|
||||
Returns 'TiMOS'
|
||||
|
||||
=item $alu->os_ver()
|
||||
|
||||
Grabs the version string from C<sysDescr>.
|
||||
|
||||
=item $alu->model()
|
||||
|
||||
Tries to reference $alu->id() to one of the product MIBs listed above
|
||||
|
||||
Removes 'tmnxModel' from the name for readability.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $alu->interfaces()
|
||||
|
||||
Returns C<ifName>, since the default Layer3 C<ifDescr> varies based
|
||||
upon the transceiver inserted.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
244
Info/Layer7.pm
Normal file
244
Info/Layer7.pm
Normal file
@@ -0,0 +1,244 @@
|
||||
# SNMP::Info::Layer7 - SNMP Interface to Layer7 Devices
|
||||
#
|
||||
# Copyright (c) 2011 Jeroen van Ingen
|
||||
#
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer7;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::Layer7::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::Layer7::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
);
|
||||
|
||||
|
||||
# $l7->model() - Looks at sysObjectID which gives the oid of the system
|
||||
# name, contained in a proprietary MIB.
|
||||
sub model {
|
||||
my $l7 = shift;
|
||||
my $id = $l7->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
# Neoteris (Juniper IVE)
|
||||
$model =~ s/^ive//i;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
my $l7 = shift;
|
||||
my $id = $l7->id();
|
||||
my $vendor = 'unknown';
|
||||
if ( defined($id) && $id =~ /^(\.1\.3\.6\.1\.4\.1\.\d+)/ ) {
|
||||
my $enterprise = &SNMP::translateObj($1);
|
||||
$vendor = $enterprise if defined $enterprise;
|
||||
}
|
||||
return $vendor;
|
||||
}
|
||||
|
||||
# By Default we'll use the description field
|
||||
sub interfaces {
|
||||
my $l7 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $l7->i_index($partial) || {};
|
||||
my $i_descr = $l7->i_description($partial) || {};
|
||||
|
||||
# Replace the Index with the ifDescr field.
|
||||
foreach my $iid ( keys %$i_descr ) {
|
||||
my $port = $i_descr->{$iid};
|
||||
next unless defined $port;
|
||||
$interfaces->{$iid} = $port;
|
||||
}
|
||||
return $interfaces;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $l7 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_type = $l7->i_type($partial) || {};
|
||||
|
||||
my %i_ignore = ();
|
||||
|
||||
foreach my $if ( keys %$i_type ) {
|
||||
my $type = $i_type->{$if};
|
||||
$i_ignore{$if}++
|
||||
if $type =~ /(loopback|other|cpu)/i;
|
||||
}
|
||||
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer7 - SNMP Interface to network devices serving Layer7 only.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Jeroen van Ingen
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $l7 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $l7->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
# Let's get some basic Port information
|
||||
my $interfaces = $l7->interfaces();
|
||||
my $i_up = $l7->i_up();
|
||||
my $i_speed = $l7->i_speed();
|
||||
|
||||
foreach my $iid (keys %$interfaces) {
|
||||
my $port = $interfaces->{$iid};
|
||||
my $up = $i_up->{$iid};
|
||||
my $speed = $i_speed->{$iid}
|
||||
print "Port $port is $up. Port runs at $speed.\n";
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This class is usually used as a superclass for more specific device classes
|
||||
listed under SNMP::Info::Layer7::* Please read all docs under SNMP::Info
|
||||
first.
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Layer7 device through SNMP. Information is stored in a number of MIBs.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $l7 = new SNMP::Info::Layer7(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item None
|
||||
|
||||
=back
|
||||
|
||||
MIBs required for L<SNMP::Info/"Required MIBs">
|
||||
|
||||
See L<SNMP::Info/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $l7->model()
|
||||
|
||||
Cross references $l7->id() with product IDs.
|
||||
|
||||
=item $l7->vendor()
|
||||
|
||||
Tries to discover the vendor by looking up the enterprise number in
|
||||
C<sysObjectID>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info
|
||||
|
||||
See documentation in L<SNMP::Info/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $l7->interfaces()
|
||||
|
||||
Returns reference to the map between IID and physical Port.
|
||||
|
||||
=item $l7->i_ignore()
|
||||
|
||||
Returns reference to hash. Increments value of IID if port is to be ignored.
|
||||
|
||||
Ignores loopback, other, and cpu
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
|
||||
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
237
Info/Layer7/APC.pm
Normal file
237
Info/Layer7/APC.pm
Normal file
@@ -0,0 +1,237 @@
|
||||
# SNMP::Info::Layer7::APC - SNMP Interface to APC UPS devices
|
||||
#
|
||||
# Copyright (c) 2011 Jeroen van Ingen
|
||||
#
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer7::APC;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer7;
|
||||
|
||||
@SNMP::Info::Layer7::APC::ISA
|
||||
= qw/SNMP::Info::Layer7 Exporter/;
|
||||
@SNMP::Info::Layer7::APC::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer7::MIBS,
|
||||
'PowerNet-MIB' => 'upsBasicIdentModel',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer7::GLOBALS,
|
||||
'ups_serial' => 'upsAdvIdentSerialNumber.0',
|
||||
'mgmt_serial' => 'experimental.2.4.1.2.1',
|
||||
'os_ver' => 'experimental.2.4.1.4.1',
|
||||
'os_bin' => 'experimental.2.4.1.4.2',
|
||||
'ups_model' => 'upsBasicIdentModel.0',
|
||||
'ps1_status' => 'upsBasicOutputStatus.0',
|
||||
'ps2_status' => 'upsBasicBatteryStatus.0',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer7::FUNCS,
|
||||
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer7::MUNGE,
|
||||
);
|
||||
|
||||
|
||||
# Method Overrides
|
||||
|
||||
sub os {
|
||||
return 'aos';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'apc';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $apc = shift;
|
||||
return $apc->ups_model();
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $apc = shift;
|
||||
my $ups = $apc->ups_serial() || 'unknown';
|
||||
my $mgmt = $apc->mgmt_serial() || 'unknown';
|
||||
return sprintf("UPS: %s, management card: %s", $ups, $mgmt);
|
||||
}
|
||||
|
||||
sub ps1_type {
|
||||
return 'UPS status';
|
||||
}
|
||||
|
||||
sub ps2_type {
|
||||
return 'Battery status';
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer7::APC - SNMP Interface to APC UPS devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Jeroen van Ingen
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $apc = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $apc->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
APC UPS via SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $apc = new SNMP::Info::Layer7::APC(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer7
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<POWERNET-MIB>
|
||||
|
||||
=back
|
||||
|
||||
All required MIBs can be found in the netdisco-mibs package.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $apc->os()
|
||||
|
||||
Returns C<'aos'>
|
||||
|
||||
=item $apc->os_bin()
|
||||
|
||||
C<POWERNET-MIB::experimental.2.4.1.4.2>
|
||||
|
||||
=item $apc->os_ver()
|
||||
|
||||
C<POWERNET-MIB::experimental.2.4.1.4.1>
|
||||
|
||||
=item $apc->serial()
|
||||
|
||||
Combines the UPS serial C<upsAdvIdentSerialNumber.0> with the management
|
||||
card serial C<POWERNET-MIB::experimental.2.4.1.2.1> into a pretty string.
|
||||
|
||||
=item $apc->vendor()
|
||||
|
||||
Returns C<'apc'>
|
||||
|
||||
=item $apc->model()
|
||||
|
||||
C<upsBasicIdentModel.0>
|
||||
|
||||
=item $apc->ps1_type()
|
||||
|
||||
Returns 'UPS status'
|
||||
|
||||
=item $apc->ps1_status()
|
||||
|
||||
Returns the main UPS status from C<upsBasicOutputStatus.0>
|
||||
|
||||
=item $apc->ps2_type()
|
||||
|
||||
Returns 'Battery status'
|
||||
|
||||
=item $apc->ps2_status()
|
||||
|
||||
Returns the battery status from C<upsBasicBatteryStatus.0>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer7
|
||||
|
||||
See documentation in L<SNMP::Info::Layer7/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer7
|
||||
|
||||
See documentation in L<SNMP::Info::Layer7/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 MUNGES
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head1 SET METHODS
|
||||
|
||||
These are methods that provide SNMP set functionality for overridden methods
|
||||
or provide a simpler interface to complex set operations. See
|
||||
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
|
||||
operations.
|
||||
|
||||
=cut
|
||||
164
Info/Layer7/Neoteris.pm
Normal file
164
Info/Layer7/Neoteris.pm
Normal file
@@ -0,0 +1,164 @@
|
||||
# SNMP::Info::Layer7::Neoteris
|
||||
#
|
||||
# Copyright (c) 2012 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer7::Neoteris;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer7;
|
||||
|
||||
@SNMP::Info::Layer7::Neoteris::ISA = qw/SNMP::Info::Layer7 Exporter/;
|
||||
@SNMP::Info::Layer7::Neoteris::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer7::MIBS,
|
||||
'UCD-SNMP-MIB' => 'versionTag',
|
||||
'JUNIPER-IVE-MIB' => 'productVersion',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer7::GLOBALS,
|
||||
'os_ver' => 'productVersion',
|
||||
'cpu' => 'iveCpuUtil',
|
||||
);
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer7::FUNCS, );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer7::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'juniper';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'ive';
|
||||
}
|
||||
|
||||
sub serial {
|
||||
return '';
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer7::Neoteris - SNMP Interface to Juniper SSL VPN appliances
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $neoteris = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $neoteris->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Juniper SSL VPN appliances
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer7
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<UCD-SNMP-MIB>
|
||||
|
||||
=item F<JUNIPER-IVE-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer7> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $neoteris->vendor()
|
||||
|
||||
Returns 'juniper'.
|
||||
|
||||
=item $neoteris->os()
|
||||
|
||||
Returns C<'ive'>.
|
||||
|
||||
=item $neoteris->os_ver()
|
||||
|
||||
C<productVersion>
|
||||
|
||||
=item $neoteris->cpu()
|
||||
|
||||
C<iveCpuUtil>
|
||||
|
||||
=item $neoteris->serial()
|
||||
|
||||
Returns ''.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer7
|
||||
|
||||
See documentation in L<SNMP::Info::Layer7> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer7
|
||||
|
||||
See documentation in L<SNMP::Info::Layer7> for details.
|
||||
|
||||
=cut
|
||||
215
Info/Layer7/Netscaler.pm
Normal file
215
Info/Layer7/Netscaler.pm
Normal file
@@ -0,0 +1,215 @@
|
||||
# SNMP::Info::Layer7::Netscaler
|
||||
#
|
||||
# Copyright (c) 2012 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer7::Netscaler;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer7;
|
||||
|
||||
@SNMP::Info::Layer7::Netscaler::ISA = qw/SNMP::Info::Layer7 Exporter/;
|
||||
@SNMP::Info::Layer7::Netscaler::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer7::MIBS,
|
||||
'NS-ROOT-MIB' => 'sysBuildVersion',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer7::GLOBALS,
|
||||
'build_ver' => 'sysBuildVersion',
|
||||
'sys_hw_desc' => 'sysHardwareVersionDesc',
|
||||
'cpu' => 'resCpuUsage',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer7::FUNCS,
|
||||
# IP Address Table - NS-ROOT-MIB::nsIpAddrTable
|
||||
'ip_index' => 'ipAddr',
|
||||
'ip_netmask' => 'ipNetmask',
|
||||
# TODO VLAN - NS-ROOT-MIB::vlanTable
|
||||
'ns_vid' =>'vlanId',
|
||||
'ns_vlan_mem' => 'vlanMemberInterfaces',
|
||||
'ns_vtag_int' => 'vlanTaggedInterfaces',
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer7::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'citrix';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'netscaler';
|
||||
}
|
||||
|
||||
sub serial {
|
||||
return '';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $ns = shift;
|
||||
my $desc = $ns->sys_hw_desc() || '';
|
||||
|
||||
$desc =~ s/^.+\bNS//i;
|
||||
|
||||
return $desc;
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $ns = shift;
|
||||
my $ver = $ns->build_ver() || '';
|
||||
|
||||
if ($ver =~ /^.+\bNS(\d+\.\d+)/) {
|
||||
$ver = $1;
|
||||
}
|
||||
return $ver;
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer7::Netscaler - SNMP Interface to Citrix Netscaler appliances
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $ns = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $ns->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Citrix Netscaler appliances
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer7
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<NS-ROOT-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer7> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $ns->vendor()
|
||||
|
||||
Returns 'citrix'.
|
||||
|
||||
=item $ns->os()
|
||||
|
||||
Returns 'netscaler'.
|
||||
|
||||
=item $ns->os_ver()
|
||||
|
||||
Release extracted from C<sysBuildVersion>.
|
||||
|
||||
=item $ns->model()
|
||||
|
||||
Model extracted from C<sysHardwareVersionDesc>.
|
||||
|
||||
=item $ns->cpu()
|
||||
|
||||
C<resCpuUsage>
|
||||
|
||||
=item $ns->build_ver()
|
||||
|
||||
C<sysBuildVersion>
|
||||
|
||||
=item $ns->sys_hw_desc()
|
||||
|
||||
C<sysHardwareVersionDesc>
|
||||
|
||||
=item $ns->serial()
|
||||
|
||||
Returns ''.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer7
|
||||
|
||||
See documentation in L<SNMP::Info::Layer7> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $ns->ip_index()
|
||||
|
||||
C<ipAddr>
|
||||
|
||||
=item $ns->ip_netmask()
|
||||
|
||||
C<ipNetmask>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer7
|
||||
|
||||
See documentation in L<SNMP::Info::Layer7> for details.
|
||||
|
||||
=cut
|
||||
372
Info/MAU.pm
372
Info/MAU.pm
@@ -1,119 +1,286 @@
|
||||
# SNMP::Info::MAU - Media Access Unit - RFC2668
|
||||
# Max Baker <max@warped.org>
|
||||
# SNMP::Info::MAU - Media Access Unit - RFC 2668
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::MAU;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
|
||||
@SNMP::Info::MAU::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::MAU::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::MAU::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$INIT = 0;
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = ('MAU-MIB' => 'mauMod');
|
||||
%MIBS = ( 'MAU-MIB' => 'mauMod' );
|
||||
|
||||
%GLOBALS = (
|
||||
);
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
# Interface MAU Table
|
||||
'mau_index' => 'ifMauIfIndex',
|
||||
'mau_link' => 'ifMauType',
|
||||
'mau_status' => 'ifMauStatus',
|
||||
'mau_up' => 'ifMauMediaAvailable',
|
||||
'mau_type' => 'ifMauTypeList',
|
||||
'mau_type_admin' => 'ifMauDefaultType',
|
||||
# Interface Auto-Negotiation Table
|
||||
'mau_auto' => 'ifMauAutoNegSupported',
|
||||
'mau_autostat' => 'ifMauAutoNegAdminStatus',
|
||||
'mau_autosent' => 'ifMauAutoNegCapAdvertised',
|
||||
'mau_autorec' => 'ifMauAutoNegCapReceived',
|
||||
);
|
||||
|
||||
# Interface MAU Table
|
||||
'mau_index' => 'ifMauIfIndex',
|
||||
'mau_link' => 'ifMauType',
|
||||
'mau_status' => 'ifMauStatus',
|
||||
'mau_up' => 'ifMauMediaAvailable',
|
||||
'mau_type' => 'ifMauTypeList',
|
||||
'mau_type_admin' => 'ifMauDefaultType',
|
||||
|
||||
# Interface Auto-Negotiation Table
|
||||
'mau_auto' => 'ifMauAutoNegSupported',
|
||||
'mau_autostat' => 'ifMauAutoNegAdminStatus',
|
||||
'mau_autosent' => 'ifMauAutoNegCapAdvertised',
|
||||
'mau_autorec' => 'ifMauAutoNegCapReceived',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
# Add ones for our class
|
||||
'mau_type' => \&munge_int2bin,
|
||||
'mau_autosent' => \&munge_int2bin,
|
||||
'mau_autorec' => \&munge_int2bin,
|
||||
);
|
||||
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
|
||||
# Add ones for our class
|
||||
'mau_type' => \&munge_int2bin,
|
||||
'mau_autosent' => \&munge_int2bin,
|
||||
'mau_autorec' => \&munge_int2bin,
|
||||
);
|
||||
|
||||
sub munge_int2bin {
|
||||
my $int = shift;
|
||||
return undef unless defined $int;
|
||||
return unpack("B32", pack("N", $int));
|
||||
return unless defined $int;
|
||||
return unpack( "B32", pack( "N", $int ) );
|
||||
}
|
||||
|
||||
sub _isfullduplex{
|
||||
my $mau = shift;
|
||||
sub _isfullduplex {
|
||||
my $mau = shift;
|
||||
my $mautype = shift;
|
||||
|
||||
my @full_types = qw/11 13 16 18 20/;
|
||||
foreach my $type ( @full_types ) {
|
||||
return 1 if (substr($mautype,32-$type,1) eq '1')
|
||||
foreach my $type (@full_types) {
|
||||
return 1 if ( substr( $mautype, 32 - $type, 1 ) eq '1' );
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
sub _ishalfduplex{
|
||||
my $mau = shift;
|
||||
sub _ishalfduplex {
|
||||
my $mau = shift;
|
||||
my $mautype = shift;
|
||||
|
||||
my @half_types = qw/10 12 15 17 19/;
|
||||
foreach my $type ( @half_types ) {
|
||||
return 1 if (substr($mautype,32-$type,1) eq '1')
|
||||
foreach my $type (@half_types) {
|
||||
return 1 if ( substr( $mautype, 32 - $type, 1 ) eq '1' );
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
my %_mau_i_speed_map = (
|
||||
'10' => '10 Mbps',
|
||||
'100' => '100 Mbps',
|
||||
'1000' => '1.0 Gbps',
|
||||
'10Gig' => '10 Gbps',
|
||||
);
|
||||
|
||||
sub mau_i_speed_admin {
|
||||
my $mau = shift;
|
||||
|
||||
my $mau_index = $mau->mau_index();
|
||||
my $mau_type_admin = $mau->mau_type_admin();
|
||||
|
||||
my %i_speed_admin;
|
||||
foreach my $mau_port ( keys %$mau_type_admin ) {
|
||||
my $iid = $mau_index->{$mau_port};
|
||||
next unless defined $iid;
|
||||
|
||||
my $type_adminoid = $mau_type_admin->{$mau_port};
|
||||
my $type_admin = &SNMP::translateObj($type_adminoid);
|
||||
next unless defined $type_admin;
|
||||
|
||||
if ( $type_adminoid eq '.0.0' ) {
|
||||
$i_speed_admin{$iid} = 'auto';
|
||||
}
|
||||
elsif ($type_admin =~ /^dot3MauType(.*)Base/
|
||||
&& $_mau_i_speed_map{$1} )
|
||||
{
|
||||
$i_speed_admin{$iid} = $_mau_i_speed_map{$1};
|
||||
}
|
||||
}
|
||||
return \%i_speed_admin;
|
||||
}
|
||||
|
||||
sub mau_i_duplex {
|
||||
my $mau = shift;
|
||||
|
||||
my $mau_index = $mau->mau_index();
|
||||
my $mau_link = $mau->mau_link();
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $mau_port ( keys %$mau_link ) {
|
||||
my $iid = $mau_index->{$mau_port};
|
||||
next unless defined $iid;
|
||||
|
||||
my $linkoid = $mau_link->{$mau_port};
|
||||
my $link = &SNMP::translateObj($linkoid);
|
||||
next unless defined $link;
|
||||
|
||||
my $duplex = undef;
|
||||
|
||||
if ( $link =~ /fd$/i ) {
|
||||
$duplex = 'full';
|
||||
}
|
||||
elsif ( $link =~ /hd$/i ) {
|
||||
$duplex = 'half';
|
||||
}
|
||||
|
||||
$i_duplex{$iid} = $duplex if defined $duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub mau_i_duplex_admin {
|
||||
my $mau = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $mau_index = $mau->mau_index() || {};
|
||||
|
||||
if ($partial) {
|
||||
my %rev_mau_index = reverse %$mau_index;
|
||||
$partial = $rev_mau_index{$partial};
|
||||
}
|
||||
|
||||
my $mau_autostat = $mau->mau_autostat($partial) || {};
|
||||
my $mau_type_admin = $mau->mau_type_admin($partial) || {};
|
||||
|
||||
# Older HP4000's don't implement ifMauDefaultType, but we can
|
||||
# figure out from ifMauAutoNegCapAdvertised what we'd like.
|
||||
if ( !defined($mau_type_admin) ) {
|
||||
if ( defined($mau_index) ) {
|
||||
return mau_i_duplex_admin_old( $mau, $mau_index, $mau_autostat );
|
||||
}
|
||||
else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $mau_port ( keys %$mau_type_admin ) {
|
||||
my $iid = $mau_index->{$mau_port};
|
||||
next unless defined $iid;
|
||||
|
||||
my $autostat = $mau_autostat->{$mau_port};
|
||||
if ( defined $autostat and $autostat =~ /enabled/i ) {
|
||||
$i_duplex_admin{$iid} = 'auto';
|
||||
next;
|
||||
}
|
||||
|
||||
my $type_adminoid = $mau_type_admin->{$mau_port};
|
||||
my $type_admin = &SNMP::translateObj($type_adminoid);
|
||||
next unless defined $type_admin;
|
||||
|
||||
my $duplex = undef;
|
||||
|
||||
if ( $type_admin =~ /fd$/i ) {
|
||||
$duplex = 'full';
|
||||
}
|
||||
elsif ( $type_admin =~ /hd$/i ) {
|
||||
$duplex = 'half';
|
||||
}
|
||||
elsif ( $type_admin eq 'zeroDotZero' ) {
|
||||
$duplex = 'auto';
|
||||
}
|
||||
|
||||
$i_duplex_admin{$iid} = $duplex if defined $duplex;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
sub mau_i_duplex_admin_old {
|
||||
my $mau = shift;
|
||||
my $mau_index = shift;
|
||||
my $mau_autostat = shift;
|
||||
|
||||
my $interfaces = $mau->interfaces();
|
||||
my $mau_autosent = $mau->mau_autosent();
|
||||
|
||||
my %mau_reverse = reverse %$mau_index;
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $iid ( keys %$interfaces ) {
|
||||
my $mau_index = $mau_reverse{$iid};
|
||||
next unless defined $mau_index;
|
||||
|
||||
my $autostat = $mau_autostat->{$mau_index};
|
||||
|
||||
# HP25xx has this value
|
||||
if ( defined $autostat and $autostat =~ /enabled/i ) {
|
||||
$i_duplex_admin{$iid} = 'auto';
|
||||
next;
|
||||
}
|
||||
|
||||
my $type = $mau_autosent->{$mau_index};
|
||||
|
||||
next unless defined $type;
|
||||
|
||||
if ( $type == 0 ) {
|
||||
$i_duplex_admin{$iid} = 'none';
|
||||
next;
|
||||
}
|
||||
|
||||
my $full = $mau->_isfullduplex($type);
|
||||
my $half = $mau->_ishalfduplex($type);
|
||||
|
||||
if ( $full and !$half ) {
|
||||
$i_duplex_admin{$iid} = 'full';
|
||||
}
|
||||
elsif ($half) {
|
||||
$i_duplex_admin{$iid} = 'half';
|
||||
}
|
||||
}
|
||||
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::MAU - Perl5 Interface to Medium Access Unit (MAU) MIB (RFC2668) via SNMP
|
||||
SNMP::Info::MAU - SNMP Interface to Medium Access Unit (MAU) MIB (RFC 2668)
|
||||
via SNMP
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -130,14 +297,15 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::MAU is a sublcass of SNMP::Info that supplies access to the
|
||||
MAU-MIB (RFC2668). This MIB is sometimes implemented on Layer 2 network devices like HP Switches.
|
||||
MAU = Media Access Unit.
|
||||
SNMP::Info::MAU is a subclass of SNMP::Info that supplies access to the
|
||||
F<MAU-MIB> (RFC 2668). This MIB is sometimes implemented on Layer 2 network
|
||||
devices like HP Switches. MAU = Media Access Unit.
|
||||
|
||||
The MAU table contains link and duplex info for the port itself and the device
|
||||
connected to that port.
|
||||
|
||||
Normally you use or create a subclass of SNMP::Info that inherits this one. Do not use directly.
|
||||
Normally you use or create a subclass of SNMP::Info that inherits this one.
|
||||
Do not use directly.
|
||||
|
||||
For debugging purposes call the class directly as you would SNMP::Info
|
||||
|
||||
@@ -151,7 +319,7 @@ None.
|
||||
|
||||
=over
|
||||
|
||||
=item MAU-MIB
|
||||
=item F<MAU-MIB>
|
||||
|
||||
=back
|
||||
|
||||
@@ -170,21 +338,50 @@ These are methods that return scalar value from SNMP
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 MAU INTERFACE TABLE ENTRIES
|
||||
|
||||
=over
|
||||
|
||||
=item $mau->mau_i_duplex()
|
||||
|
||||
Parses mau_index and mau_link to return the duplex information for
|
||||
interfaces.
|
||||
|
||||
=item $mau->mau_i_duplex_admin()
|
||||
|
||||
Parses C<mac_index>,C<mau_autostat>,C<mau_type_admin> in
|
||||
order to find the admin duplex setting for all the interfaces.
|
||||
|
||||
Returns either (auto,full,half).
|
||||
|
||||
=item $mau->mau_i_duplex_admin_old()
|
||||
|
||||
Called by mau_i_duplex_admin() if C<mau_type_admin> is empty.
|
||||
Parses C<mau_index>,C<mau_autostat>,C<mau_autosent> in
|
||||
order to find the admin duplex setting for all the interfaces.
|
||||
|
||||
Returns either (auto,none,full,half).
|
||||
|
||||
=item $mau->mau_i_speed_admin()
|
||||
|
||||
Returns admin speed setting for all the interfaces.
|
||||
|
||||
=back
|
||||
|
||||
=head2 MAU INTERFACE TABLE METHODS
|
||||
|
||||
=over
|
||||
|
||||
=item $mau->mau_index() - Returns a list of interfaces
|
||||
and their index in the MAU IF Table.
|
||||
|
||||
(B<ifMauIfIndex>)
|
||||
(C<ifMauIfIndex>)
|
||||
|
||||
=item $mau->mau_link() - Returns the type of Media Access used.
|
||||
|
||||
This is essentially the type of link in use.
|
||||
eg. dot3MauType100BaseTXFD - 100BaseT at Full Duplex
|
||||
|
||||
(B<ifMauType>)
|
||||
(C<ifMauType>)
|
||||
|
||||
=item $mau->mau_status() - Returns the admin link condition as
|
||||
|
||||
@@ -197,16 +394,16 @@ and their index in the MAU IF Table.
|
||||
|
||||
Use 5 and !5 to see if the link is up or down on the admin side.
|
||||
|
||||
(B<ifMauStatus>)
|
||||
(C<ifMauStatus>)
|
||||
|
||||
=item $mau->mau_up() - Returns the current link condition
|
||||
|
||||
(B<ifMauMediaAvailable>)
|
||||
(C<ifMauMediaAvailable>)
|
||||
|
||||
=item $mau->mau_type() - Returns a 32bit string reporting the capabilities
|
||||
of the port from a MAU POV.
|
||||
|
||||
Directly from the MAU-MIB :
|
||||
Directly from F<MAU-MIB> :
|
||||
Bit Capability
|
||||
0 other or unknown
|
||||
1 AUI
|
||||
@@ -230,26 +427,33 @@ of the port from a MAU POV.
|
||||
19 100BASE-T2 half duplex mode
|
||||
20 100BASE-T2 full duplex mode
|
||||
|
||||
(B<ifMauTypeList>)
|
||||
(C<ifMauTypeList>)
|
||||
|
||||
=item $mau->mau_type_admin()
|
||||
|
||||
(C<ifMauDefaultType>)
|
||||
|
||||
=item $mau->mau_auto() - Returns status of auto-negotiation mode for ports.
|
||||
|
||||
(B<ifMauAutoNegAdminStatus>)
|
||||
(C<ifMauAutoNegAdminStatus>)
|
||||
|
||||
=item $mau->mau_autostat()
|
||||
|
||||
(C<ifMauAutoNegAdminStatus>)
|
||||
|
||||
=item $mau->mau_autosent() - Returns a 32 bit bit-string representing the
|
||||
capabilities we are broadcasting on that port
|
||||
|
||||
Uses the same decoder as $mau->mau_type().
|
||||
|
||||
(B<ifMauAutoNegCapAdvertised>)
|
||||
|
||||
(C<ifMauAutoNegCapAdvertised>)
|
||||
|
||||
=item $mau->mau_autorec() - Returns a 32 bit bit-string representing the
|
||||
capabilities of the device on the other end.
|
||||
|
||||
Uses the same decoder as $mau->mau_type().
|
||||
|
||||
(B<ifMauAutoNegCapReceived>)
|
||||
(C<ifMauAutoNegCapReceived>)
|
||||
|
||||
=back
|
||||
|
||||
@@ -261,13 +465,13 @@ capabilities of the device on the other end.
|
||||
|
||||
=item $mau->_isfullduplex(bitstring)
|
||||
|
||||
Boolean. Checks to see if any of the full_duplex types from mau_type() are
|
||||
high. Currently bits 11,13,16,18,20.
|
||||
Boolean. Checks to see if any of the full_duplex types from mau_type()
|
||||
are high. Currently bits 11,13,16,18,20.
|
||||
|
||||
=item $mau->_ishalfduplex(bitstring)
|
||||
|
||||
Boolean. Checks to see if any of the half_duplex types from mau_type() are
|
||||
high. Currently bits 10,12,15,17,19.
|
||||
Boolean. Checks to see if any of the half_duplex types from mau_type()
|
||||
are high. Currently bits 10,12,15,17,19.
|
||||
|
||||
=back
|
||||
|
||||
|
||||
912
Info/NortelStack.pm
Normal file
912
Info/NortelStack.pm
Normal file
@@ -0,0 +1,912 @@
|
||||
# SNMP::Info::NortelStack
|
||||
# $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::NortelStack;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::NortelStack::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::NortelStack::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = (
|
||||
|
||||
# S5-ROOT-MIB and S5-TCS-MIB required by the MIBs below
|
||||
'S5-AGENT-MIB' => 's5AgMyGrpIndx',
|
||||
'S5-CHASSIS-MIB' => 's5ChasType',
|
||||
'S5-REG-MIB' => 's5ChasTypeVal',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
|
||||
# From S5-AGENT-MIB
|
||||
'ns_ag_ver' => 's5AgInfoVer',
|
||||
'ns_op_mode' => 's5AgSysCurrentOperationalMode',
|
||||
'ns_auto_pvid' => 's5AgSysAutoPvid',
|
||||
'tftp_host' => 's5AgSysTftpServerAddress',
|
||||
'tftp_file' => 's5AgSysBinaryConfigFilename',
|
||||
'tftp_action' => 's5AgInfoFileAction',
|
||||
'tftp_result' => 's5AgInfoFileStatus',
|
||||
'vlan' => 's5AgSysManagementVlanId',
|
||||
|
||||
# From S5-CHASSIS-MIB
|
||||
'ns_serial' => 's5ChasSerNum',
|
||||
'ns_ch_type' => 's5ChasType',
|
||||
'ns_cfg_chg' => 's5ChasGblConfChngs',
|
||||
'ns_cfg_time' => 's5ChasGblConfLstChng',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# From S5-AGENT-MIB::s5AgMyIfTable
|
||||
'i_cfg_file' => 's5AgMyIfCfgFname',
|
||||
'i_cfg_host' => 's5AgMyIfLdSvrAddr',
|
||||
|
||||
# From S5-CHASSIS-MIB::s5ChasGrpTable
|
||||
'ns_grp_type' => 's5ChasGrpType',
|
||||
|
||||
# From S5-CHASSIS-MIB::s5ChasComTable
|
||||
'ns_com_grp_idx' => 's5ChasComGrpIndx',
|
||||
'ns_com_idx' => 's5ChasComIndx',
|
||||
'ns_com_sub_idx' => 's5ChasComSubIndx',
|
||||
'ns_com_type' => 's5ChasComType',
|
||||
'ns_com_descr' => 's5ChasComDescr',
|
||||
'ns_com_ver' => 's5ChasComVer',
|
||||
'ns_com_serial' => 's5ChasComSerNum',
|
||||
|
||||
# From S5-CHASSIS-MIB::s5ChasStoreTable
|
||||
'ns_store_grp_idx' => 's5ChasStoreGrpIndx',
|
||||
'ns_store_com_idx' => 's5ChasStoreComIndx',
|
||||
'ns_store_sub_idx' => 's5ChasStoreSubIndx',
|
||||
'ns_store_idx' => 's5ChasStoreIndx',
|
||||
'ns_store_type' => 's5ChasStoreType',
|
||||
'ns_store_size' => 's5ChasStoreCurSize',
|
||||
'ns_store_ver' => 's5ChasStoreCntntVer',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'ns_ch_type' => \&SNMP::Info::munge_e_type,
|
||||
'ns_grp_type' => \&munge_ns_grp_type,
|
||||
'ns_com_type' => \&SNMP::Info::munge_e_type,
|
||||
'ns_store_type' => \&SNMP::Info::munge_e_type,
|
||||
);
|
||||
|
||||
sub os_ver {
|
||||
my $stack = shift;
|
||||
|
||||
my $ver = $stack->ns_ag_ver();
|
||||
return unless defined $ver;
|
||||
|
||||
if ( $ver =~ m/(\d+\.\d+\.\d+\.\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
if ( $ver =~ m/V(\d+\.\d+\.\d+)/i ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub os_bin {
|
||||
my $stack = shift;
|
||||
|
||||
my $ver = $stack->ns_ag_ver();
|
||||
return unless defined $ver;
|
||||
|
||||
if ( $ver =~ m/(\d+\.\d+\.\d+\.\d+)/i ) {
|
||||
return $1;
|
||||
}
|
||||
if ( $ver =~ m/V(\d+\.\d+.\d+)/i ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
# Need to override here since overridden in Layer2 and Layer3 classes
|
||||
sub serial {
|
||||
my $stack = shift;
|
||||
|
||||
my $ver = $stack->ns_serial();
|
||||
return $ver unless !defined $ver;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
# Pseudo ENTITY-MIB methods for older switches with don't support ENTITY-MIB
|
||||
|
||||
# This class supports both stackable and chassis based switches, identify if
|
||||
# we have a stackable so that we return appropriate entPhysicalClass
|
||||
sub _ns_e_is_virtual {
|
||||
my $stack = shift;
|
||||
|
||||
# We really only need one value, but we want this cached since most
|
||||
# methods call it at least via ns_e_index()
|
||||
my $v_test = $stack->s5ChasComRelPos() || {};
|
||||
return $v_test->{'8.1.0'};
|
||||
}
|
||||
|
||||
# Identify is the stackable is actually a stack vs. single switch
|
||||
sub _ns_e_is_stack {
|
||||
my $stack = shift;
|
||||
|
||||
my $s_test = $stack->ns_e_class() || {};
|
||||
|
||||
foreach my $iid ( keys %$s_test ) {
|
||||
my $class = $s_test->{$iid};
|
||||
next unless defined $class;
|
||||
return 1 if ( $class eq 'stack' );
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
sub ns_e_index {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ns_e_idx = $stack->ns_com_grp_idx($partial) || {};
|
||||
my $is_virtual = $stack->_ns_e_is_virtual();
|
||||
|
||||
my %ns_e_index;
|
||||
foreach my $iid ( keys %$ns_e_idx ) {
|
||||
|
||||
# Skip backplane, power, sensor, fan, clock - these aren't in the
|
||||
# newer devices ENTITY-MIB we're emulating
|
||||
next if ( $iid =~ /^[24567]/ );
|
||||
next if ( ($is_virtual) and ( $iid =~ /^8/ or $iid eq '1.0.0' ) );
|
||||
|
||||
# Format into consistent integer format so that numeric sorting works
|
||||
my $index = join( '', map { sprintf "%02d", $_ } split /\./, $iid );
|
||||
$ns_e_index{$iid} = $index;
|
||||
}
|
||||
return \%ns_e_index;
|
||||
}
|
||||
|
||||
sub ns_e_class {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ns_e_idx = $stack->ns_e_index($partial) || {};
|
||||
my $classes = $stack->ns_grp_type();
|
||||
my $ns_grp_enc = $stack->s5ChasGrpEncodeFactor($partial) || {};
|
||||
my $is_virtual = $stack->_ns_e_is_virtual();
|
||||
|
||||
my %ns_e_class;
|
||||
foreach my $iid ( keys %$ns_e_idx ) {
|
||||
my ( $grp, $idx, $sub ) = split( /\./, $iid );
|
||||
next unless defined $grp;
|
||||
my $class = $classes->{$grp};
|
||||
next unless defined $class;
|
||||
my $enc = $ns_grp_enc->{$grp};
|
||||
|
||||
# Handle quirks of dealing with both stacks and chassis
|
||||
if ( ( !$is_virtual ) and ( $grp == 1 ) ) {
|
||||
$class = 'module';
|
||||
}
|
||||
if ( ($is_virtual) and ( $grp == 3 ) and !( $idx % $enc ) ) {
|
||||
$class = 'chassis';
|
||||
}
|
||||
|
||||
$ns_e_class{$iid} = $class;
|
||||
}
|
||||
return \%ns_e_class;
|
||||
}
|
||||
|
||||
sub ns_e_descr {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ns_e_idx = $stack->ns_e_index($partial) || {};
|
||||
my $ns_e_descr = $stack->ns_com_descr($partial) || {};
|
||||
|
||||
my %ns_e_descr;
|
||||
foreach my $iid ( keys %$ns_e_idx ) {
|
||||
my $descr = $ns_e_descr->{$iid};
|
||||
next unless defined $descr;
|
||||
|
||||
$ns_e_descr{$iid} = $descr;
|
||||
}
|
||||
return \%ns_e_descr;
|
||||
}
|
||||
|
||||
sub ns_e_name {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ns_class = $stack->ns_e_class() || {};
|
||||
my $ns_e_idx = $stack->ns_e_index() || {};
|
||||
my $ns_grp_enc = $stack->s5ChasGrpEncodeFactor($partial) || {};
|
||||
my $is_virtual = $stack->_ns_e_is_virtual();
|
||||
|
||||
my %ns_e_name;
|
||||
foreach my $iid ( keys %$ns_e_idx ) {
|
||||
|
||||
my ( $grp, $idx, $sub ) = split( /\./, $iid );
|
||||
my $class = $ns_class->{$iid};
|
||||
next unless defined $class;
|
||||
my $enc = $ns_grp_enc->{$grp};
|
||||
|
||||
if ( ( !$is_virtual ) and ( $grp == 1 ) ) {
|
||||
$ns_e_name{$iid} = 'Supervisory Module';
|
||||
}
|
||||
elsif ( $class eq 'stack' ) {
|
||||
$ns_e_name{$iid} = 'Stack Master Unit';
|
||||
}
|
||||
elsif ( $class eq 'chassis' ) {
|
||||
if ($is_virtual) {
|
||||
my $unit = $idx / $enc;
|
||||
$ns_e_name{$iid} = "Switch Unit $unit";
|
||||
}
|
||||
else {
|
||||
$ns_e_name{$iid} = "Chassis";
|
||||
}
|
||||
}
|
||||
elsif ( $class eq 'module' ) {
|
||||
if ($is_virtual) {
|
||||
my $unit = int( $idx / $enc );
|
||||
my $mda = $idx % $enc;
|
||||
$ns_e_name{$iid} = "Switch Unit $unit, MDA $mda";
|
||||
}
|
||||
elsif ( $sub != 0 ) {
|
||||
$ns_e_name{$iid} = "Module Slot $idx, Subcomponent $sub";
|
||||
}
|
||||
else {
|
||||
$ns_e_name{$iid} = "Module Slot $idx";
|
||||
}
|
||||
}
|
||||
}
|
||||
return \%ns_e_name;
|
||||
}
|
||||
|
||||
sub ns_e_hwver {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ns_e_idx = $stack->ns_e_index($partial) || {};
|
||||
my $ns_e_ver = $stack->ns_com_ver($partial) || {};
|
||||
|
||||
my %ns_e_hwver;
|
||||
foreach my $iid ( keys %$ns_e_idx ) {
|
||||
my $ver = $ns_e_ver->{$iid};
|
||||
next unless defined $ver;
|
||||
|
||||
$ns_e_hwver{$iid} = $ver;
|
||||
}
|
||||
return \%ns_e_hwver;
|
||||
}
|
||||
|
||||
sub ns_e_vendor {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ns_e_idx = $stack->ns_e_index($partial) || {};
|
||||
|
||||
my %ns_e_vendor;
|
||||
foreach my $iid ( keys %$ns_e_idx ) {
|
||||
my $vendor = 'avaya';
|
||||
|
||||
$ns_e_vendor{$iid} = $vendor;
|
||||
}
|
||||
return \%ns_e_vendor;
|
||||
}
|
||||
|
||||
sub ns_e_serial {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ns_e_idx = $stack->ns_e_index($partial) || {};
|
||||
my $ns_e_serial = $stack->ns_com_serial($partial) || {};
|
||||
|
||||
my %ns_e_serial;
|
||||
foreach my $iid ( keys %$ns_e_idx ) {
|
||||
my $serial = $ns_e_serial->{$iid};
|
||||
next unless defined $serial;
|
||||
|
||||
$ns_e_serial{$iid} = $serial;
|
||||
}
|
||||
return \%ns_e_serial;
|
||||
}
|
||||
|
||||
sub ns_e_type {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ns_e_idx = $stack->ns_e_index($partial) || {};
|
||||
my $ns_e_type = $stack->ns_com_type($partial) || {};
|
||||
my $is_stack = $stack->_ns_e_is_stack();
|
||||
my $ch_type = $stack->ns_ch_type();
|
||||
|
||||
my %ns_e_type;
|
||||
foreach my $iid ( keys %$ns_e_idx ) {
|
||||
my $type = $ns_e_type->{$iid};
|
||||
next unless defined $type;
|
||||
|
||||
if ( $is_stack and $iid =~ /^1/ ) {
|
||||
$type = $ch_type;
|
||||
}
|
||||
$ns_e_type{$iid} = $type;
|
||||
}
|
||||
return \%ns_e_type;
|
||||
}
|
||||
|
||||
sub ns_e_pos {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ns_e_idx = $stack->ns_e_index($partial) || {};
|
||||
my $ns_grp_enc = $stack->s5ChasGrpEncodeFactor($partial) || {};
|
||||
my $is_stack = $stack->_ns_e_is_stack();
|
||||
my $is_virtual = $stack->_ns_e_is_virtual();
|
||||
|
||||
my %ns_e_pos;
|
||||
foreach my $iid ( keys %$ns_e_idx ) {
|
||||
my ( $grp, $pos, $idx ) = split( /\./, $iid );
|
||||
next unless defined $grp;
|
||||
next unless defined $pos;
|
||||
|
||||
if ( $grp == 1 ) {
|
||||
if ($is_stack) {
|
||||
$pos = -1;
|
||||
}
|
||||
else {
|
||||
$pos = 99;
|
||||
}
|
||||
}
|
||||
elsif ( $grp == 3 and $idx == 0 ) {
|
||||
my $enc = $ns_grp_enc->{$grp};
|
||||
if ( $is_virtual and ( $pos % $enc ) ) {
|
||||
$pos = int( $pos % $enc );
|
||||
}
|
||||
elsif ( $is_virtual and !$is_stack and !( $pos % $enc ) ) {
|
||||
$pos = -1;
|
||||
}
|
||||
elsif ( $is_virtual and !( $pos % $enc ) ) {
|
||||
$pos = ( $pos / $enc );
|
||||
}
|
||||
}
|
||||
elsif ( !$is_stack and $grp == 3 ) {
|
||||
$pos = $idx;
|
||||
}
|
||||
elsif ( $grp == 8 ) {
|
||||
$pos = -1;
|
||||
}
|
||||
$ns_e_pos{$iid} = $pos;
|
||||
}
|
||||
return \%ns_e_pos;
|
||||
}
|
||||
|
||||
sub ns_e_fwver {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ns_e_idx = $stack->ns_e_index($partial) || {};
|
||||
my $ns_e_ver = $stack->ns_store_ver($partial) || {};
|
||||
my $ns_e_type = $stack->ns_store_type($partial) || {};
|
||||
my $ns_grp_enc = $stack->s5ChasGrpEncodeFactor($partial) || {};
|
||||
my $is_virt = $stack->_ns_e_is_virtual();
|
||||
|
||||
my %ns_e_fwver;
|
||||
foreach my $iid ( keys %$ns_e_type ) {
|
||||
my $type = $ns_e_type->{$iid};
|
||||
next unless defined $type;
|
||||
next unless $type =~ /(rom|boot|fw)/i;
|
||||
my $ver = $ns_e_ver->{$iid};
|
||||
next unless defined $ver;
|
||||
$iid =~ s/\.\d+$//;
|
||||
|
||||
if ($is_virt) {
|
||||
my ( $grp, $idx, $pos ) = split( /\./, $iid );
|
||||
my $enc = $ns_grp_enc->{$grp};
|
||||
$idx = $idx * $enc;
|
||||
$iid = "3.$idx.$pos";
|
||||
}
|
||||
$ns_e_fwver{$iid} = $ver;
|
||||
}
|
||||
return \%ns_e_fwver;
|
||||
}
|
||||
|
||||
sub ns_e_swver {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ns_e_idx = $stack->ns_e_index($partial) || {};
|
||||
my $ns_e_ver = $stack->ns_store_ver($partial) || {};
|
||||
my $ns_e_type = $stack->ns_store_type($partial) || {};
|
||||
my $ns_grp_enc = $stack->s5ChasGrpEncodeFactor($partial) || {};
|
||||
my $is_virt = $stack->_ns_e_is_virtual();
|
||||
|
||||
my %ns_e_swver;
|
||||
foreach my $iid ( keys %$ns_e_type ) {
|
||||
my $type = $ns_e_type->{$iid};
|
||||
next unless defined $type;
|
||||
next unless $type =~ /(flash)/i;
|
||||
my $ver = $ns_e_ver->{$iid};
|
||||
next unless defined $ver;
|
||||
$iid =~ s/\.\d+$//;
|
||||
|
||||
if ($is_virt) {
|
||||
my ( $grp, $idx, $pos ) = split( /\./, $iid );
|
||||
my $enc = $ns_grp_enc->{$grp};
|
||||
$idx = $idx * $enc;
|
||||
$iid = "3.$idx.$pos";
|
||||
}
|
||||
$ns_e_swver{$iid} = $ver;
|
||||
}
|
||||
return \%ns_e_swver;
|
||||
}
|
||||
|
||||
sub ns_e_parent {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ns_e_idx = $stack->ns_e_index($partial) || {};
|
||||
my $ns_grp_enc = $stack->s5ChasGrpEncodeFactor($partial) || {};
|
||||
my $is_stack = $stack->_ns_e_is_stack();
|
||||
my $is_virtual = $stack->_ns_e_is_virtual();
|
||||
|
||||
my %ns_e_parent;
|
||||
foreach my $iid ( keys %$ns_e_idx ) {
|
||||
my $index = $ns_e_idx->{$iid};
|
||||
my ( $grp, $idx, $pos ) = split( /\./, $iid );
|
||||
next unless defined $grp;
|
||||
if ( $grp == 8 ) {
|
||||
$ns_e_parent{$iid} = '0';
|
||||
}
|
||||
if ( $grp == 1 ) {
|
||||
if ($is_stack) {
|
||||
$ns_e_parent{$iid} = '0';
|
||||
}
|
||||
else {
|
||||
$ns_e_parent{$iid} = '080100';
|
||||
}
|
||||
}
|
||||
if ( $grp == 3 ) {
|
||||
my $enc = $ns_grp_enc->{$grp};
|
||||
if ( $idx % $enc ) {
|
||||
my $npos = ( $idx % $enc ) * $enc;
|
||||
my @parent = ( $grp, $npos, $pos );
|
||||
my $parent = join( '', map { sprintf "%02d", $_ } @parent );
|
||||
$ns_e_parent{$iid} = $parent;
|
||||
}
|
||||
elsif ($is_stack) {
|
||||
$ns_e_parent{$iid} = '010100';
|
||||
}
|
||||
elsif ( $is_virtual and !$is_stack ) {
|
||||
$ns_e_parent{$iid} = 0;
|
||||
}
|
||||
elsif ( $pos == 0 ) {
|
||||
$ns_e_parent{$iid} = '080100';
|
||||
}
|
||||
else {
|
||||
my $parent = $iid;
|
||||
$parent =~ s/\.\d+$/\.00/;
|
||||
$parent = join( '', map { sprintf "%02d", $_ } split /\./,
|
||||
$parent );
|
||||
$ns_e_parent{$iid} = $parent;
|
||||
}
|
||||
}
|
||||
next;
|
||||
}
|
||||
return \%ns_e_parent;
|
||||
}
|
||||
|
||||
sub munge_ns_grp_type {
|
||||
my $oid = shift;
|
||||
|
||||
my %e_class = (
|
||||
Sup => 'stack',
|
||||
Bkpl => 'backplane',
|
||||
Brd => 'module',
|
||||
Pwr => 'powerSupply',
|
||||
TmpSnr => 'sensor',
|
||||
Fan => 'fan',
|
||||
Clk => 'other',
|
||||
Unit => 'chassis',
|
||||
);
|
||||
|
||||
my $name = &SNMP::translateObj($oid);
|
||||
$name =~ s/s5ChasGrp//;
|
||||
if ( ( defined($name) ) and ( exists( $e_class{$name} ) ) ) {
|
||||
$name = $e_class{$name};
|
||||
}
|
||||
return $name if defined($name);
|
||||
return $oid;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::NortelStack - SNMP Interface to the Avaya/Nortel F<S5-AGENT-MIB>
|
||||
and F<S5-CHASSIS-MIB>
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $stack = 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 = $stack->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::NortelStack is a subclass of SNMP::Info that provides an interface
|
||||
to F<S5-AGENT-MIB> and F<S5-CHASSIS-MIB>. These MIBs are used across the
|
||||
Avaya/Nortel Stackable Ethernet Switches (BayStack), as well as, older Nortel
|
||||
devices such as the Centillion family of ATM switches.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<S5-AGENT-MIB>
|
||||
|
||||
=item F<S5-CHASSIS-MIB>
|
||||
|
||||
=item F<S5-ROOT-MIB> and F<S5-TCS-MIB> are required by the other MIBs.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBAL METHODS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $stack->os_ver()
|
||||
|
||||
Returns the software version extracted from (C<s5AgInfoVer>)
|
||||
|
||||
=item $stack->os_bin()
|
||||
|
||||
Returns the firmware version extracted from (C<s5AgInfoVer>)
|
||||
|
||||
=item $stack->serial()
|
||||
|
||||
Returns serial number of the chassis
|
||||
|
||||
(C<s5ChasSerNum>)
|
||||
|
||||
=item $stack->ns_ag_ver()
|
||||
|
||||
Returns the version of the agent in the form
|
||||
'major.minor.maintenance[letters]'.
|
||||
|
||||
(C<s5AgInfoVer>)
|
||||
|
||||
=item $stack->ns_op_mode()
|
||||
|
||||
Returns the stacking mode.
|
||||
|
||||
(C<s5AgSysCurrentOperationalMode>)
|
||||
|
||||
=item $stack->tftp_action()
|
||||
|
||||
This object is used to download or upload a config file or an image file.
|
||||
|
||||
(C<s5AgInfoFileAction>)
|
||||
|
||||
=item $stack->tftp_result()
|
||||
|
||||
Returns the status of the latest action as shown by $stack->tftp_action().
|
||||
|
||||
(C<s5AgInfoFileStatus>)
|
||||
|
||||
=item $stack->ns_auto_pvid()
|
||||
|
||||
Returns the value indicating whether adding a port as a member of a VLAN
|
||||
automatically results in its PVID being set to be the same as that VLAN ID.
|
||||
|
||||
(C<s5AgSysAutoPvid>)
|
||||
|
||||
=item $stack->tftp_file()
|
||||
|
||||
Name of the binary configuration file that will be downloaded/uploaded when
|
||||
the $stack->tftp_action() object is set.
|
||||
|
||||
(C<s5AgSysBinaryConfigFilename>)
|
||||
|
||||
=item $stack->tftp_host()
|
||||
|
||||
The IP address of the TFTP server for all TFTP operations.
|
||||
|
||||
(C<s5AgSysTftpServerAddress>)
|
||||
|
||||
=item $stack->vlan()
|
||||
|
||||
Returns the VLAN ID of the system's management VLAN.
|
||||
|
||||
(C<s5AgSysManagementVlanId>)
|
||||
|
||||
=item $stack->ch_ser()
|
||||
|
||||
Returns the serial number of the chassis.
|
||||
|
||||
(C<s5ChasSerNum>)
|
||||
|
||||
=item $stack->ns_cfg_chg()
|
||||
|
||||
Returns the total number of configuration changes (other than attachment
|
||||
changes, or physical additions or removals) in the chassis that have been
|
||||
detected since cold/warm start.
|
||||
|
||||
(C<s5ChasGblConfChngs>)
|
||||
|
||||
=item $stack->ns_cfg_time()
|
||||
|
||||
Returns the value of C<sysUpTime> when the last configuration change (other
|
||||
than attachment changes, or physical additions or removals) in the chassis
|
||||
was detected.
|
||||
|
||||
(C<s5ChasGblConfLstChng>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Agent Interface Table (C<s5AgMyIfTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $stack->i_cfg_file()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value: Name of the file
|
||||
|
||||
(C<s5AgMyIfCfgFname>)
|
||||
|
||||
=item $stack->i_cfg_host()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value: IP address of the load
|
||||
server
|
||||
|
||||
(C<s5AgMyIfLdSvrAddr>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Chassis Components Table (C<s5ChasComTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $stack->ns_com_grp_idx()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value: Index of the chassis
|
||||
level group which contains this component.
|
||||
|
||||
(C<s5ChasComGrpIndx>)
|
||||
|
||||
=item $stack->ns_com_idx()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value: Index of the component
|
||||
in the group. For modules in the 'board' group, this is the slot number.
|
||||
|
||||
(C<s5ChasComIndx>)
|
||||
|
||||
=item $stack->ns_com_sub_idx()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value: Index of the
|
||||
sub-component in the component.
|
||||
|
||||
(C<s5ChasComSubIndx>)
|
||||
|
||||
=item $stack->ns_com_type()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value: Type
|
||||
|
||||
(C<s5ChasComType>)
|
||||
|
||||
=item $stack->ns_com_descr()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value: Description
|
||||
|
||||
(C<s5ChasComDescr>)
|
||||
|
||||
=item $stack->ns_com_ver()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value: Version
|
||||
|
||||
(C<s5ChasComVer>)
|
||||
|
||||
=item $stack->ns_com_serial()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value: Serial Number
|
||||
|
||||
(C<s5ChasComSerNum>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Storage Area Table (C<s5ChasStoreTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $stack->ns_store_grp_idx()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value: Index of the chassis
|
||||
level group.
|
||||
|
||||
(C<s5ChasStoreGrpIndx>)
|
||||
|
||||
=item $stack->ns_store_idx()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value: Index of the group.
|
||||
|
||||
(C<s5ChasStoreComIndx>)
|
||||
|
||||
=item $stack->ns_store_sub_idx()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value: Index of the
|
||||
sub-component.
|
||||
|
||||
(C<s5ChasStoreSubIndx>)
|
||||
|
||||
=item $stack->ns_store_idx()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value: Index of the storage
|
||||
area.
|
||||
|
||||
(C<s5ChasStoreIndx>)
|
||||
|
||||
=item $stack->ns_store_type()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value: Type
|
||||
|
||||
(C<s5ChasStoreType>)
|
||||
|
||||
=item $stack->ns_store_size()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value: Size
|
||||
|
||||
(C<s5ChasStoreCurSize>)
|
||||
|
||||
=item $stack->ns_store_ver()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value: Version
|
||||
|
||||
(C<s5ChasStoreCntntVer>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Pseudo F<ENTITY-MIB> information
|
||||
|
||||
These methods emulate F<ENTITY-MIB> Physical Table methods using
|
||||
F<S5-CHASSIS-MIB>.
|
||||
|
||||
=over
|
||||
|
||||
=item $stack->ns_e_index()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Integer, Indices are combined
|
||||
into a six digit integer, each index is two digits padded with leading zero if
|
||||
required.
|
||||
|
||||
=item $stack->ns_e_class()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: General hardware type
|
||||
(C<s5ChasGrpDescr>).
|
||||
|
||||
Group is stripped from the string. Values may be Supervisory Module,
|
||||
Back Plane, Board, Power Supply, Sensor, Fan, Clock, Unit.
|
||||
|
||||
=item $stack->ns_e_descr()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Human friendly name
|
||||
|
||||
(C<s5ChasComDescr>)
|
||||
|
||||
=item $stack->ns_e_name()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Human friendly name
|
||||
|
||||
=item $stack->ns_e_hwver()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Hardware version
|
||||
|
||||
(C<s5ChasComVer>)
|
||||
|
||||
=item $stack->ns_e_vendor()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: avaya
|
||||
|
||||
=item $stack->ns_e_serial()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Serial number
|
||||
|
||||
(C<s5ChasComSerNum>)
|
||||
|
||||
=item $stack->ns_e_pos()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: The relative position among all
|
||||
entities sharing the same parent.
|
||||
|
||||
(C<s5ChasComSubIndx>)
|
||||
|
||||
=item $stack->ns_e_type()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Type of component/sub-component
|
||||
as defined under C<s5ChasComTypeVal> in F<S5-REG-MIB>.
|
||||
|
||||
=item $stack->ns_e_fwver()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Firmware revision.
|
||||
|
||||
Value of C<s5ChasStoreCntntVer> for entries with rom, boot, or firmware in
|
||||
C<s5ChasStoreType>.
|
||||
|
||||
=item $stack->ns_e_swver()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Software revision.
|
||||
|
||||
Value of C<s5ChasStoreCntntVer> for entries with "flash" in
|
||||
C<s5ChasStoreType>.
|
||||
|
||||
=item $stack->ns_e_parent()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: The value of ns_e_index() for the
|
||||
entity which 'contains' this entity. A value of zero indicates this entity
|
||||
is not contained in any other entity.
|
||||
|
||||
=back
|
||||
|
||||
=head1 Data Munging Callback Subroutines
|
||||
|
||||
=over
|
||||
|
||||
=item $stack->munge_ns_grp_type()
|
||||
|
||||
Munges C<s5ChasGrpType> into an C<ENTITY-MIB PhysicalClass> equivalent.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
255
Info/PowerEthernet.pm
Normal file
255
Info/PowerEthernet.pm
Normal file
@@ -0,0 +1,255 @@
|
||||
# SNMP::Info::PowerEthernet
|
||||
# $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::PowerEthernet;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::PowerEthernet::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::PowerEthernet::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '3.00_003';
|
||||
|
||||
%MIBS = ( 'POWER-ETHERNET-MIB' => 'pethPsePortDetectionStatus' );
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# parts of pethPsePortTable
|
||||
'peth_port_admin' => 'pethPsePortAdminEnable',
|
||||
'peth_port_status' => 'pethPsePortDetectionStatus',
|
||||
'peth_port_class' => 'pethPsePortPowerClassifications',
|
||||
|
||||
# pethMainPseTable
|
||||
'peth_power_watts' => 'pethMainPsePower',
|
||||
'peth_power_status' => 'pethMainPseOperStatus',
|
||||
'peth_power_consumption' => 'pethMainPseConsumptionPower',
|
||||
'peth_power_threshold' => 'pethMainPseUsageThreshold',
|
||||
);
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
# POWER-ETHERNET-MIB doesn't define a mapping of its
|
||||
# "module"/"port" index to ifIndex. Different vendors
|
||||
# do this in different ways. This is a poor fallback:
|
||||
# if all of the module values = 1, return the port number
|
||||
# on the assumption that port number = ifindex.
|
||||
# If there is a module != 1, this heuristic doesn't work
|
||||
# so returns undef.
|
||||
sub peth_port_ifindex {
|
||||
my $peth = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $peth_port_status = $peth->peth_port_status($partial);
|
||||
my $peth_port_ifindex;
|
||||
|
||||
foreach my $i ( keys %$peth_port_status ) {
|
||||
my ( $module, $port ) = split( /\./, $i );
|
||||
if ( $module != 1 ) {
|
||||
|
||||
# This heuristic won't work, so say that we got nothing.
|
||||
# If you have this case, you have to write a device-specific
|
||||
# version of this function.
|
||||
return;
|
||||
}
|
||||
$peth_port_ifindex->{$i} = $port;
|
||||
}
|
||||
return $peth_port_ifindex;
|
||||
}
|
||||
|
||||
# Subclasses are encouraged to override this method to report
|
||||
# what has actually been negotiated with the device, if a
|
||||
# protocol with more values (e.g., CDP) has been used.
|
||||
sub peth_port_neg_power {
|
||||
my $peth = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $peth_port_status = $peth->peth_port_status($partial);
|
||||
my $peth_port_class = $peth->peth_port_class($partial);
|
||||
|
||||
my $poemax = { 'class0' => 12950, 'class1' => 3840, 'class2' => 6490, 'class3' => 12950,
|
||||
'class4' => 25500 };
|
||||
|
||||
my $peth_port_neg_power = {};
|
||||
foreach my $i ( keys %$peth_port_status ) {
|
||||
if ($peth_port_status->{$i} eq 'deliveringPower') {
|
||||
$peth_port_neg_power->{$i} = $poemax->{ $peth_port_class->{$i} };
|
||||
}
|
||||
}
|
||||
return $peth_port_neg_power;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::PowerEthernet - SNMP Interface to data stored in
|
||||
F<POWER-ETHERNET-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
|
||||
|
||||
F<POWER-ETHERNET-MIB> is used to describe PoE (IEEE 802.3af)
|
||||
|
||||
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::PowerEthernet (...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
none.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<POWER-ETHERNET-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
|
||||
|
||||
Selected values from the C<pethPsePortTable>
|
||||
|
||||
=over
|
||||
|
||||
=item $poe->peth_port_admin()
|
||||
|
||||
Administrative status: is this port permitted to deliver power?
|
||||
|
||||
C<pethPsePortAdminEnable>
|
||||
|
||||
=item $poe->peth_port_status()
|
||||
|
||||
Current status: is this port delivering power, searching, disabled, etc?
|
||||
|
||||
C<pethPsePortDetectionStatus>
|
||||
|
||||
=item $poe->peth_port_class()
|
||||
|
||||
Device class: if status is delivering power, this represents the 802.3af
|
||||
class of the device being powered.
|
||||
|
||||
C<pethPsePortPowerClassifications>
|
||||
|
||||
=item $poe->peth_port_ifindex()
|
||||
|
||||
A mapping function from the C<pethPsePortTable> INDEX of
|
||||
module.port to an C<ifIndex>. The default mapping ignores the
|
||||
module (returning undef if there are any module values greater
|
||||
than 1) and returns the port number, assuming that there is a
|
||||
1:1 mapping.
|
||||
|
||||
This mapping is more or less left up to the device vendor to
|
||||
implement; the MIB gives only very weak guidance.
|
||||
A given device class may implement its own version
|
||||
of this function (e.g., see Info::CiscoPower).
|
||||
|
||||
=item $poe->peth_port_neg_power()
|
||||
|
||||
The power, in milliwatts, that has been committed to this port.
|
||||
This value is derived from the 802.3af class of the device being
|
||||
powered, but may be overridden by a subclass that has information
|
||||
from another source (e.g., if a different protocol, such as CDP,
|
||||
was used to negotiate the power level.)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Power Supply Table
|
||||
|
||||
=over
|
||||
|
||||
=item $poe->peth_power_watts()
|
||||
|
||||
The power supply's capacity, in watts.
|
||||
|
||||
C<pethMainPsePower>
|
||||
|
||||
=item $poe->peth_power_status()
|
||||
|
||||
The power supply's operational status.
|
||||
|
||||
C<pethMainPseOperStatus>
|
||||
|
||||
=item $poe->peth_power_consumption()
|
||||
|
||||
How much power, in watts, this power supply has been committed to
|
||||
deliver. (Note: certain devices seem to supply this value in milliwatts,
|
||||
so be cautious interpreting it.)
|
||||
|
||||
C<pethMainPseConsumptionPower>
|
||||
|
||||
=item $poe->peth_power_threshold()
|
||||
|
||||
The threshold (in percent) of consumption required to raise an
|
||||
alarm.
|
||||
|
||||
C<pethMainPseUsageThreshold>
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user