Compare commits
571 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5cf88ba3b7 | ||
|
|
f901ba5591 | ||
|
|
7deea96bc3 | ||
|
|
48dfb9bd08 | ||
|
|
85372559fa | ||
|
|
98972b80ef | ||
|
|
d950244232 | ||
|
|
fd898829c3 | ||
|
|
b0158628bb | ||
|
|
0f69a7b391 | ||
|
|
72773117e5 | ||
|
|
06806f5a6e | ||
|
|
a01c785ec8 | ||
|
|
502e206371 | ||
|
|
8fba1bc6a9 | ||
|
|
f43803d6d4 | ||
|
|
338cba6350 | ||
|
|
2a15066062 | ||
|
|
add86bc566 | ||
|
|
e9b4eaaeb9 | ||
|
|
07605051f5 | ||
|
|
998356484b | ||
|
|
e97617ad60 | ||
|
|
9685c3afa8 | ||
|
|
c209b9a72f | ||
|
|
4999b769ba | ||
|
|
d8b5ba2161 | ||
|
|
6f4a4a91cf | ||
|
|
0049f0d72e | ||
|
|
4ea66fc0fd | ||
|
|
8426620572 | ||
|
|
76aece0a3f | ||
|
|
508e7f77a0 | ||
|
|
d250a829cb | ||
|
|
2fada0c31c | ||
|
|
e6ad08733d | ||
|
|
a8d83b5e1c | ||
|
|
9392b74cbc | ||
|
|
e09624efd0 | ||
|
|
d4d7429de4 | ||
|
|
b97cef86a3 | ||
|
|
70615a172b | ||
|
|
d399ca90d3 | ||
|
|
bbc9695075 | ||
|
|
c8fceeb75b | ||
|
|
036cb4556e | ||
|
|
e7b06a0b06 | ||
|
|
c0067113e9 | ||
|
|
ce4349a188 | ||
|
|
224085dfca | ||
|
|
9b3262a5fe | ||
|
|
86856b6d54 | ||
|
|
d5bf08329e | ||
|
|
60efce8404 | ||
|
|
83164f456a | ||
|
|
c0141bcfee | ||
|
|
8dfe9ef1cf | ||
|
|
73d713b670 | ||
|
|
db6c3573c1 | ||
|
|
c8cbdaef8a | ||
|
|
2c7243b87d | ||
|
|
46515dd5d3 | ||
|
|
7eb799adc6 | ||
|
|
c85b61bbd0 | ||
|
|
045ff8b789 | ||
|
|
7b7f197439 | ||
|
|
9e1c462836 | ||
|
|
e97e8309cb | ||
|
|
8c5be1a47d | ||
|
|
afef2e6732 | ||
|
|
7b2051b55c | ||
|
|
8e470a2d72 | ||
|
|
35213d5cb2 | ||
|
|
b24f1a8ac4 | ||
|
|
5454ab577e | ||
|
|
046c15a074 | ||
|
|
ddb9dda894 | ||
|
|
d7047bda13 | ||
|
|
c7934f4d10 | ||
|
|
c97dc06177 | ||
|
|
76b1faa159 | ||
|
|
1e0438857e | ||
|
|
b6494effa6 | ||
|
|
a359184b83 | ||
|
|
ce50a3f627 | ||
|
|
ee7d254329 | ||
|
|
d674b22b39 | ||
|
|
47954aba8e | ||
|
|
09e18e9b64 | ||
|
|
163ba86196 | ||
|
|
e57e7d99d5 | ||
|
|
7ad449303b | ||
|
|
49b853de1a | ||
|
|
03a81ad4be | ||
|
|
eb046b6a61 | ||
|
|
1bf62f9524 | ||
|
|
9aca213a5f | ||
|
|
ce8bb68200 | ||
|
|
7ee562c5ac | ||
|
|
bdb719004d | ||
|
|
842ac96d48 | ||
|
|
5bb9011fb4 | ||
|
|
97564f50b8 | ||
|
|
efcf6a0db3 | ||
|
|
9e813784f7 | ||
|
|
aaca03062b | ||
|
|
c1242017e2 | ||
|
|
5f1426a0a3 | ||
|
|
e84225fb23 | ||
|
|
32c0e64bfb | ||
|
|
0793ff31f5 | ||
|
|
d3c2c1b607 | ||
|
|
893def7910 | ||
|
|
f875639435 | ||
|
|
70bb263d79 | ||
|
|
536d7d6901 | ||
|
|
6ea34316b0 | ||
|
|
aeebe5c95c | ||
|
|
eb62f95636 | ||
|
|
c7ee746fe6 | ||
|
|
9a062499b3 | ||
|
|
0c876452d8 | ||
|
|
3b6088f454 | ||
|
|
719f14984b | ||
|
|
2e480dbec5 | ||
|
|
66910c7827 | ||
|
|
0f5319bc52 | ||
|
|
cd54b07e09 | ||
|
|
b197e9739b | ||
|
|
8dd32c0dd7 | ||
|
|
08e049eb31 | ||
|
|
d09e4a125c | ||
|
|
8353db2bc4 | ||
|
|
250d2a0c0a | ||
|
|
46b3127bb5 | ||
|
|
f1e9e3423d | ||
|
|
158ee40f1b | ||
|
|
713d052b64 | ||
|
|
0e28436086 | ||
|
|
3f7229f4e7 | ||
|
|
1ae7f8c8a2 | ||
|
|
8e63954c3f | ||
|
|
0fbcd5f8b1 | ||
|
|
71f84d48dc | ||
|
|
867a635ab8 | ||
|
|
3d2c9ceaf5 | ||
|
|
47736b08ce | ||
|
|
3f49e5f8ef | ||
|
|
7c8575bfa5 | ||
|
|
102a7e10cc | ||
|
|
9148764d20 | ||
|
|
ce619415de | ||
|
|
745807007f | ||
|
|
e85b3f70aa | ||
|
|
edc0fe4fbe | ||
|
|
3cceec9044 | ||
|
|
18602855da | ||
|
|
72c223f72e | ||
|
|
c6b3c45412 | ||
|
|
c60a04f530 | ||
|
|
f7430ab1a6 | ||
|
|
827398228c | ||
|
|
a264bb36cb | ||
|
|
c24e63ec4c | ||
|
|
6519570839 | ||
|
|
2c88544158 | ||
|
|
d0722d3677 | ||
|
|
d2b404763b | ||
|
|
88fb9e4df3 | ||
|
|
440ec276d3 | ||
|
|
6e91b90c48 | ||
|
|
0bfc8c5ed6 | ||
|
|
63547c2ea1 | ||
|
|
efecf1bbb7 | ||
|
|
682b8c2a9c | ||
|
|
88295e8c1e | ||
|
|
6764f15fd0 | ||
|
|
8b8ee8693e | ||
|
|
fe89001166 | ||
|
|
416a18377c | ||
|
|
8fda38184c | ||
|
|
280e9260f7 | ||
|
|
22642c1095 | ||
|
|
d68b2047b0 | ||
|
|
7240f034e5 | ||
|
|
97ce41e363 | ||
|
|
31a8abc3b8 | ||
|
|
6b49bfd4c4 | ||
|
|
985b4aab3f | ||
|
|
a4e7c3a61a | ||
|
|
d82d8781c4 | ||
|
|
b4c3f92ba3 | ||
|
|
1c57d2eab8 | ||
|
|
409de77b2c | ||
|
|
3e22e24dc9 | ||
|
|
17b1bdacfe | ||
|
|
b570fdbc89 | ||
|
|
cceb0f4e5e | ||
|
|
04f8c7f7e2 | ||
|
|
37aca89af7 | ||
|
|
5445a496db | ||
|
|
0ab93b142c | ||
|
|
d39dc76949 | ||
|
|
c6abd7b62b | ||
|
|
0e572db832 | ||
|
|
602bb15b47 | ||
|
|
b4882285c4 | ||
|
|
834b27bdad | ||
|
|
7db148a5a1 | ||
|
|
9e332095a2 | ||
|
|
7bf950026b | ||
|
|
f246444d89 | ||
|
|
8e84aea1bf | ||
|
|
d6a7a944cc | ||
|
|
fb478d3c7b | ||
|
|
24f8a8fdba | ||
|
|
28bbe0ee19 | ||
|
|
c21ca2062e | ||
|
|
e3e289a27c | ||
|
|
9540f6b9d3 | ||
|
|
539943fb0f | ||
|
|
7a8ebffd40 | ||
|
|
3d48f4e210 | ||
|
|
667cdbea13 | ||
|
|
f5fb4dd3b0 | ||
|
|
5a2722d049 | ||
|
|
f3b6cfbd01 | ||
|
|
e239a6057c | ||
|
|
9b1c439e15 | ||
|
|
074f2e7c8f | ||
|
|
4b1533e925 | ||
|
|
6812a60668 | ||
|
|
6f0cb846f0 | ||
|
|
c79307692b | ||
|
|
08b2f50ac7 | ||
|
|
3577fa1e42 | ||
|
|
cb6630582a | ||
|
|
ca5fff31a7 | ||
|
|
69b1f1e29e | ||
|
|
4e2b642ed1 | ||
|
|
3c26ce2a55 | ||
|
|
7d2cf97c06 | ||
|
|
cfce6296fb | ||
|
|
1601703ff2 | ||
|
|
905ad3e2b7 | ||
|
|
15b7e95545 | ||
|
|
247f6f038d | ||
|
|
7c6df7cce3 | ||
|
|
1a92306d51 | ||
|
|
59e9fae1d5 | ||
|
|
998094241d | ||
|
|
d6c3313138 | ||
|
|
b7e252b91a | ||
|
|
6071beb15d | ||
|
|
cda830686d | ||
|
|
a29b888620 | ||
|
|
ae5a4d413d | ||
|
|
03c4d1e81f | ||
|
|
4efa0fd509 | ||
|
|
c3a727ce10 | ||
|
|
afa97d845b | ||
|
|
8671f65bfd | ||
|
|
37737a6494 | ||
|
|
0ce8a55b88 | ||
|
|
22dd49c1dc | ||
|
|
fd5812aefc | ||
|
|
f4e37cdabe | ||
|
|
5324760463 | ||
|
|
27120045d2 | ||
|
|
abfd93ea1b | ||
|
|
070d911c60 | ||
|
|
8b14776c9a | ||
|
|
2d62372c7f | ||
|
|
3eae0b9d5c | ||
|
|
9a722bb2f8 | ||
|
|
d3e39a4132 | ||
|
|
d82d495dcf | ||
|
|
198df7cee4 | ||
|
|
46cdb4c166 | ||
|
|
62005c52d2 | ||
|
|
ca7651628d | ||
|
|
6358b7ad70 | ||
|
|
8aca1d97c0 | ||
|
|
275a533843 | ||
|
|
21bd4c662d | ||
|
|
47d9d091d1 | ||
|
|
da2ea09e84 | ||
|
|
9c71bdbcef | ||
|
|
318f9518b1 | ||
|
|
19e9fb5f67 | ||
|
|
41833c1f29 | ||
|
|
4e2f950e41 | ||
|
|
ebe3f39ea1 | ||
|
|
c6521d0b48 | ||
|
|
74b5c9f0e3 | ||
|
|
4bfebe1563 | ||
|
|
2ac4e65827 | ||
|
|
b7a135db10 | ||
|
|
d4c460fd3d | ||
|
|
8f0ac35381 | ||
|
|
a9a3229c22 | ||
|
|
5da622ff88 | ||
|
|
32f33f5150 | ||
|
|
242013f3b0 | ||
|
|
e46deb505f | ||
|
|
5d443fd1be | ||
|
|
d53152858c | ||
|
|
aefb31fb58 | ||
|
|
0be8219b9c | ||
|
|
cbb8bc5d77 | ||
|
|
6969dcbfec | ||
|
|
9e463ddddf | ||
|
|
5ec034c475 | ||
|
|
1694e648fc | ||
|
|
16aa96ebf4 | ||
|
|
43d06e184d | ||
|
|
3ff432034a | ||
|
|
0325bb1f25 | ||
|
|
b9aebf7e9e | ||
|
|
e1e693a7c8 | ||
|
|
c8c548fe97 | ||
|
|
ddf971ed54 | ||
|
|
61e8f47986 | ||
|
|
3ce9f403e6 | ||
|
|
3741010044 | ||
|
|
badfb12243 | ||
|
|
0713a6457c | ||
|
|
9abe744dac | ||
|
|
b4974aeacd | ||
|
|
688a0de498 | ||
|
|
7cef8465fa | ||
|
|
532279d2b8 | ||
|
|
d67ffc3a6c | ||
|
|
c6776b1755 | ||
|
|
49566977ad | ||
|
|
daf512e33e | ||
|
|
74816fc043 | ||
|
|
c88e37e9b5 | ||
|
|
c1c448f3df | ||
|
|
4f168a538b | ||
|
|
d94630af35 | ||
|
|
999dd1f468 | ||
|
|
c3d5631c3c | ||
|
|
9dae6b20d7 | ||
|
|
4005640a2b | ||
|
|
ca446faacf | ||
|
|
240539bd24 | ||
|
|
08e335f39c | ||
|
|
a9cc14b265 | ||
|
|
9505f119b3 | ||
|
|
683edf1668 | ||
|
|
d9c52c1a88 | ||
|
|
0f1a76a564 | ||
|
|
15cd354bae | ||
|
|
91d67ed0ae | ||
|
|
0740a7bd5e | ||
|
|
84493a99b4 | ||
|
|
f730fa3325 | ||
|
|
4b1007cb66 | ||
|
|
436f7442b6 | ||
|
|
3af05ebba5 | ||
|
|
c7db0371aa | ||
|
|
53860aaa46 | ||
|
|
829a4bf16a | ||
|
|
a83bc1bcb2 | ||
|
|
af65bb3a2b | ||
|
|
f2d9f6be27 | ||
|
|
ecea4ef4a4 | ||
|
|
e4e099510a | ||
|
|
de28ff96c2 | ||
|
|
6692ddcf1f | ||
|
|
ba7a105eb1 | ||
|
|
b9fb232859 | ||
|
|
6f54cb429e | ||
|
|
ae3398b11a | ||
|
|
e97693d12d | ||
|
|
435bb7dbe2 | ||
|
|
70bc5e78e9 | ||
|
|
a163e5b82c | ||
|
|
5eb66fe442 | ||
|
|
b6cf462b16 | ||
|
|
ead15a1cde | ||
|
|
9c19c70029 | ||
|
|
0862047241 | ||
|
|
6cfce1916d | ||
|
|
1e37bfa8ce | ||
|
|
87197067a0 | ||
|
|
8264f68f6c | ||
|
|
3e21357e8d | ||
|
|
ee5953d743 | ||
|
|
46f941b416 | ||
|
|
225e12e979 | ||
|
|
912ba274a6 | ||
|
|
18f59db2b9 | ||
|
|
f0ca1a5fa3 | ||
|
|
446e5a13f7 | ||
|
|
e8a9d18445 | ||
|
|
6256f33079 | ||
|
|
b5c4bd99bf | ||
|
|
56dae91c8a | ||
|
|
0661b1307a | ||
|
|
cd112f4925 | ||
|
|
14bf6b84d3 | ||
|
|
5c22a29e40 | ||
|
|
f1806f227b | ||
|
|
025e7b72b5 | ||
|
|
97b398051f | ||
|
|
e21d8516fb | ||
|
|
2972c70177 | ||
|
|
50b4274f68 | ||
|
|
75dc93f2c0 | ||
|
|
73fd627815 | ||
|
|
9e84141983 | ||
|
|
bd6591db7b | ||
|
|
515e876491 | ||
|
|
6105046ae9 | ||
|
|
f0eb0a9ded | ||
|
|
a227db586b | ||
|
|
04eafd3e61 | ||
|
|
3b25711e1f | ||
|
|
63687b5f8f | ||
|
|
cac2224fa1 | ||
|
|
44da7544b7 | ||
|
|
13478343cd | ||
|
|
a7aeae0aa2 | ||
|
|
876fb9946b | ||
|
|
e5853962b5 | ||
|
|
3eaa2ae230 | ||
|
|
cd1acd023e | ||
|
|
e2a314b553 | ||
|
|
102a2a03e8 | ||
|
|
8be0f9e06f | ||
|
|
40239ea078 | ||
|
|
47032cbb4a | ||
|
|
11dbeb2741 | ||
|
|
5242d16e02 | ||
|
|
428c007543 | ||
|
|
d0fbfdea86 | ||
|
|
b3fb18eee6 | ||
|
|
7d470fd0e8 | ||
|
|
295e6fb283 | ||
|
|
9e545e8cf8 | ||
|
|
182589745f | ||
|
|
bdfc430564 | ||
|
|
2da37f06ea | ||
|
|
eb5a492eb9 | ||
|
|
e79f031cb7 | ||
|
|
86909ae236 | ||
|
|
69861e7660 | ||
|
|
5054b1b5b5 | ||
|
|
a2496a536d | ||
|
|
f4ebe6a102 | ||
|
|
b10b922aa0 | ||
|
|
a8673cc076 | ||
|
|
2dd1cdc281 | ||
|
|
ccd03ae6d2 | ||
|
|
7e0771e065 | ||
|
|
e9fd3731a9 | ||
|
|
a5f242c28f | ||
|
|
43d1718618 | ||
|
|
d64f0d4a5e | ||
|
|
4a13ee8991 | ||
|
|
8764916086 | ||
|
|
78b0b77e38 | ||
|
|
8a7376f6df | ||
|
|
c9a36f12e6 | ||
|
|
8199e2a973 | ||
|
|
e1f3fb3a44 | ||
|
|
52275e92af | ||
|
|
5d9eec0992 | ||
|
|
cd9c637ba5 | ||
|
|
0bc405792a | ||
|
|
8fb36625bc | ||
|
|
674eca23b9 | ||
|
|
cfc1ead848 | ||
|
|
c41ffdfd2d | ||
|
|
df4708383b | ||
|
|
497c81a0c6 | ||
|
|
2c2f4a9ea1 | ||
|
|
feffa6d47e | ||
|
|
3bb33fa8d4 | ||
|
|
30a73c035a | ||
|
|
5c44fc0b28 | ||
|
|
a54b446dae | ||
|
|
631010ed3f | ||
|
|
8506638e5c | ||
|
|
c0f3a8eb2b | ||
|
|
662d870ad7 | ||
|
|
08746d6b10 | ||
|
|
bc8c8a6061 | ||
|
|
d09e5de229 | ||
|
|
1df1bda641 | ||
|
|
e8612e3779 | ||
|
|
a58d060310 | ||
|
|
a77c539f38 | ||
|
|
b5107b5634 | ||
|
|
6c880bb7b3 | ||
|
|
9297c70d11 | ||
|
|
bfafdc99d9 | ||
|
|
ab111a8e93 | ||
|
|
c2ce3d81e1 | ||
|
|
fb9813af51 | ||
|
|
4fb63d8a7b | ||
|
|
77982188bd | ||
|
|
8748932460 | ||
|
|
6c88df1ac0 | ||
|
|
cacb0777b7 | ||
|
|
bdf5a80868 | ||
|
|
ad1f1933e2 | ||
|
|
d7fe49a028 | ||
|
|
e802ccdc6e | ||
|
|
af2a881142 | ||
|
|
0ccf5409ca | ||
|
|
2529305803 | ||
|
|
bb8fb9d01a | ||
|
|
665f33a482 | ||
|
|
e5f948acda | ||
|
|
c28bbd5728 | ||
|
|
262fa5a3cd | ||
|
|
a58b774443 | ||
|
|
6deceb6bd1 | ||
|
|
808d3fd5c6 | ||
|
|
b82d3b82d9 | ||
|
|
cb8d780d70 | ||
|
|
01cd78c75d | ||
|
|
e7b289c399 | ||
|
|
a9b28c2270 | ||
|
|
5b059e6286 | ||
|
|
2c84636b7f | ||
|
|
2aba8dd8f1 | ||
|
|
41d68936b0 | ||
|
|
cb750624f9 | ||
|
|
bf3a37195b | ||
|
|
1e37f80368 | ||
|
|
5f9c2d3e62 | ||
|
|
c88449151e | ||
|
|
9c4f031581 | ||
|
|
3cac59adf4 | ||
|
|
77bcf720d3 | ||
|
|
e6b4c607e0 | ||
|
|
cbeb41c728 | ||
|
|
101aaa0a68 | ||
|
|
2233511fad | ||
|
|
8efa868ca3 | ||
|
|
e738d502ef | ||
|
|
2a7d5b51d9 | ||
|
|
67c4f160aa | ||
|
|
6d87313283 | ||
|
|
98e07690be | ||
|
|
c0bc769be9 | ||
|
|
01d9b0f291 | ||
|
|
2539692016 | ||
|
|
3a3fc548ca | ||
|
|
84d6cd18fb | ||
|
|
2d7b94e5a7 | ||
|
|
98eceb7c57 | ||
|
|
be92ec0379 | ||
|
|
34d4ec66a3 | ||
|
|
35c8ed6038 | ||
|
|
dd10a88ee2 | ||
|
|
71f0947988 | ||
|
|
d7cd3ff9e7 | ||
|
|
2567d6a5c9 | ||
|
|
5831d9e4ae | ||
|
|
690bc6bfa0 | ||
|
|
5f0e73bcb4 | ||
|
|
b1a7b67ae7 | ||
|
|
f0539d51ff | ||
|
|
1af34e3e25 | ||
|
|
0510dbfafc | ||
|
|
ca35689475 |
9
.gitignore
vendored
Normal file
9
.gitignore
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
*.db
|
||||
SNMP
|
||||
*.komodo*
|
||||
blib/
|
||||
META.*
|
||||
MYMETA.*
|
||||
Makefile
|
||||
Makefile.old
|
||||
pm_to_blib
|
||||
@@ -1,5 +1,5 @@
|
||||
All code from version 0.7 on
|
||||
Copyright (c) 2003,2004 Max Baker
|
||||
Copyright (c) 2003-2016 Max Baker and SNMP::Info Developers
|
||||
All rights reserved.
|
||||
|
||||
Original Code
|
||||
|
||||
683
ChangeLog
683
ChangeLog
@@ -1,12 +1,655 @@
|
||||
SNMP::Info - Friendly OO-style interface to Network devices using SNMP.
|
||||
ChangeLog $Id$
|
||||
|
||||
version 3.33 (2016-04-27)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Move author-only tests to xt directory so they aren't run on installation
|
||||
by users
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Correct device serial number reporting for Cisco Nexus 5k switches with
|
||||
software version >= 7
|
||||
|
||||
version 3.32 (2016-04-26)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Add 200 Mbps and 2.0 Gbps aliases to SPEED_MAP
|
||||
* Add Palo Alto support
|
||||
* Add VMware support
|
||||
* Support for propMultiplexor as ifType
|
||||
* Add device MAC to APC UPS
|
||||
* [#61] Report APC model for PDU products
|
||||
* Removed DeviceMatrix from the distribution
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Support undefined (noSuchInstance) values in Offline mode
|
||||
* Do not init table cache if Cache provided by user
|
||||
* Avoid deep recusion when AUTOLOAD and carp collide
|
||||
* Detect Cisco VG350s as L3 devices instead of APs
|
||||
* fix for 'Use of inherited AUTOLOAD for non-method SNMP::Info::Layer2::HP::agg_ports_ifstack() is deprecated'
|
||||
* Workaround in IPv6.pm to deal with possibly incorrect IPV6-MIB implementations
|
||||
* [#71] AUTOLOAD typo-catcher search for SNMP::Info no longer anchored
|
||||
* [#70] Respect version/comm/secname on passed Session obj
|
||||
|
||||
version 3.31 (2016-01-22)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Support for CiscoSB OS and Version (D. Tuecks)
|
||||
* SONMP support for Enhanced Topology Table
|
||||
* Add support for channelized interfaces in L3::Passport
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Correct link to MIB tarball
|
||||
|
||||
version 3.30 (2015-11-16)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* RT #106254: Add new sysObjectID mapping for Ubiquiti
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Correct link to MIB tarball
|
||||
* Correct port indexing of newer VSP 4K and 8K in L3::Passport
|
||||
* Statistics in the sysIfxStatTable are 64-bit counters, so they should
|
||||
override the 64-bit methods.
|
||||
|
||||
version 3.29 (2015-10-13)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Add IPv6::ipv6_addr() method to map IPv6 interface address indexes to actual addresses
|
||||
* Add support for (remote) IPv6 addresses to LLDP::lldp_addr()
|
||||
* Add LLDP::lldp_ipv6() and LLDP::lldp_mac() so that remote management
|
||||
addresses of specific types can be requested
|
||||
|
||||
version 3.28 (2015-06-18)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Add Layer3::Huawei class for Huawei Quidway switches
|
||||
* Modified generic Layer3::Cisco class: use community based indexing if
|
||||
the device returns a value for vtpVersion
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Correct port indexing of VSP 4K in L3::Passport
|
||||
|
||||
version 3.27 (2015-05-05)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Cisco Aironet PSU information
|
||||
* Only log adding mibdirs at debug level 2
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* [#221] Drop Cisco Voice VLAN 4096
|
||||
|
||||
version 3.26 (2015-03-07)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Add fan and psu reporting to Layer3::Dell
|
||||
* Include Voice VLANs in (tagged) VLAN Membership on Cisco devices
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Fix typo in MRO::print_superclasses
|
||||
|
||||
version 3.25 (2015-02-25)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Add new model name mappings for to Layer2::HP
|
||||
|
||||
version 3.24 (2015-02-04)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Support RSTP and ieee8021d STP operating modes in RapidCity
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Fix single instance leafs defined in %FUNCS to behave like table leafs
|
||||
* Fix incorrect FDB ID to VLAN ID mapping in Bridge and L3:Enterasys
|
||||
|
||||
version 3.23 (2014-12-09)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Update MIB used in L1::Asante
|
||||
* Enhanced STP support for L3::Extreme
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Fix Cisco VLAN membership issue introduced in 3.22 related to capturing
|
||||
port VLANs on Cisco interfaces which are configured for trunking but
|
||||
are not in operational trunking mode
|
||||
|
||||
version 3.22 (2014-12-02)
|
||||
|
||||
[NEW FEATURES]
|
||||
|
||||
* Support obtaining FDB in Avaya SPBM edge deployments in L2::Baystack
|
||||
NOTE: This requires a RAPID-CITY MIB with the rcBridgeSpbmMacTable
|
||||
* Support for Fortinet devices in new class L3::Fortinet
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Include LLDP support in base Layer2 and Layer3 classes. Due to the
|
||||
widespread adoption of LLDP, this should improve mapping networks
|
||||
when devices aren't supported in a more specific class.
|
||||
* No longer ignore interfaces based on name, in base L2/L3/L7 device
|
||||
classes. For several device classes SNMP::Info will now return tunnel
|
||||
interfaces and/or loopbacks, if present.
|
||||
* Use dot1qVlanCurrentTable if available to capture dynamic and static
|
||||
VLANs, fall back to dot1qVlanStaticTable if not available.
|
||||
* New method i_vlan_membership_untagged() for VLANs transmitted as
|
||||
untagged frames.
|
||||
* Capture Aruba AP hardware and software version when available
|
||||
* New STP methods to support gathering information from devices running
|
||||
mutiple STP instances such as PVST and MST
|
||||
* Enhanced STP support for Avaya and Foundry classes
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* [#64] Misdetection: Wireless APs, add products MIB to L2::3Com
|
||||
* Use FDB ID to VID mapping if available to determine end station VLAN
|
||||
rather than assuming they are the same.
|
||||
* Capture port VLANs on Cisco interfaces which are configured for
|
||||
trunking but are not in operational trunking mode
|
||||
* Correct munging of stp_p_port(), i_stp_port(), and stp_root() methods
|
||||
in Bridge
|
||||
* In LLDP.pm don't create a variable in a conditional
|
||||
|
||||
version 3.20 (2014-09-08)
|
||||
|
||||
[NEW FEATURES]
|
||||
|
||||
* Override layers in Juniper for routers with switch modules
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Update MANIFEST to include Ubiquiti files
|
||||
|
||||
version 3.19 (2014-08-01)
|
||||
|
||||
[NEW FEATURES]
|
||||
|
||||
* Support for Ubiquiti Access Points in new class L2::Ubiquiti (begemot)
|
||||
* Preliminary support for 3Com switches in new class L2::3Com (begemot)
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Fix Avaya detection lldp_port()
|
||||
* Silence uninitialized value warning in L3::Cisco
|
||||
* H3C fixes (begemot)
|
||||
* Only use L2::ZyXEL_DSLAM for ZyXEL DSL modules
|
||||
|
||||
version 3.18 (2014-07-02)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Pseudo ENTITY-MIB methods added to L3::Tasman for hardware information
|
||||
* Capture VPC Keepalive IP addresses in L3::Nexus (jeroenvi)
|
||||
* L2::Netgear inheritance clean up and removal of unnecessary c_* methods
|
||||
defined in Info base class
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Correctly identify device type (class) for instantiated objects which
|
||||
have overridden layers.
|
||||
* [#58] Fix inheritance in L3::FWSM and L3::CiscoASA
|
||||
* [#71] Don't try to match on a false port description in lldp_if
|
||||
* [#54] Possible bad values returned for cdp_id and lldp_port with some HP
|
||||
gear (Joel Leonhardt)
|
||||
|
||||
version 3.17 (2014-06-23)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* POD tests are not required for distribution.
|
||||
|
||||
version 3.16 (2014-06-23)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Add method resolution discovery in SNMP::Info::MRO helper module
|
||||
* Consolidate CiscoImage class into CiscoStats class
|
||||
* Clean up inheritance for Cisco classes. With this change
|
||||
all applicable classes now inherit CiscoAgg, CiscoStpExtensions,
|
||||
CiscoPortSecurity, CiscoPower, and LLDP classes.
|
||||
* Remove inheritance of classes the devices do not support in L3::FWSM
|
||||
and L3::CiscoASA
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Use CiscoVTP methods to get interface VLAN in L3::Cisco rather than
|
||||
solely relying on the interface description.
|
||||
|
||||
version 3.15 (2014-07-10)
|
||||
|
||||
[NEW FEATURES]
|
||||
|
||||
* Offline mode and Cache export/priming.
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Return serial number for Cisco 3850 from entPhysicalSerialNum
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Cisco SB serial number probably did not work
|
||||
|
||||
version 3.14 (2014-06-07)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Improvements to Mikrotik module (Alex Z)
|
||||
* Don't unshift length from broken lldpRemManAddrTable implementations (G. Shtern)
|
||||
* 802.3ad LAG support in Layer3::H3C
|
||||
* Add LLDP capabilities to Layer2::HPVC class
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Return correct VLAN info with qb_fw_table() on Layer2::HP
|
||||
|
||||
version 3.13 (2014-03-27)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Cisco PAgP support added to LAG method
|
||||
* HP ProCurve LAG support by inheriting Info::Aggregate class
|
||||
|
||||
version 3.12 (2014-02-10)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Modify L3::Passport to obtain forwarding table information from
|
||||
RAPID-CITY if information is not available in either Q-BRIDGE-MIB or
|
||||
BRIDGE-MIB. Needed for VSP 9000 prior to version 4.x (Tobias Gerlach)
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* [#52] NETSCREEN-IP-ARP-MIB considered harmful
|
||||
* Foundry/Brocade aggreate port master ifIndex resolved properly
|
||||
|
||||
version 3.11 (2014-01-26)
|
||||
|
||||
[NEW FEATURES]
|
||||
|
||||
* [#31] port-channel (aggregate) support. Aggregate support added in new
|
||||
agg_ports() method. Inital support added for Arista (ifStack),
|
||||
Avaya (MLT), Brocade (MST), and Cisco (802.3ad).
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Use Q-BRIDGE-MIB as default with fallback to BRIDGE-MIB across all
|
||||
classes for the fw_mac, fw_port, and fw_status methods
|
||||
* Additional support for Avaya 8800 series in L3::Passport
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Modify cdp_cap() to handle devices which return space delimited strings
|
||||
for cdpCacheCapabilities rather than hex strings
|
||||
* [#51] Netdisco shows broken topology for devices with no alias entry
|
||||
for primary IP - Collect nsIfMngIp when getting IP interfaces in
|
||||
L3::Netscreen
|
||||
* Fix Extreme XOS i_vlan_membership - Revert [28bbe0], fix bug with
|
||||
untagged being added to @ret twice (Robert Kerr)
|
||||
* Skip default CPU management addresses on VSP and 8800/8600 series in
|
||||
L3::Passport to prevent erroneous duplicate addresses
|
||||
|
||||
version 3.10 (2013-12-16)
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Data values of zero are now sent to munge method instead of skipped
|
||||
|
||||
version 3.09 (2013-12-15)
|
||||
|
||||
[NEW FEATURES]
|
||||
|
||||
* [#45] IBM (Blade Network Technologies) Rackswitch support in new class
|
||||
L3::IBMGbTor
|
||||
* [] set_i_untagged combines both set_i_vlan and set_i_pvid in one method
|
||||
* [#41] Riverbed Steelhead support added in new class L3::Steelhead
|
||||
* New c_cap(), cdp_cap(), and lldp_cap() methods which return a hash of
|
||||
arrays with each array containing the system capabilities reported as
|
||||
supported by the remote system via CDP or LLDP.
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Remove "Switch" from model name in L3::Foundry
|
||||
* [#49] IOS-XR support, add identification of IOS XR and version in
|
||||
CiscoStats
|
||||
* Aruba POE Support
|
||||
* Aruba utilizes Q-BRIDGE-MIB when available for VLAN information to
|
||||
better support wired switches
|
||||
* Add lldp_platform() method which uses lldp_rem_sysdesc() or
|
||||
lldp_rem_sysname() to provide a clue to type of remote LLDP capable
|
||||
device.
|
||||
* [RT#78232] Extend cdpCacheCapabilities to show more CDP bits
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Modify _xos_i_vlan_membership() in L3::Extreme to only include tagged
|
||||
ports
|
||||
* When determining the BSSID in Airespace there is only one hexadecimal
|
||||
digit available so skip if outside the range of 1-16, 17 is reserved
|
||||
for 3rd party AP's
|
||||
* Don't assume entity index 1 is the chassis and has serial in Layer3
|
||||
* Capture serial number on newer Aruba devices
|
||||
* munge_bits() correctly unpacks BITS
|
||||
* Fix for single instance table leafs in test_class_mocked.pl
|
||||
* Fix power module indexing
|
||||
|
||||
version 3.08 (2013-10-22)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Rewrite of L3::Aruba, now supports pseudo ENTITY-MIB methods to gather
|
||||
module information, more interface information for APs, more
|
||||
wireless information to include client stats, and arpnip information
|
||||
from wireless clients. WARNING: AP device interfaces are now based on
|
||||
AP MAC and radio versus BSSID to align with other wireless classes.
|
||||
* [#64] Add i_speed_admin() to L2::2900 (psychiatric)
|
||||
* [#66] Support for VSS via CISCO-VIRTUAL-SWITCH-MIB in L3::6500
|
||||
* [#67] Add the possibility to set speed for Layer3::C4000 (psychiatric)
|
||||
* [#69] set speed and duplex on Cisco VSS system (psychiatric)
|
||||
* munge_null() now removes all non-printable control characters
|
||||
* Support Aironet standalone access points (Layer2::Aironet) running IOS15
|
||||
* lldp_port() returns port ID instead of port description if the port ID
|
||||
subtype is "interface name". This improves the ability to correlate
|
||||
ports by name when a port description is also set.
|
||||
* Add docs note about make_snmpdata.pl under EXTENDING SNMP::Info
|
||||
* [#46] Brocade (Foundry) Module Support
|
||||
* Brocade (Foundry) POE Support
|
||||
* Support peth_port_power() power supplied by PoE ports in L2::Baystack
|
||||
* Update test_class.pl utility to allow ignore of snmp.conf and test
|
||||
summarize more standard class methods
|
||||
* On EOS, the LLDP port ID is a dot1d port
|
||||
* Use LLDP in Layer3::Aruba, for switches
|
||||
* Clean up more model names in L2::Baystack
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* [#68] Fix device_port entries for switches with non-unique
|
||||
ifDesc (Nic Bernstein)
|
||||
* Don't try to munge undef values
|
||||
* [#49] Perl 5.18 UNIVERSAL::can change could cause infinite loop
|
||||
* Silence warning from uninitialized variable in L3::Passport e_descr()
|
||||
|
||||
version 3.07 (2013-10-01)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Support for Pica8 switches in L3::Pica8
|
||||
* Factor out cache/munge code from global/attr methods
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* [#48] Switch duplicate J9624A for J9626A in Layer2/HP (R. Kerr)
|
||||
* Correct device serial number reporting for Nexus devices
|
||||
* Override ipAddrTable methods in L3::Nexus as some versions do not
|
||||
index the table with the IPv4 address in accordance with the MIB
|
||||
definition.
|
||||
|
||||
version 3.05 (2013-08-16)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* [#47] Add model info on HP 2530 and HP 2920 series
|
||||
* Add support for Cisco Small Business series
|
||||
Layer2/CiscoSB class
|
||||
* Add proper LLDP support to Netgear.pm
|
||||
* Change $netgear->interfaces() to use ifName rather than ifDescr
|
||||
as the former is unique per interface while the latter is not.
|
||||
If ifName is not present, concatenate ifDescr and ifIndex
|
||||
to achieve a unique value.
|
||||
* Properly report hardware version, Serial No. and OS Version for
|
||||
Netgear.
|
||||
|
||||
version 3.03 (2013-07-11)
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Add missing =back to POD (A. Hartmaier)
|
||||
|
||||
version 3.02 (2013-07-08)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Properly pull os_ver from Netgear GS series switches.
|
||||
* Support Alcatel devices with layer3 features.
|
||||
* Identify Cisco Aironet 1140 APs as Layer2::Aironet
|
||||
* LAN switch support added to Layer3::Aruba class
|
||||
* [RT#86725] - Identify Cisco Catalyst 3850 as Layer3::C6500 (C. Causer)
|
||||
|
||||
version 3.01 (2013-04-13)
|
||||
|
||||
[API Changes]
|
||||
|
||||
* The methods c_ip(), c_if(), c_port(), c_id(), and c_platform() now
|
||||
represent common topology methods and will try to return a combined
|
||||
hash of data from all L2 topology protocols either running on the
|
||||
device or specified in the method call. The topology specific methods
|
||||
have been been prefixed with the protocol name in lowercase so that
|
||||
they can be called directly, sonmp_ip(), cdp_ip(), etc.
|
||||
* L2::Bay and L2::Foundry have been removed from the distribution. Both
|
||||
classes were depreciated and all functionality is available through
|
||||
L2::Baystack and L3::Foundry.
|
||||
|
||||
[NEW FEATURES]
|
||||
|
||||
* [3160037] - Support _raw suffix on methods to skip munging
|
||||
* [3185391] - Support for F5 devices in new class L3::F5
|
||||
* [3323814] - Arp support for Netscreen (David Baldwin)
|
||||
* [3323821] - Support for Netscreen w/ WLAN (eg SSG5) (David Baldwin)
|
||||
* [3599277] - Q-BRIDGE Support to collect VLAN in macsuck
|
||||
* [3033731] - Alcatel-Lucent OmniSwich AMAP Support in new AMAP class
|
||||
* [3598896] - Lantronix device support (J R Binks)
|
||||
* [3598337] - Lantronix SLC support
|
||||
* Support for Cisco ASA in L3::CiscoASA (Kraus/Hartmaier/Bernstein)
|
||||
* Support for Avaya VSP 9000 series in L3::Passport
|
||||
* Support for Avaya VSP 7000 series in L2::Baystack
|
||||
* Support Avaya (Trapeze) Wireless Controllers in new class L2::NWSS2300
|
||||
* Support Juniper (Trapeze) Wireless Controllers in new class L2::Trapeze
|
||||
* Support for newer Radware Alteon ADC switches 4408/4416/5412/5224 and
|
||||
older AWS 2000/3000 series in existing L3::AlteonAD
|
||||
* Support for H3C & HP A-series in new class L3::H3C
|
||||
* Support for Citrix Netscaler appliances in new class L7::Netscaler
|
||||
* New configuration option IgnoreNetSNMPConf will ignore Net-SNMP
|
||||
configuration files on object initialization
|
||||
* Two new utilities added in t/util to assist in developing device
|
||||
support; make_snmpdata.pl gathers SNMP data (snmpwalk) in a format that
|
||||
can be used with test_class_mocked.pl which mocks an SNMP agent to
|
||||
enable testing with no network access to a device.
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* UNIVERSAL::can() now works with dynamic methods
|
||||
* Dynamically generated methods are added to symbol table to avoid
|
||||
AUTOLOAD on subsequent calls
|
||||
* L2::Airespace now supports 802.11n client tx rates
|
||||
* L2::Airespace now reports AP Ethernet MAC as port MAC for radio ports
|
||||
* CiscoStats improvements to determine os versions, eg IOS XE ver on Sup7L-E
|
||||
* CiscoStats now reports 'ios-xe' if the device runs IOS XE (used to be 'ios')
|
||||
* Improved support of XOS based Extreme devices
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* [3564920] - lldp_if gives wrong data for Enterasys
|
||||
|
||||
version 2.11 (2012-12-09)
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Add fall-back for sysDescr on Force10
|
||||
|
||||
version 2.10 (2012-12-08)
|
||||
|
||||
[NEW FEATURES]
|
||||
|
||||
* Support for Force10 devices (W. Bulley)
|
||||
|
||||
version 2.09 (2012-11-28)
|
||||
|
||||
[NEW FEATURES]
|
||||
|
||||
* New method i_ssidmac() to get BSSID's from AP's with initial support
|
||||
in L2::Aironet and Airespace classes
|
||||
* Support for Avaya Secure Routers in new class L3::Tasman
|
||||
* Add EDP and LLDP L2 Topology to L3::Extreme
|
||||
* [3185393] Support for Juniper SSL VPN in new class L7::Neoteris
|
||||
* [3381027] Support for Cisco Nexus in new class L3::Nexus
|
||||
* [1424336] Support for Extreme Discovery Protocol (EDP)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* [3017571] Add LLDP support for NetSNMP device class (begemot)
|
||||
* [3418918] Extreme devices now report OS as either extremeware or xos
|
||||
* [2809045] Strip preceding netscreen from model name in L3::Netscreen
|
||||
* [] Classify Linksys 2024 as L3::Dell (Rogier Krieger)
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Fixed logic to return cached data for table methods when available and
|
||||
not a partial fetch
|
||||
* Fix typo in PoD for Bridge.pm and CiscoConfig.pm (William Bulley)
|
||||
* Fix/improve IPv6 neighbor cache handling, especially for Cisco Nexus
|
||||
|
||||
version 2.08 (2012-07-15)
|
||||
|
||||
[NEW FEATURES]
|
||||
|
||||
* Basic support for APC UPS devices
|
||||
* [2993691] Support for SonicWALL devices in new class L3::SonicWALL (phishphreek)
|
||||
* [2996795] Support for Kentrox devices in new class L2::Kentrox (phishphreek)
|
||||
* [] Basic support for Blue Coat proxy devices in new class L3::BlueCoatSG (jeroenvi)
|
||||
* [] Support Cisco 6500 / Sup2T in L3::C6500 class (jeroenvi)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Pseudo ENTITY-MIB methods added to L3::Juniper for hardware information
|
||||
* Add method to report current transmit power of the radio interface,
|
||||
dot11_cur_tx_pwr_mw(), in Airespace class
|
||||
* [3085411] Activate L3 properties for Netgear GSM7224v2 (phishphreek)
|
||||
* [3085413] SNMP OIDs for Netgear Serial and OS Ver (phishphreek)
|
||||
* [3286549] Dell LLDP Support (Nico Giefing)
|
||||
* [3469527] Netgear LLDP Support (Nic Bernstein)
|
||||
* [3472052] moduleSerialNumber support for Cisco Stack (Slava)
|
||||
* [3523320] Better VLAN support in Juniper class (Web Bulley)
|
||||
* [3532261] LLDP support in C6500 and related (Carlos Vicente)
|
||||
* [3538949] Updated switch models in L2::HP (jeroenvi)
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Get OS version for Juniper devices not reporting in sysDescr
|
||||
* Correct base MAC reporting for Juniper devices
|
||||
* Correct reporting of SSID broadcast status in Airespace class
|
||||
* [3541442] Change L2::Catalyst port names to what is reported in CDP
|
||||
* [2132349] Add an additional check to get Foundry OS version
|
||||
* [2929883] [3413999] LLDP interface mapping issue
|
||||
* [3297786] LLDP TimeMark component defaults to zero (David Baldwin)
|
||||
* [2988163] Detect Juniper SSG firewalls as Layer3::Netscreen (R. Kerr)
|
||||
* [3317739] Fix for Baystack without POE on stack member 1 (David Baldwin)
|
||||
* [2037444] os_ver fails on some Extreme versions (Robert Kerr)
|
||||
* [2980789] Fix root_ip to try OSPF RouterID first (Brian De Wolf)
|
||||
* [2986858] Fix the patch from this ticket (Oliver Gorwits)
|
||||
* [3136084] Rename Allied Telesyn to Allied Telesis (Oliver Gorwits)
|
||||
* [3268104] CiscoVTP.pm i_vlan_membership() array bounds (Michael Sanderson)
|
||||
* [3497004] Clarify POD description of default values (a2w)
|
||||
* [3502533] Layer2/Baystack interface indexes > 513 (Robert Nyqvist)
|
||||
|
||||
version 2.06 (2011-09-28)
|
||||
|
||||
[NEW FEATURES]
|
||||
|
||||
* Support for PacketFront devices in new class L3::PacketFront
|
||||
* Support for Mikrotik devices in new class L3::Mikrotik
|
||||
* Support for HP VirtualConnect switches in new class L2::HPVC
|
||||
* Support for ADSL-LINE-MIB in new class AdslLine
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* POD clarification on i_speed() munging by Info.pm
|
||||
* Added i_stack_status method that can be used for finding the parent
|
||||
interface for e.g. ADSL interface speed determination
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* [3344843] Fix returning serial() and os_ver() for web-managable HP
|
||||
switches, introduced by HP/HP4000 class split, reported by J R Binks
|
||||
* [2809033] Put L2-only Cisco blade switches in L3::C6500
|
||||
* [3408506] Fix uninitialized value in IPv6 when neighbor state is
|
||||
incomplete (Michael Borgelt)
|
||||
|
||||
version 2.05 (2011-06-23)
|
||||
+ Fix broken function call in L2::Aironet
|
||||
+ Promote L2::Aruba to L3::Aruba, as Aruba devices can be L3 entities and
|
||||
provide L3 information.
|
||||
|
||||
version 2.04 (2011-03-31)
|
||||
+ Support for older HP switch models moved to new L2::HP4000 class
|
||||
+ Fix VLAN changing in L2::HP and L2::HP4000 classes
|
||||
* Updated model lists in HP classes
|
||||
+ [2980782] Added L3::CiscoFWSM for Cisco Firewall Services Modules
|
||||
(Brian De Wolf)
|
||||
+ Added L3::Pf for FreeBSD PFSense Firewalls (max)
|
||||
* Added specific functions for neighbor mgmt addresses to CDP class
|
||||
* Implemented os_bin() method in CiscoStats
|
||||
+ [2980787] Fix for C1900 bp_index not containing interfaces.
|
||||
(Brian De Wolf)
|
||||
+ [2599795] Added vendor_i_type() method to HP and HP4000 clases
|
||||
+ [2688801] Minor modification for obscure Proxim/Orinoco device
|
||||
(jrbinks)
|
||||
+ [3051443] Add PoE measured power per port to Cisco, Extrme and HP
|
||||
classes (jeroenvi)
|
||||
* Minor tweaks to support devices without sysServices
|
||||
* Added Cisco CBS3xxx blade switches to L3::C6500
|
||||
* Fix for FWSMs not being detected properly. Special thanks goes to
|
||||
Jukka Pirhonen for pointing it out. (Brian De Wolf)
|
||||
+ Added support for IPv6 to physical address mapping
|
||||
* Added ME340x to L3::C3550
|
||||
* Added new ProCurve models to HP class
|
||||
* Fixed i_speed_raw not returning raw values (Alexander Hartmaier)
|
||||
|
||||
version 2.01 (06/12/09)
|
||||
+ Added CiscoStpExtensions Class (Carlos Vicente)
|
||||
+ Added Layer3::Arista (fenner)
|
||||
+ [2020353] Added L3::Altiga for Cisco (Altiga) VPN3000 Concentrators
|
||||
(Jeroen van Ingen)
|
||||
|
||||
* Fixed RFC1213-MIB vs IF-MIB collision in ifOperStatus
|
||||
* Updated test_class.pl for better debug info and relative path
|
||||
* Add cisco vendor detection by OID in Layer3.pm (Sam Stickland)
|
||||
* Fix CaSe of EtherLike-MIB in EtherLike.pm (Alexander Hartmaier)
|
||||
* Added Cisco FWSM to L3::Cisco
|
||||
* Added s222_rp to L3::C6500
|
||||
* Added CIGESM to L2::C2900
|
||||
* Added Airespace WLC to L2::Airespace
|
||||
* Updated POD and DeviceMatrix quite a bit
|
||||
* Added ENTITY-MIB to CiscoStats for better model handling above
|
||||
* Fix networkaddress handling in LLDP-MIB
|
||||
* Added CiscoConfig to L2::Aironet, L3::C3550 classes
|
||||
* Better SSID capabilities for L2::Aironet
|
||||
* Fix CDP vs LLDP in c_id() for HP Class
|
||||
* test_class.pl improvements
|
||||
|
||||
version 2.00 (08/01/08)
|
||||
+ Support for Alcatel-Lucent OmniSwitch via L3::AlcatelLucent
|
||||
+ Support for Alcatel-Lucent Service Router via L3::Timetra
|
||||
+ Support for Alcatel-Lucent OmniAccess via L2::Aruba
|
||||
|
||||
* Silence warnings in MAU due to uninitialized variables
|
||||
* 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
|
||||
@@ -30,7 +673,7 @@ version 1.09 (07/22/08) - Beta/developer release
|
||||
+ 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.
|
||||
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.
|
||||
@@ -57,7 +700,7 @@ version 1.05 (11/25/07) - CVS only. No official release
|
||||
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 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)
|
||||
@@ -81,7 +724,7 @@ version 1.05 (11/25/07) - CVS only. No official release
|
||||
+ 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.
|
||||
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.
|
||||
@@ -143,14 +786,14 @@ 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).
|
||||
* 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
|
||||
* 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
|
||||
@@ -216,15 +859,15 @@ version 1.0 (04/07/06) - CVS only. No official release
|
||||
translated properly
|
||||
|
||||
verison 0.9 (11/15/04)
|
||||
+ ** Added full Nortel/Bay/BayStack support
|
||||
by new developer Eric Miller.
|
||||
+ ** 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 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.
|
||||
@@ -274,27 +917,27 @@ version 0.6 (06/18/03)
|
||||
|
||||
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
|
||||
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.
|
||||
* 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
|
||||
* Added NO_SUCH support for snmpget (TABLE) calls to get SNMP MIB II data
|
||||
from SNMP Version 1 devices.
|
||||
* Methods load_all() and all() have changed their return value. Sorry but
|
||||
the API had to change.
|
||||
* New object methods snmp_comm(), snmp_ver(), store(), class(), nosuch()
|
||||
to make it more OO happy.
|
||||
* Globals are now cached
|
||||
* Added new argument 'AutoSpecify' to new() to auto-connect with subclass
|
||||
* Added new argument 'AutoSpecify' to new() to auto-connect with subclass
|
||||
detected in device_type()
|
||||
* New method specify() returns a new subclass object
|
||||
* Subclasses are automatically loaded when specify or autospecify is used!
|
||||
* Added methods for Interface statistics (ifInOctets ...)
|
||||
* Added methods for Memory and CPU statistics
|
||||
* Added methods for Memory and CPU statistics
|
||||
* Added SNMP::Info::Entity, moved out of L2-HP
|
||||
* Added SNMP::Info::Layer2::Aironet
|
||||
|
||||
@@ -307,7 +950,7 @@ version 0.3 (03/06/03)
|
||||
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.
|
||||
4.2.0 version of SNMP on CPAN. Will now fail in the test phase.
|
||||
Thanks again to Martin Lorensen <martin /at- lorensen.dk>
|
||||
* Moved tests from test.pl to t/*
|
||||
|
||||
@@ -317,10 +960,10 @@ version 0.2 (02/19/03)
|
||||
* Fixed HP Detection in device_type()
|
||||
* Added Spanning Tree Protocol (STP) methods to SNMP::Info::Bridge
|
||||
* Removed HP Specific MIBS in SNMP::Info::Layer2 and cleaned up model()
|
||||
* Added poke for Bay 450 Switches
|
||||
* Added poke for Bay 450 Switches
|
||||
* Mapped HP Part Numbers to model numbers J4812A => 2512 in
|
||||
SNMP::Info::Layer2::HP
|
||||
|
||||
|
||||
version 0.1 (12/30/02)
|
||||
* Initial Release
|
||||
* SubClasses Included:
|
||||
@@ -330,13 +973,13 @@ version 0.1 (12/30/02)
|
||||
* SNMP::Info::MAU
|
||||
* SNMP::Info::Layer1
|
||||
o SNMP::Info::Layer1::Allied
|
||||
o SNMP::Info::Layer1::Asante
|
||||
o SNMP::Info::Layer1::Asante
|
||||
* SNMP::Info::Layer2
|
||||
o SNMP::Info::Layer2::Bay
|
||||
o SNMP::Info::Layer2::C1900
|
||||
o SNMP::Info::Layer2::C2900
|
||||
o SNMP::Info::Layer2::Catalyst
|
||||
o SNMP::Info::Layer2::HP
|
||||
o SNMP::Info::Layer2::HP
|
||||
* SNMP::Info::Layer3
|
||||
o SNMP::Info::Layer3::Aironet
|
||||
o SNMP::Info::Layer3::Foundry
|
||||
|
||||
28
DEVELOP
Normal file
28
DEVELOP
Normal file
@@ -0,0 +1,28 @@
|
||||
SNMP::Info Developer Guidelines
|
||||
|
||||
Coding Guidelines:
|
||||
- tab-width of 4, no tab characters
|
||||
- keep POD documentation up-to-date
|
||||
- always update ChangeLog before committing
|
||||
- check-in required mibs to netdisco-mibs and release new package if needed
|
||||
|
||||
Release and Testing Instructions:
|
||||
- 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?
|
||||
760
DeviceMatrix.txt
760
DeviceMatrix.txt
@@ -1,761 +1,9 @@
|
||||
# SNMP Device Compatibility Matrix
|
||||
# SNMP::Info - (C) 2004 Max Baker
|
||||
|
||||
# This file is meant to detail the cababilities
|
||||
# of network devices to supply data via SNMP.
|
||||
# THIS FILE IS NO LONGER MAINTAINED
|
||||
|
||||
# $Id$
|
||||
# THERE ARE NOW GENERIC CLASSES FOR MOST DEVICES, SIMPLY LOAD SNMP::Info AND
|
||||
# TRY YOUR DEVICE, THEN REPORT TO THE MAIL LIST ANY MISSING FUNCTIONALITY.
|
||||
|
||||
# Airespace (pre-Cisco)
|
||||
device-vendor: Airespace
|
||||
cdp:no
|
||||
arpnip: no
|
||||
macsuck: yes
|
||||
portmac: yes
|
||||
duplex: both
|
||||
vlan: yes
|
||||
modules: yes
|
||||
class: Layer2::Airespace
|
||||
note: Uses proprietary MIBs to provide MAC to port mapping. APs appear as switch ports.
|
||||
note: Device will only communicate with SNMP version configured in the controller.
|
||||
|
||||
device-family: Airespace Wireless Controllers
|
||||
|
||||
device: 3500, 4101, 4102
|
||||
|
||||
# Allied
|
||||
device-vendor: Allied Telesyn
|
||||
cdp:no
|
||||
class: Layer1::Allied
|
||||
ver: 1
|
||||
arpnip: no
|
||||
macsuck: no
|
||||
duplex: no
|
||||
|
||||
device-family: Allied Hubs
|
||||
|
||||
device: AT-3624T
|
||||
|
||||
device-family: AT-8000 Switches
|
||||
class: Layer2::Allied
|
||||
ver: 2
|
||||
macsuck: yes
|
||||
|
||||
# Aruba
|
||||
device-vendor: Aruba
|
||||
arpnip: no
|
||||
macsuck: yes
|
||||
portmac: yes
|
||||
duplex: no
|
||||
class: Layer2::Aruba
|
||||
note: Uses proprietary MIBs to provide MAC to port mapping. APs appear as switch ports.
|
||||
|
||||
device-family: Aruba Wireless Controllers
|
||||
|
||||
device: 5000
|
||||
|
||||
# Asante
|
||||
device-vendor: Asante
|
||||
class: Layer1::Asante
|
||||
ver: 1
|
||||
arpnip: no
|
||||
macsuck: no
|
||||
duplex: no
|
||||
|
||||
device-family: Asante Hubs
|
||||
|
||||
device: 1012
|
||||
|
||||
# Bay
|
||||
device-vendor: Bay
|
||||
note: See Nortel
|
||||
|
||||
# CISCO
|
||||
device-vendor: Cisco
|
||||
cdp: yes
|
||||
ver: 2
|
||||
modules: yes
|
||||
note: Error in CISCO-TC-MIB. See README for how to patch.
|
||||
|
||||
device-family: Aironet
|
||||
note: IOS and Aironet OS versions
|
||||
class: Layer3::Aironet
|
||||
|
||||
device: AIRAP1100, AP1200, C1100, C1130, C1240
|
||||
note: IOS based device
|
||||
class: Layer2::Aironet
|
||||
|
||||
device: BR500
|
||||
note: Aironet based device
|
||||
|
||||
device: AP350, AP340, CAP350, CAP340, 1200, AP4800
|
||||
note: Aironet based device
|
||||
|
||||
device-family: 1000
|
||||
duplex: no
|
||||
ver: 1
|
||||
class: Layer3::Cisco
|
||||
|
||||
device: 1003
|
||||
|
||||
device-family: 1700
|
||||
class: Layer3::Cisco
|
||||
|
||||
device: 1710
|
||||
duplex: link
|
||||
|
||||
device-family: 2500
|
||||
duplex: no
|
||||
macsuck: yes
|
||||
arpnip: yes
|
||||
ver: 1
|
||||
class: Layer3::Cisco
|
||||
|
||||
device: 2501,2503,2511,2514
|
||||
|
||||
device: AS2509RJ,AS2511RJ
|
||||
|
||||
device-family: 2600
|
||||
duplex: link
|
||||
arpnip: yes
|
||||
macsuck: yes
|
||||
class: Layer3::Cisco
|
||||
|
||||
device:2610,2610XM,2611,2620,2620XM,2621,2621XM
|
||||
|
||||
device:2651XM
|
||||
|
||||
device:2691
|
||||
|
||||
device-family: 2800
|
||||
duplex: link
|
||||
arpnip: yes
|
||||
macsuck: yes
|
||||
class: Layer3::Cisco
|
||||
|
||||
device: 2811,2821,2851
|
||||
|
||||
device-family: 3600
|
||||
class: Layer3::Cisco
|
||||
|
||||
device: 3620
|
||||
|
||||
device: 3640
|
||||
duplex: no
|
||||
|
||||
device-family:7200
|
||||
class: Layer3::Cisco
|
||||
note: !"When scanning my network with netdisco I would find that my 7200 series router running Cisco IOS Software Release 12.2(1) would reboot when scanning for CDP neighbours, to solve the issue I upgraded to Cisco IOS Software Release Version 12.2(37)"
|
||||
|
||||
device-family: 7500
|
||||
class: Layer3::Cisco
|
||||
|
||||
device: 7507
|
||||
duplex: no
|
||||
note: !Duplex settings are falsely reported in older IOS versions
|
||||
|
||||
device-family: AS5000
|
||||
duplex: no
|
||||
class: Layer3::Cisco
|
||||
|
||||
device: AS5300
|
||||
|
||||
#
|
||||
# Cisco - Catalyst
|
||||
#
|
||||
device-family: Catalyst 1900
|
||||
note: !Upgrade older (pre 9.0) versions of CatOS
|
||||
note: !CatOS ver 9.00.03 through 9.00.06 have problems when trunking. Upgrade to 9.00.07 or higher.
|
||||
ver: 1
|
||||
duplex: both
|
||||
vlan: write
|
||||
class: Layer2::C1900
|
||||
|
||||
device: wsc1900c
|
||||
device-family: Catalyst 1900
|
||||
|
||||
device: wsc1900
|
||||
device-family: Catalyst 1900
|
||||
|
||||
device-family: Catalyst 2900
|
||||
note: IOS
|
||||
macsuck: vlan
|
||||
duplex: write
|
||||
vlan: write
|
||||
class: Layer2::C2900
|
||||
portmac: yes
|
||||
note: !Pre IOS 11.2 (8) SA3 - PortMAC shows up in CAM table.
|
||||
|
||||
device: 2908xl
|
||||
note: !Pre IOS 11.2 (8.6) some features (duplex...) aren't present.
|
||||
|
||||
device: 2912MfXL
|
||||
|
||||
device: 2924MXL
|
||||
ver: 1
|
||||
|
||||
device: 2924CXL
|
||||
|
||||
device: 2924CXLv
|
||||
|
||||
device-family: Catalyst 2940
|
||||
note: IOS
|
||||
macsuck: vlan
|
||||
duplex: write
|
||||
vlan: write
|
||||
class: Layer2::C2900
|
||||
portmac: yes
|
||||
|
||||
device: 2940-8TT
|
||||
|
||||
device-family: Catalyst 2950
|
||||
note: IOS
|
||||
macsuck: vlan
|
||||
duplex: write
|
||||
vlan: write
|
||||
class: Layer2::C2900
|
||||
portmac: yes
|
||||
|
||||
device: 2950-t24
|
||||
|
||||
device-family: Catalyst 2970
|
||||
macsuck:vlan
|
||||
duplex: write
|
||||
vlan: write
|
||||
note: Acts just like IOS Catalyst 6500 series
|
||||
class: Layer3::C6500
|
||||
|
||||
device: 2960, 2970G-24T-E
|
||||
|
||||
device-family: Catalyst 3500 XL
|
||||
portmac: yes
|
||||
macsuck: vlan
|
||||
duplex: write
|
||||
vlan: write
|
||||
note: L2 only IOS devices - Just like Catalyst 2900 series from SNMP
|
||||
note: IOS Version 12.0(5)XP is buggy and doesn't do VLAN Community indexing correctly.
|
||||
class: Layer2::C2900
|
||||
|
||||
device: 3508GXL
|
||||
|
||||
device: 3524XL
|
||||
|
||||
device: 3548XL
|
||||
|
||||
device-family: Catalyst 3550
|
||||
macsuck: vlan
|
||||
duplex: write
|
||||
vlan: write
|
||||
class: Layer3::C3550
|
||||
note: Run IOS
|
||||
note: Has VLANs that don't accept SNMP connections. Don't know if they are standard (by name or number).
|
||||
note: Uses CISCO-STACK-MIB like Catalyst 5000 series for serial,duplex,type but not name
|
||||
note: Comes in flavors that support L2, L3 or combo.
|
||||
|
||||
device: 3550-12T
|
||||
|
||||
device: 3400 w/ MetroBase Image
|
||||
|
||||
device: 3550
|
||||
note: L2/L3 Switch
|
||||
arpnip: yes
|
||||
|
||||
device: 3550-24, 3550-48
|
||||
macsuck: vlan
|
||||
|
||||
device-family: Catalyst 3750
|
||||
class: Layer3::C6500
|
||||
|
||||
device: 3750
|
||||
|
||||
device-family: Catalyst 4000
|
||||
duplex: write
|
||||
macsuck: vlan
|
||||
vlan: write
|
||||
class: Layer2::Catalyst
|
||||
note: Comes in IOS and CatOS versions like the 6k series.
|
||||
note: CatOS versions like L2::Catalyst just fine.
|
||||
note: !Reported problems with SNMP taking up all the CPU. Requests take significantly longer.
|
||||
note: !IOS Version 12.1.8a reported not to respond to BRIDGE-MIB calls.
|
||||
|
||||
device: wsc4003, wsc4006
|
||||
|
||||
device: wsc4503, wsc4506
|
||||
|
||||
device: wsc4912g
|
||||
note: Dedicated 12 port gig-e switch
|
||||
|
||||
device: 4006
|
||||
duplex: both
|
||||
class: Layer3::C4000
|
||||
note: !Has serious slowdown/timeout problems with SNMP
|
||||
note: !IOS Software Release 12.2(20)EW or higher required for duplex support
|
||||
|
||||
device: 4503, 4506, 4507, 4510
|
||||
duplex: both
|
||||
class: Layer3::C4000
|
||||
note: !Has serious slowdown/timeout problems with SNMP
|
||||
note: !IOS Software Release 12.2(20)EW or higher required for duplex support
|
||||
|
||||
|
||||
device-family: Catalyst 5000
|
||||
duplex: write
|
||||
vlan: write
|
||||
class: Layer2::Catalyst
|
||||
note: Port info in CISCO-STACK-MIB
|
||||
|
||||
device: wsc2926
|
||||
note: !Can give false information over SNMP at times.
|
||||
|
||||
device: wsc2948g
|
||||
|
||||
device: wsc2980g
|
||||
note: !Macsuck not working?
|
||||
|
||||
device: wsc5000
|
||||
note: !Has nasty tendency to not give you all SNMP data ,flaky for some older Catalyst versions.
|
||||
|
||||
device: wsc5500,wsc5505,wsc5509
|
||||
|
||||
device: wsx5302
|
||||
arpnip: yes
|
||||
class: Layer3
|
||||
note: Router blade that runs IOS
|
||||
|
||||
device-family: Catalyst 6500
|
||||
macsuck:vlan
|
||||
duplex: write
|
||||
vlan: write
|
||||
class: Layer3::C6500
|
||||
note: Runs in two possible modes, native (IOS) and hybrid (IOS with CatOS on top).
|
||||
note: Switch running Hybrid has WS-C in description field and loves L2::Catalyst class
|
||||
note: Native Mode (IOS) versions seem to have SNMP problems with L2 data.
|
||||
note: !Problem with IOS 12.2.17d-SXB ... upgrade to -SXB1 or higher.
|
||||
note: !Sup720-3B and NativeIOS 12.2 (17d)SXB10 may report 127.0.0.51 as CDP neighbor address.
|
||||
|
||||
device: 6503
|
||||
macsuck:no
|
||||
note: !Macsuck failing even under vlan mode
|
||||
note: Native mode (IOS) reports L2+L3
|
||||
|
||||
device: 6509
|
||||
duplex: link
|
||||
macsuck:no
|
||||
note: Native mode (IOS) reports L2+L3
|
||||
note: !Macsuck failing even under vlan mode
|
||||
|
||||
device: wsc6509
|
||||
duplex: write
|
||||
class: Layer2::Catalyst
|
||||
note: Hybrid Mode (Catalyst) reports L2 only
|
||||
|
||||
device: 6kMsfc
|
||||
class: Layer3
|
||||
duplex: no
|
||||
vlan: no
|
||||
note: IOS portion of Hybrid mode. VLAN and other L3 Services.
|
||||
|
||||
device: 6kMsfc2
|
||||
class: Layer3
|
||||
duplex: no
|
||||
vlan: no
|
||||
note: IOS portion of Hybrid mode. VLAN and other L3 Services.
|
||||
|
||||
device-family: Voice Gateway
|
||||
class: Layer3
|
||||
duplex: no
|
||||
|
||||
device: VG200
|
||||
|
||||
device-family: Wireless Controllers
|
||||
class: Layer2::Airespace
|
||||
cdp:no
|
||||
arpnip: no
|
||||
macsuck: yes
|
||||
portmac: yes
|
||||
duplex: both
|
||||
note: Uses proprietary MIBs to provide MAC to port mapping. APs appear as switch ports.
|
||||
note: Device will only communicate with SNMP version configured in the controller.
|
||||
|
||||
device: 2006, 4112, 4124, 4136, 4402, 4404
|
||||
|
||||
# Dell
|
||||
device-vendor: Dell
|
||||
arpnip: no
|
||||
macsuck: yes
|
||||
duplex: both
|
||||
vlan: yes
|
||||
cdp: no
|
||||
modules: yes
|
||||
class: Layer3::Dell
|
||||
|
||||
device-family: Dell PowerConnect 6000 Series
|
||||
arpnip: yes
|
||||
device: 6024F, 6224, 6248
|
||||
|
||||
device-family: Dell PowerConnect 5000 Series
|
||||
device: 5324
|
||||
|
||||
device-family: Dell PowerConnect 3000 Series
|
||||
device: 3348, 3448P, 3424, 3424P
|
||||
|
||||
# Enterasys
|
||||
device-vendor: Enterasys Networks
|
||||
arpnip: yes
|
||||
macsuck: yes
|
||||
duplex: both
|
||||
vlan: yes
|
||||
cdp: yes
|
||||
modules: yes
|
||||
class: Layer3::Enterasys
|
||||
|
||||
device-family: SuperStack C-Series
|
||||
|
||||
device: C3G124-24, C3G124-48
|
||||
device: C2G124-24, C2G124-48
|
||||
|
||||
device-family: Matrix
|
||||
|
||||
device: Matrix N-Series DFE
|
||||
|
||||
# Extreme
|
||||
device-vendor: Extreme Networks
|
||||
arpnip: yes
|
||||
macsuck: yes
|
||||
duplex: both
|
||||
vlan: yes
|
||||
cdp: no
|
||||
modules: yes
|
||||
class: Layer3::Extreme
|
||||
|
||||
device-family: Alpine and Summit
|
||||
|
||||
device: Alpine 3808
|
||||
device: Summit 7i, 48si
|
||||
|
||||
# Foundry
|
||||
device-vendor: Foundry Networks
|
||||
note: CDP --> FDP.
|
||||
vlan: yes
|
||||
modules: no
|
||||
|
||||
device-family: FastIron
|
||||
class: Layer3::Foundry
|
||||
ver: 1
|
||||
note: Support very limited
|
||||
|
||||
device: FastIron 4802
|
||||
|
||||
device-family: EdgeIron
|
||||
ver: 2
|
||||
class: Layer3::Foundry
|
||||
cdp: yes
|
||||
duplex: yes
|
||||
macsuck: yes
|
||||
device: EdgeIron 24G
|
||||
note: Bug where spanning tree stuff loops forever when polled by SNMP.
|
||||
|
||||
device-family: IronWare
|
||||
class: Layer3::Foundry
|
||||
ver: 2
|
||||
cdp: yes
|
||||
note: FDP enabled.
|
||||
duplex: yes
|
||||
macsuck: yes
|
||||
arpnip: yes
|
||||
device: FWSX424
|
||||
device: ServerIronGT
|
||||
device: FLS624, FLS648
|
||||
|
||||
# HP
|
||||
device-vendor: HP
|
||||
class: Layer2::HP
|
||||
ver: 2
|
||||
modules: yes
|
||||
|
||||
device-family: HP ProCurve
|
||||
duplex: both
|
||||
macsuck: yes
|
||||
arpnip: no
|
||||
cdp: yes
|
||||
vlan: write
|
||||
note: CDP only available with newer ROM versions.
|
||||
|
||||
device: 2512
|
||||
ver: 1
|
||||
|
||||
device: 2524
|
||||
ver: 1
|
||||
|
||||
device: 4000
|
||||
note: duplex issues?
|
||||
|
||||
device: 4104GL
|
||||
duplex: link
|
||||
|
||||
device: 4108GL,8000,2626,2650,8000
|
||||
note: VLAN info in Q-BRIDGE-MIB
|
||||
|
||||
# Juniper
|
||||
device-vendor: Juniper
|
||||
arpnip: yes
|
||||
|
||||
device-family: M-series router
|
||||
class: Layer3::Juniper
|
||||
device: M-series router
|
||||
|
||||
device-family: NetScreen
|
||||
class: Layer3::Netscreen
|
||||
device: Netscreen
|
||||
|
||||
# NetScreen
|
||||
device-vendor: NetScreen
|
||||
note: See Juniper
|
||||
|
||||
# Net-SNMP
|
||||
device-vendor: Net-SNMP
|
||||
class: Layer3
|
||||
ver: 2
|
||||
|
||||
device-family: Linux
|
||||
note: net-snmp 4.x agent and 5.x agent.
|
||||
device: Linux routers
|
||||
|
||||
device-family: BSD
|
||||
device: BSD routers
|
||||
|
||||
# NORTEL
|
||||
device-vendor: Nortel
|
||||
macsuck: yes
|
||||
cdp: proprietary
|
||||
note: CDP --> SONMP.
|
||||
|
||||
device-family: BayStack Hub
|
||||
duplex: both
|
||||
ver: 1
|
||||
modules: yes
|
||||
class: Layer1::Bayhub
|
||||
note: Uses proprietary MIBs to provide MAC to port mapping.
|
||||
note: !Requires Advanced or Advanced Analyzer NMM
|
||||
|
||||
device: 102
|
||||
|
||||
device: System 5000
|
||||
|
||||
device-family: Ethernet Switch/Baystack Switch
|
||||
macsuck: yes
|
||||
duplex: both
|
||||
vlan: write
|
||||
modules: yes
|
||||
class: Layer2::Baystack
|
||||
|
||||
device: 303,304
|
||||
|
||||
device: 350
|
||||
|
||||
device: 380
|
||||
|
||||
device: 410
|
||||
|
||||
device: 420,425
|
||||
|
||||
device: 450
|
||||
note: !Some versions > 4.X in stacked configuration have SNMP timeout issues.
|
||||
note: Labels full duplex as 20Mbit connection.
|
||||
|
||||
device: 460,470
|
||||
|
||||
device: BPS
|
||||
|
||||
device-family: Ethernet Routing Switch/Baystack Switch
|
||||
arpnip: yes
|
||||
duplex: write
|
||||
vlan: write
|
||||
modules: yes
|
||||
class: Layer2::Baystack
|
||||
|
||||
device: 3510
|
||||
|
||||
device: 2526,2550
|
||||
|
||||
device: 4524,4526,4548,4550
|
||||
|
||||
device: 5510,5520,5530
|
||||
|
||||
device-family: Business Ethernet Switch
|
||||
arpnip: yes
|
||||
duplex: write
|
||||
vlan: write
|
||||
modules: yes
|
||||
class: Layer2::Baystack
|
||||
|
||||
device: 50,110,120,210,220,1010,1020
|
||||
|
||||
device-family: Centillion
|
||||
duplex: both
|
||||
vlan: yes
|
||||
class: Layer2::Centillion
|
||||
note: !Must be on version 4.x or 5.x (VLAN based) software.
|
||||
|
||||
device: 5000BH
|
||||
|
||||
device: 5005BH
|
||||
|
||||
device: C100
|
||||
|
||||
device: C50
|
||||
|
||||
device-family: AP222x
|
||||
duplex: both
|
||||
modules: no
|
||||
class: Layer2::NAP222x
|
||||
note: !Upgrade to version 1.3 or higher.
|
||||
note: Sends out topology packets if enabled but does not build neighbor table.
|
||||
|
||||
device: AP-2220, AP-2221
|
||||
|
||||
device-family: Alteon AD
|
||||
arpnip: yes
|
||||
duplex: both
|
||||
cdp: no
|
||||
vlan: yes
|
||||
modules: no
|
||||
class: Layer3::AlteonAD
|
||||
note: !Some versions have issues with continuous SNMP polling. Upgrade to 10.0.30.7 or higher.
|
||||
|
||||
device: AD2,AD3,AD4
|
||||
|
||||
device: 180,183,184
|
||||
|
||||
device-family: Multiprotocol Router/BayRS
|
||||
arpnip: yes
|
||||
portmac: yes
|
||||
duplex: both
|
||||
cdp: no
|
||||
vlan: yes
|
||||
modules: yes
|
||||
class: Layer3::BayRS
|
||||
|
||||
device: AN,ARN,ASN,BLN,BCN
|
||||
|
||||
device: 2430,5430
|
||||
|
||||
device-family: VPN Router/Contivity
|
||||
arpnip: yes
|
||||
macsuck: no
|
||||
portmac: yes
|
||||
duplex: no
|
||||
cdp: no
|
||||
modules: yes
|
||||
class: Layer3::Contivity
|
||||
|
||||
device: 100,400,600
|
||||
|
||||
device: 1000,1010,1050
|
||||
|
||||
device: 1500,1600,1700,1740,1750
|
||||
|
||||
device: 2500,2600,2700
|
||||
|
||||
device: 4500,4600,5000
|
||||
|
||||
device-family: Ethernet Routing Switch/Passport/Accelar LAN
|
||||
arpnip: yes
|
||||
macsuck: yes
|
||||
portmac: yes
|
||||
duplex: write
|
||||
cdp: proprietary
|
||||
vlan: write
|
||||
modules: yes
|
||||
class: Layer3::Passport
|
||||
note: !8600 Code versions < 3.2 vlan based mac-suck and are unsupported. Upgrade code.
|
||||
note: !8600 3.2 code versions < 3.2.2.2 have Bridge MIB loop. Upgrade code.
|
||||
|
||||
device: 8603,8606,8610
|
||||
|
||||
device: 8610co
|
||||
|
||||
device: 8106,8110
|
||||
|
||||
device: 1050,1100,1150,1200
|
||||
|
||||
device-family: Ethernet Routing Switch/Passport 1600 (Software < 2.1)
|
||||
arpnip: yes
|
||||
macsuck: yes
|
||||
portmac: yes
|
||||
duplex: both
|
||||
cdp: proprietary
|
||||
vlan: write
|
||||
class: Layer3::N1600
|
||||
|
||||
device: 1612,1624,1648
|
||||
|
||||
device-family: Ethernet Routing Switch/Passport 1600 (Software >= 2.1)
|
||||
arpnip: yes
|
||||
macsuck: yes
|
||||
portmac: yes
|
||||
duplex: write
|
||||
cdp: proprietary
|
||||
vlan: write
|
||||
class: Layer3::Passport
|
||||
|
||||
device: 1612,1624,1648
|
||||
|
||||
device-family: Synoptics
|
||||
macsuck: yes
|
||||
duplex: both
|
||||
cdp: proprietary
|
||||
ver: 1
|
||||
class: Layer1::S3000
|
||||
note: Uses proprietary MIBs to provide MAC to port mapping.
|
||||
note: !Requires Advanced or Advanced Analyzer NMM
|
||||
|
||||
device: 281X
|
||||
|
||||
device: System 3000
|
||||
|
||||
device-family: Wireless Switch 2270
|
||||
arpnip: no
|
||||
macsuck: yes
|
||||
portmac: yes
|
||||
duplex: both
|
||||
cdp: proprietary
|
||||
modules: yes
|
||||
class: Layer2::N2270
|
||||
note: Uses proprietary MIBs to provide MAC to port mapping. APs appear as switch ports.
|
||||
|
||||
device: 2270
|
||||
|
||||
# Proxim
|
||||
device-vendor: Proxim
|
||||
macsuck: yes
|
||||
duplex: no
|
||||
cdp: no
|
||||
class: Layer2::Orinoco
|
||||
|
||||
device-family: Orinoco
|
||||
|
||||
device: AP-1000,AP-2000,AP-4000
|
||||
|
||||
device: WavePOINT-II
|
||||
|
||||
# Sun
|
||||
device-vendor: Sun
|
||||
class: Layer3::Sun
|
||||
|
||||
device-family: Sun routers
|
||||
|
||||
device: Sun routers
|
||||
|
||||
# Synoptics
|
||||
device-vendor: Synoptics
|
||||
note: See Nortel
|
||||
|
||||
# Zyxel
|
||||
device-vendor: Zyxel
|
||||
class: Layer2::ZyXEL_DSLAM
|
||||
note: Doesn't report sysServices (layers)
|
||||
|
||||
device-family: Zyxel DSLAM
|
||||
|
||||
device:AAM10008-61, AAM1008-63
|
||||
# THANK YOU
|
||||
|
||||
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.33';
|
||||
|
||||
%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.33';
|
||||
|
||||
%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
|
||||
@@ -1,6 +1,6 @@
|
||||
# $Id$
|
||||
# SNMP::Info::Aggregate
|
||||
#
|
||||
# Copyright (c) 2005 Matt Tuttle
|
||||
# Copyright (c) 2014 SNMP::Info Developers
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
@@ -27,88 +27,103 @@
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoImage;
|
||||
package SNMP::Info::Aggregate;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::CiscoImage::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoImage::EXPORT_OK = qw//;
|
||||
@SNMP::Info::Aggregate::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::Aggregate::EXPORT_OK = qw/agg_ports_ifstack/;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = ( 'CISCO-IMAGE-MIB' => 'ciscoImageString', );
|
||||
%MIBS = (); # IF-MIB
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = ( 'ci_images' => 'ciscoImageString', );
|
||||
%FUNCS = ();
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
sub agg_ports_ifstack {
|
||||
my $dev = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ifStack = $dev->ifStackStatus();
|
||||
# TODO: if we want to do partial, we need to use inverse status
|
||||
my $ifType = $dev->ifType();
|
||||
|
||||
my $ret = {};
|
||||
|
||||
foreach my $idx ( keys %$ifStack ) {
|
||||
my ( $higher, $lower ) = split /\./, $idx;
|
||||
next if ( $higher == 0 or $lower == 0 );
|
||||
if ( $ifType->{ $higher } eq 'ieee8023adLag' or $ifType->{ $higher } eq 'propMultiplexor') {
|
||||
$ret->{ $lower } = $higher;
|
||||
}
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoImage - SNMP Interface to image strings for Cisco Devices
|
||||
SNMP::Info::Aggregate - SNMP Interface to ifStackTable Aggregated Links
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Matt Tuttle (C<mtuttle@americanhebrewacademy.org>)
|
||||
SNMP::Info Developers
|
||||
|
||||
=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
|
||||
)
|
||||
# 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 = $ci->class();
|
||||
my $class = $info->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.
|
||||
This class provides access to Aggregated Links configuration on devices
|
||||
supporting C<ifStackTable>.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
None.
|
||||
L<SNMP::Info>
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-IMAGE-MIB>
|
||||
=item F<IF-MIB>
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
||||
=head1 METHODS
|
||||
|
||||
=head1 GLOBALS
|
||||
=over 4
|
||||
|
||||
None.
|
||||
=item C<agg_ports_ifstack>
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=over
|
||||
|
||||
=item $ci->ci_images()
|
||||
|
||||
Returns the table of image strings.
|
||||
|
||||
C<ciscoImageString>
|
||||
Returns a HASH reference mapping from slave to master port for each member of
|
||||
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
|
||||
ifIndex of the corresponding master ports.
|
||||
|
||||
=back
|
||||
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS,
|
||||
@@ -83,18 +83,20 @@ $VERSION = '2.00';
|
||||
'airespace_ess_qos' => 'bsnDot11EssQualityOfService',
|
||||
'airespace_ess_ifname' => 'bsnDot11EssInterfaceName',
|
||||
'airespace_ess_aclname' => 'bsnDot11EssAclName',
|
||||
|
||||
'airespace_ess_bcast' => 'bsnDot11EssBroadcastSsid',
|
||||
|
||||
# AIRESPACE-WIRELESS-MIB::bsnAPTable
|
||||
'airespace_ap_mac' => 'bsnAPDot3MacAddress',
|
||||
'airespace_ap_name' => 'bsnAPName',
|
||||
'airespace_ap_ip' => 'bsnApIpAddress',
|
||||
'airespace_ap_loc' => 'bsnAPLocation',
|
||||
'airespace_ap_sw' => 'bsnAPSoftwareVersion',
|
||||
'airespace_ap_fw' => 'bsnAPBootVersion',
|
||||
'airespace_ap_model' => 'bsnAPModel',
|
||||
'airespace_ap_serial' => 'bsnAPSerialNumber',
|
||||
'airespace_ap_type' => 'bsnAPType',
|
||||
'airespace_ap_status' => 'bsnAPAdminStatus',
|
||||
'airespace_ap_mac' => 'bsnAPDot3MacAddress',
|
||||
'airespace_ap_name' => 'bsnAPName',
|
||||
'airespace_ap_ip' => 'bsnApIpAddress',
|
||||
'airespace_ap_loc' => 'bsnAPLocation',
|
||||
'airespace_ap_sw' => 'bsnAPSoftwareVersion',
|
||||
'airespace_ap_fw' => 'bsnAPBootVersion',
|
||||
'airespace_ap_model' => 'bsnAPModel',
|
||||
'airespace_ap_serial' => 'bsnAPSerialNumber',
|
||||
'airespace_ap_type' => 'bsnAPType',
|
||||
'airespace_ap_status' => 'bsnAPAdminStatus',
|
||||
'airespace_ap_ethermac' => 'bsnAPEthernetMacAddress',
|
||||
|
||||
# AIRESPACE-WIRELESS-MIB::bsnAPIfTable
|
||||
'airespace_apif_slot' => 'bsnAPIfSlotId',
|
||||
@@ -104,6 +106,7 @@ $VERSION = '2.00';
|
||||
'airespace_apif' => 'bsnAPIfOperStatus',
|
||||
'airespace_apif_oride' => 'bsnAPIfWlanOverride',
|
||||
'airespace_apif_admin' => 'bsnAPIfAdminStatus',
|
||||
'airespace_apif_a_pwr' => 'bsnAPIfAbsolutePowerList',
|
||||
|
||||
# AIRESPACE-WIRELESS-MIB::bsnMobileStationTable
|
||||
'airespace_sta_mac' => 'bsnMobileStationAPMacAddr',
|
||||
@@ -112,6 +115,7 @@ $VERSION = '2.00';
|
||||
'airespace_sta_ess_idx' => 'bsnMobileStationEssIndex',
|
||||
'airespace_sta_ssid' => 'bsnMobileStationSsid',
|
||||
'airespace_sta_delete' => 'bsnMobileStationDeleteAction',
|
||||
'airespace_sta_ip' => 'bsnMobileStationIpAddress',
|
||||
|
||||
# AIRESPACE-WIRELESS-MIB::bsnUsersTable
|
||||
'airespace_user_name' => 'bsnUserName',
|
||||
@@ -144,19 +148,32 @@ $VERSION = '2.00';
|
||||
# AIRESPACE-SWITCHING-MIB::agentPortConfigTable
|
||||
'airespace_duplex_admin' => 'agentPortPhysicalMode',
|
||||
'airespace_duplex' => 'agentPortPhysicalStatus',
|
||||
|
||||
# This needs to be cleaned up, but for now we pretend to
|
||||
# have the CISCO-DOT11-MIB for signal strengths, etc.
|
||||
'cd11_sigstrength' => 'bsnMobileStationRSSI', # kinda
|
||||
'cd11_sigqual' => 'bsnMobileStationSnr', # kinda
|
||||
'cd11_rxbyte' => 'bsnMobileStationBytesReceived',
|
||||
'cd11_txbyte' => 'bsnMobileStationBytesSent',
|
||||
'cd11_rxpkt' => 'bsnMobileStationPacketsReceived',
|
||||
'cd11_txpkt' => 'bsnMobileStationPacketsSent',
|
||||
'cd11_ssid' => 'bsnMobileStationSsid',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::MUNGE,
|
||||
'airespace_ap_mac' => \&SNMP::Info::munge_mac,
|
||||
'fw_port' => \&SNMP::Info::munge_mac,
|
||||
'airespace_bl_mac' => \&SNMP::Info::munge_mac,
|
||||
'airespace_if_mac' => \&SNMP::Info::munge_mac,
|
||||
'airespace_sta_mac' => \&SNMP::Info::munge_mac,
|
||||
'airespace_ap_mac' => \&SNMP::Info::munge_mac,
|
||||
'airespace_ap_ethermac' => \&SNMP::Info::munge_mac,
|
||||
'fw_port' => \&SNMP::Info::munge_mac,
|
||||
'airespace_bl_mac' => \&SNMP::Info::munge_mac,
|
||||
'airespace_if_mac' => \&SNMP::Info::munge_mac,
|
||||
'airespace_sta_mac' => \&SNMP::Info::munge_mac,
|
||||
'cd11_rxpkt' => \&munge_64bits,
|
||||
'cd11_txpkt' => \&munge_64bits,
|
||||
);
|
||||
|
||||
sub layers {
|
||||
return '00000011';
|
||||
return '00000111';
|
||||
}
|
||||
|
||||
sub serial {
|
||||
@@ -416,11 +433,12 @@ sub i_mac {
|
||||
next unless defined $mac;
|
||||
$i_mac{$iid} = $mac;
|
||||
}
|
||||
|
||||
# Don't grab AP MACs - we want the AP to show up on edge switch
|
||||
# ports
|
||||
elsif ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
|
||||
$index =~ s/\.\d+$//;
|
||||
next unless defined $index;
|
||||
$i_mac{$iid} = $index;
|
||||
}
|
||||
# Some switch interfaces have MACs, virtuals report 00:00:00:00:00:00
|
||||
|
||||
else {
|
||||
my $mac = $if_mac->{$iid};
|
||||
next unless defined $mac;
|
||||
@@ -559,6 +577,13 @@ sub bp_index {
|
||||
return \%bp_index;
|
||||
}
|
||||
|
||||
sub fw_mac {
|
||||
my $airespace = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $airespace->SUPER::fw_mac($partial);
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $airespace = shift;
|
||||
my $partial = shift;
|
||||
@@ -628,20 +653,96 @@ sub i_ssidbcast {
|
||||
my $airespace = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ssidlist = $airespace->i_ssidlist($partial) || {};
|
||||
my $bc_mode = $airespace->airespace_bssid_mode() || 'enable';
|
||||
my $ssidlist = $airespace->i_ssidlist($partial) || {};
|
||||
my $bc_mode = $airespace->airespace_bssid_mode() || 'enable';
|
||||
my $ess_bc_mode = $airespace->airespace_ess_bcast() || {};
|
||||
my $ssids = $airespace->airespace_ess_ssid() || {};
|
||||
my %ssid_index = reverse %$ssids;
|
||||
|
||||
my %bcmap = qw/enable 1 disable 0/;
|
||||
my $broadcast = $bcmap{$bc_mode};
|
||||
|
||||
my %i_ssidbcast;
|
||||
foreach my $iid ( keys %$ssidlist ) {
|
||||
$i_ssidbcast{$iid} = $broadcast;
|
||||
if (!$broadcast) {
|
||||
$i_ssidbcast{$iid} = $broadcast;
|
||||
next;
|
||||
}
|
||||
else {
|
||||
my $ssid = $ssidlist->{$iid};
|
||||
my $ssid_idx = $ssid_index{$ssid};
|
||||
my $bc = $ess_bc_mode->{$ssid_idx};
|
||||
$i_ssidbcast{$iid} = $bcmap{$bc};
|
||||
}
|
||||
}
|
||||
|
||||
return \%i_ssidbcast;
|
||||
}
|
||||
|
||||
# Secret decoder ring for BSSID: https://supportforums.cisco.com/docs/DOC-2935
|
||||
# We need radio base MAC, SSID index, radio band, and whether AP is
|
||||
# VxWorks or IOS based then we can do the arithmetic
|
||||
|
||||
sub i_ssidmac {
|
||||
my $airespace = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ssidlist = $airespace->i_ssidlist($partial) || {};
|
||||
my $apif_type = $airespace->airespace_apif_type() || {};
|
||||
my $ap_ios = $airespace->bsnAPIOSVersion() || {};
|
||||
|
||||
my %i_ssidmac;
|
||||
foreach my $oid ( keys %$ssidlist ) {
|
||||
|
||||
my @parts = split( /\./, $oid );
|
||||
my $ssid_idx = pop(@parts);
|
||||
my $slot = pop(@parts);
|
||||
my $last = pop(@parts);
|
||||
|
||||
my $iid = $oid;
|
||||
|
||||
# Get radio band
|
||||
$iid =~ s/\.\d+$//;
|
||||
my $ap_type = $apif_type->{$iid};
|
||||
|
||||
# Determine if IOS based
|
||||
$iid =~ s/\.\d+$//;
|
||||
my $ios = $ap_ios->{$iid} || '';
|
||||
|
||||
# 17 can be used as index for 3rd Party AP's. We only have one
|
||||
# hexadecimal digit to work with so skip if outside the range
|
||||
if ( $ssid_idx > 0 and $ssid_idx < 17 ) {
|
||||
|
||||
# Four cases:
|
||||
# IOS and 2.4Ghz count up, starts at zero
|
||||
if ( $ios and $ap_type =~ /b$/ ) {
|
||||
$last = $last + ( $ssid_idx - 1 );
|
||||
}
|
||||
|
||||
# IOS and 5Ghz - count down from maximum of 16
|
||||
elsif ( $ios and $ap_type =~ /a$/ ) {
|
||||
$last = $last + ( 16 - $ssid_idx );
|
||||
}
|
||||
|
||||
# VxWorks and 5Ghz - count up, starts at zero
|
||||
elsif ( $ios and $ap_type =~ /a$/ ) {
|
||||
$last = $last + ( $ssid_idx - 1 );
|
||||
}
|
||||
|
||||
# VxWorks and 2.4Ghz - count down from maximum of 16
|
||||
else {
|
||||
$last = $last + ( 16 - $ssid_idx );
|
||||
}
|
||||
}
|
||||
|
||||
push( @parts, $last );
|
||||
my $bssid = join( ':', map { sprintf( "%02x", $_ ) } @parts );
|
||||
$i_ssidmac{$oid} = $bssid;
|
||||
}
|
||||
|
||||
return \%i_ssidmac;
|
||||
}
|
||||
|
||||
sub i_80211channel {
|
||||
my $airespace = shift;
|
||||
my $partial = shift;
|
||||
@@ -658,6 +759,28 @@ sub i_80211channel {
|
||||
return \%i_80211channel;
|
||||
}
|
||||
|
||||
sub dot11_cur_tx_pwr_mw {
|
||||
my $airespace = shift;
|
||||
my $partial = shift;
|
||||
my $cur = $airespace->airespace_apif_power($partial);
|
||||
my $pwr_abs = $airespace->airespace_apif_a_pwr($partial);
|
||||
|
||||
my $dot11_cur_tx_pwr_mw = {};
|
||||
foreach my $idx ( keys %$cur ) {
|
||||
my $pwr = $cur->{$idx};
|
||||
if ( $pwr >= 1 && $pwr <= 8 ) {
|
||||
|
||||
my @pwr_list = split(/,/, $pwr_abs->{$idx} );
|
||||
$dot11_cur_tx_pwr_mw->{$idx} = $pwr_list[$pwr-1];
|
||||
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
return $dot11_cur_tx_pwr_mw;
|
||||
}
|
||||
|
||||
# Pseudo ENTITY-MIB methods
|
||||
|
||||
sub e_index {
|
||||
@@ -896,6 +1019,54 @@ sub e_parent {
|
||||
return \%e_parent;
|
||||
}
|
||||
|
||||
# arpnip:
|
||||
#
|
||||
# This is the controller snooping on the MAC->IP mappings.
|
||||
# Pretending this is arpnip data allows us to get MAC->IP
|
||||
# mappings even for stations that only communicate locally.
|
||||
# Also use the controller's knowledge of the APs' MAC and
|
||||
# IP addresses to augment the data.
|
||||
|
||||
sub at_paddr {
|
||||
my $airespace = shift;
|
||||
my $mac2ip = $airespace->airespace_sta_ip();
|
||||
my $apethermac = $airespace->airespace_ap_ethermac();
|
||||
|
||||
my $ret = {};
|
||||
foreach my $idx ( keys %$mac2ip ) {
|
||||
next if ( $mac2ip->{ $idx } eq '0.0.0.0' );
|
||||
my $mac = join( ":", map { sprintf "%02x", $_ } split /\./, $idx );
|
||||
$ret->{$idx} = $mac;
|
||||
}
|
||||
foreach my $idx ( keys %$apethermac ) {
|
||||
$ret->{$idx} = $apethermac->{$idx};
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
sub at_netaddr {
|
||||
my $airespace = shift;
|
||||
my $mac2ip = $airespace->airespace_sta_ip();
|
||||
my $ap2ip = $airespace->airespace_ap_ip();
|
||||
|
||||
my $ret = {};
|
||||
foreach my $idx ( keys %$mac2ip ) {
|
||||
next if ( $mac2ip->{ $idx } eq '0.0.0.0' );
|
||||
$ret->{$idx} = $mac2ip->{ $idx };
|
||||
}
|
||||
foreach my $idx ( keys %$ap2ip ) {
|
||||
$ret->{$idx} = $ap2ip->{ $idx };
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
sub munge_64bits {
|
||||
# The controller sometimes hands off a ridiculous value for packets.
|
||||
# Just truncate it to 32 bits.
|
||||
my $value = shift;
|
||||
return $value & 0xffffffff;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
@@ -945,7 +1116,7 @@ Do not use directly.
|
||||
|
||||
=over
|
||||
|
||||
None.
|
||||
=item None.
|
||||
|
||||
=back
|
||||
|
||||
@@ -1071,7 +1242,7 @@ switch.
|
||||
|
||||
=item $airespace->layers()
|
||||
|
||||
Returns 00000011. Class emulates Layer 2 functionality for Thin APs through
|
||||
Returns 00000111. Class emulates Layer 2 functionality for Thin APs through
|
||||
proprietary MIBs.
|
||||
|
||||
=item $airespace->serial()
|
||||
@@ -1100,6 +1271,16 @@ Returns reference to hash. Indicates whether the SSID is broadcast.
|
||||
Returns reference to hash. Current operating frequency channel of the radio
|
||||
interface.
|
||||
|
||||
=item $airespace->dot11_cur_tx_pwr_mw()
|
||||
|
||||
Returns reference to hash. Current transmit power, in milliwatts, of the
|
||||
radio interface.
|
||||
|
||||
=item $airespace->i_ssidmac()
|
||||
|
||||
With the same keys as i_ssidlist, returns the Basic service set
|
||||
identification (BSSID), MAC address, the AP is using for the SSID.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Dot11 Ess Table (C<bsnDot11EssTable>)
|
||||
@@ -1167,6 +1348,12 @@ enabled.
|
||||
|
||||
(C<bsnDot11EssAclName>)
|
||||
|
||||
=item $airespace->airespace_ess_bcast()
|
||||
|
||||
This attribute when enabled allows the switch to broadcast this SSID.
|
||||
|
||||
(C<bsnDot11EssBroadcastSsid>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 AP Table (C<bsnAPTable>)
|
||||
@@ -1270,6 +1457,12 @@ However, if this is enabled, then only those WLANs that appear in the
|
||||
|
||||
(C<bsnAPIfAdminStatus>)
|
||||
|
||||
=item $airespace->airespace_apif_a_pwr()
|
||||
|
||||
List of comma separated absolute power levels supported by the radio.
|
||||
|
||||
(C<bsnAPIfAbsolutePowerList>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Mobile Station Table (C<bsnMobileStationTable>)
|
||||
@@ -1499,15 +1692,15 @@ airespace_if_name() for virtual interfaces.
|
||||
|
||||
=item $airespace->i_description()
|
||||
|
||||
Returns reference to map of IIDs to interface types. Returns C<ifDescr>
|
||||
for Ethernet interfaces, airespace_ap_loc() for thin AP interfaces, and
|
||||
airespace_if_name() for virtual interfaces.
|
||||
Returns reference to map of IIDs to interface descriptions. Returns
|
||||
C<ifDescr> for Ethernet interfaces, airespace_ap_loc() for thin AP
|
||||
interfaces, and airespace_if_name() for virtual interfaces.
|
||||
|
||||
=item $airespace->i_type()
|
||||
|
||||
Returns reference to map of IIDs to interface descriptions. Returns
|
||||
C<ifType> for Ethernet interfaces, airespace_apif_type() for thin AP
|
||||
interfaces, and airespace_if_type() for virtual interfaces.
|
||||
Returns reference to map of IIDs to interface types. Returns C<ifType>
|
||||
for Ethernet interfaces, airespace_apif_type() for thin AP interfaces, and
|
||||
airespace_if_type() for virtual interfaces.
|
||||
|
||||
=item $airespace->i_up()
|
||||
|
||||
@@ -1630,4 +1823,32 @@ entity which 'contains' this entity.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Arp Cache Table Augmentation
|
||||
|
||||
The controller has knowledge of MAC->IP mappings for wireless clients.
|
||||
Augmenting the arp cache data with these MAC->IP mappings enables visibility
|
||||
for stations that only communicate locally.
|
||||
|
||||
=over
|
||||
|
||||
=item $airespace->at_paddr()
|
||||
|
||||
Adds MAC addresses extracted from the index of C<bsnMobileStationIpAddress>.
|
||||
|
||||
=item $airespace->at_netaddr()
|
||||
|
||||
Adds IP addresses from C<bsnMobileStationIpAddress>.
|
||||
|
||||
=back
|
||||
|
||||
=head1 Data Munging Callback Subroutines
|
||||
|
||||
=over
|
||||
|
||||
=item munge_64bits()
|
||||
|
||||
Truncate packet values to 32 bits.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
203
Info/Bridge.pm
203
Info/Bridge.pm
@@ -42,7 +42,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
'BRIDGE-MIB' => 'dot1dBaseBridgeAddress',
|
||||
@@ -55,9 +55,11 @@ $VERSION = '2.00';
|
||||
'b_type' => 'dot1dBaseType',
|
||||
|
||||
# Spanning Tree Protocol
|
||||
'stp_ver' => 'dot1dStpProtocolSpecification',
|
||||
'stp_time' => 'dot1dStpTimeSinceTopologyChange',
|
||||
'stp_root' => 'dot1dStpDesignatedRoot',
|
||||
'stp_ver' => 'dot1dStpProtocolSpecification',
|
||||
'stp_time' => 'dot1dStpTimeSinceTopologyChange',
|
||||
'stp_root' => 'dot1dStpDesignatedRoot',
|
||||
'stp_root_port' => 'dot1dStpRootPort',
|
||||
'stp_priority' => 'dot1dStpPriority',
|
||||
|
||||
# Q-BRIDGE-MIB
|
||||
'qb_vlans_max' => 'dot1qMaxSupportedVlans',
|
||||
@@ -82,6 +84,17 @@ $VERSION = '2.00';
|
||||
'bs_to' => 'dot1dStaticAllowedToGoTo',
|
||||
'bs_status' => 'dot1dStaticStatus',
|
||||
|
||||
# These leafs are not part of a table, but placed here
|
||||
# to return a hash reference to ease API compatibility with
|
||||
# MST and PVST implementations indexed by a spanning tree
|
||||
# instance id
|
||||
'stp_i_mac' => 'dot1dBaseBridgeAddress',
|
||||
'stp_i_time' => 'dot1dStpTimeSinceTopologyChange',
|
||||
'stp_i_ntop' => 'dot1dStpTopChanges',
|
||||
'stp_i_root' => 'dot1dStpDesignatedRoot',
|
||||
'stp_i_root_port' => 'dot1dStpRootPort',
|
||||
'stp_i_priority' => 'dot1dStpPriority',
|
||||
|
||||
# Spanning Tree Protocol Table : dot1dStpPortTable
|
||||
'stp_p_id' => 'dot1dStpPort',
|
||||
'stp_p_priority' => 'dot1dStpPortPriority',
|
||||
@@ -103,6 +116,7 @@ $VERSION = '2.00';
|
||||
|
||||
# Q-BRIDGE-MIB : dot1qVlanStaticTable
|
||||
'v_name' => 'dot1qVlanStaticName',
|
||||
'qb_v_name' => 'dot1qVlanStaticName',
|
||||
'qb_v_egress' => 'dot1qVlanStaticEgressPorts',
|
||||
'qb_v_fbdn_egress' => 'dot1qVlanForbiddenEgressPorts',
|
||||
'qb_v_untagged' => 'dot1qVlanStaticUntaggedPorts',
|
||||
@@ -122,15 +136,18 @@ $VERSION = '2.00';
|
||||
'b_mac' => \&SNMP::Info::munge_mac,
|
||||
'fw_mac' => \&SNMP::Info::munge_mac,
|
||||
'bs_mac' => \&SNMP::Info::munge_mac,
|
||||
'stp_root' => \&SNMP::Info::munge_mac,
|
||||
'stp_root' => \&SNMP::Info::munge_prio_mac,
|
||||
'stp_i_mac' => \&SNMP::Info::munge_mac,
|
||||
'stp_i_root' => \&SNMP::Info::munge_prio_mac,
|
||||
'stp_p_root' => \&SNMP::Info::munge_prio_mac,
|
||||
'stp_p_bridge' => \&SNMP::Info::munge_prio_mac,
|
||||
'stp_p_port' => \&SNMP::Info::munge_prio_mac,
|
||||
'stp_p_port' => \&SNMP::Info::munge_prio_port,
|
||||
'qb_cv_egress' => \&SNMP::Info::munge_port_list,
|
||||
'qb_cv_untagged' => \&SNMP::Info::munge_port_list,
|
||||
'qb_v_egress' => \&SNMP::Info::munge_port_list,
|
||||
'qb_v_fbdn_egress' => \&SNMP::Info::munge_port_list,
|
||||
'qb_v_untagged' => \&SNMP::Info::munge_port_list,
|
||||
'qb_cv_untagged' => \&SNMP::Info::munge_port_list,
|
||||
|
||||
);
|
||||
|
||||
@@ -155,6 +172,29 @@ sub qb_fw_mac {
|
||||
return $qb_fw_mac;
|
||||
}
|
||||
|
||||
sub qb_fw_vlan {
|
||||
my $bridge = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $qb_fw_port = $bridge->qb_fw_port($partial);
|
||||
my $qb_fdb_ids = $bridge->qb_fdb_index() || {};
|
||||
|
||||
|
||||
my $qb_fw_vlan = {};
|
||||
foreach my $idx ( keys %$qb_fw_port ) {
|
||||
my ( $fdb_id, $mac ) = _qb_fdbtable_index($idx);
|
||||
# Many devices do not populate the dot1qVlanCurrentTable, so default
|
||||
# to FDB ID = VID, but if we have a mapping use it.
|
||||
my $vlan = $fdb_id;
|
||||
# defined as test since some devices have a vlan 0
|
||||
if (defined $qb_fdb_ids->{$fdb_id}) {
|
||||
$vlan = $qb_fdb_ids->{$fdb_id};
|
||||
}
|
||||
$qb_fw_vlan->{$idx} = $vlan;
|
||||
}
|
||||
return $qb_fw_vlan;
|
||||
}
|
||||
|
||||
sub qb_i_vlan_t {
|
||||
my $bridge = shift;
|
||||
my $partial = shift;
|
||||
@@ -173,6 +213,54 @@ sub qb_i_vlan_t {
|
||||
return $i_vlan;
|
||||
}
|
||||
|
||||
sub qb_fdb_index {
|
||||
my $bridge = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# Some devices may not implement TimeFilter in a standard manner
|
||||
# appearing to loop on this request. Override in the device class,
|
||||
# see Enterasys for example.
|
||||
my $qb_fdb_ids = $bridge->dot1qVlanFdbId() || {};
|
||||
|
||||
# Strip the TimeFilter
|
||||
my $vl_fdb_index = {};
|
||||
for my $fdb_entry (keys(%$qb_fdb_ids)) {
|
||||
(my $vlan = $fdb_entry) =~ s/^\d+\.//;
|
||||
$vl_fdb_index->{$qb_fdb_ids->{$fdb_entry}} = $vlan;
|
||||
}
|
||||
|
||||
return $vl_fdb_index;
|
||||
}
|
||||
|
||||
# Most devices now support Q-BRIDGE-MIB, fall back to
|
||||
# BRIDGE-MIB for those that don't.
|
||||
sub fw_mac {
|
||||
my $bridge = shift;
|
||||
|
||||
my $qb = $bridge->qb_fw_mac();
|
||||
return $qb if (ref {} eq ref $qb and scalar keys %$qb);
|
||||
|
||||
return $bridge->SUPER::fw_mac();
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $bridge = shift;
|
||||
|
||||
my $qb = $bridge->qb_fw_port();
|
||||
return $qb if (ref {} eq ref $qb and scalar keys %$qb);
|
||||
|
||||
return $bridge->SUPER::fw_port();
|
||||
}
|
||||
|
||||
sub fw_status {
|
||||
my $bridge = shift;
|
||||
|
||||
my $qb = $bridge->qb_fw_status();
|
||||
return $qb if (ref {} eq ref $qb and scalar keys %$qb);
|
||||
|
||||
return $bridge->SUPER::fw_status();
|
||||
}
|
||||
|
||||
sub i_stp_state {
|
||||
my $bridge = shift;
|
||||
my $partial = shift;
|
||||
@@ -292,24 +380,37 @@ sub i_vlan {
|
||||
return $i_vlan;
|
||||
}
|
||||
|
||||
sub i_untagged { goto &i_vlan }
|
||||
|
||||
sub i_vlan_membership {
|
||||
my $bridge = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $index = $bridge->bp_index();
|
||||
# Use VlanCurrentTable if available since it will include dynamic
|
||||
# VLANs. However, some devices do not populate the table.
|
||||
my $v_ports = $bridge->qb_cv_egress() || $bridge->qb_v_egress();
|
||||
|
||||
return $bridge->_vlan_hoa($v_ports, $partial);
|
||||
}
|
||||
|
||||
sub i_vlan_membership_untagged {
|
||||
my $bridge = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# Use VlanCurrentTable if available since it will include dynamic
|
||||
# VLANs. However, some devices do not populate the table.
|
||||
my $v_ports = $bridge->qb_cv_untagged() || $bridge->qb_v_untagged();
|
||||
|
||||
# 11/07 - Todo: Issue with some devices trying to query VlanCurrentTable
|
||||
# as table may grow very large with frequent VLAN changes.
|
||||
# 06/08 - VlanCurrentTable may be due to timefilter, should query with
|
||||
# zero partial for no time filter.
|
||||
# my $v_ports = $bridge->qb_cv_egress() || $bridge->qb_v_egress();
|
||||
return $bridge->_vlan_hoa($v_ports, $partial);
|
||||
}
|
||||
|
||||
my $v_ports = $bridge->qb_v_egress() || {};
|
||||
sub _vlan_hoa {
|
||||
my $bridge = shift;
|
||||
my ( $v_ports, $partial ) = @_;
|
||||
|
||||
my $i_vlan_membership = {};
|
||||
my $index = $bridge->bp_index();
|
||||
|
||||
my $vlan_hoa = {};
|
||||
foreach my $idx ( keys %$v_ports ) {
|
||||
next unless ( defined $v_ports->{$idx} );
|
||||
my $portlist = $v_ports->{$idx};
|
||||
@@ -329,10 +430,10 @@ sub i_vlan_membership {
|
||||
my $ifindex = $index->{$port};
|
||||
next unless ( defined($ifindex) ); # shouldn't happen
|
||||
next if ( defined $partial and $ifindex !~ /^$partial$/ );
|
||||
push( @{ $i_vlan_membership->{$ifindex} }, $vlan );
|
||||
push( @{ $vlan_hoa->{$ifindex} }, $vlan );
|
||||
}
|
||||
}
|
||||
return $i_vlan_membership;
|
||||
return $vlan_hoa;
|
||||
}
|
||||
|
||||
sub set_i_pvid {
|
||||
@@ -349,6 +450,8 @@ sub set_i_vlan {
|
||||
return;
|
||||
}
|
||||
|
||||
sub set_i_untagged { goto &set_i_vlan }
|
||||
|
||||
sub set_add_i_vlan_tagged {
|
||||
my $bridge = shift;
|
||||
|
||||
@@ -581,6 +684,10 @@ to a hash.
|
||||
|
||||
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
|
||||
|
||||
=item $vtp->i_untagged()
|
||||
|
||||
An alias for C<i_vlan>.
|
||||
|
||||
=item $bridge->i_vlan_membership()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
@@ -596,11 +703,21 @@ IDs. These are the VLANs which are members of the egress list for the port.
|
||||
print "Port: $port VLAN: $vlan\n";
|
||||
}
|
||||
|
||||
=item $bridge->i_vlan_membership_untagged()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
IDs. These are the VLANs which are members of the untagged egress list for
|
||||
the port.
|
||||
|
||||
=item $bridge->qb_i_vlan_t()
|
||||
|
||||
Returns reference to hash: key = C<dot1dBasePort>, value = either 'trunk' for
|
||||
tagged ports or the VLAN ID.
|
||||
|
||||
=item $bridge->qb_fdb_index()
|
||||
|
||||
Returns reference to hash: key = VLAN ID, value = FDB ID.
|
||||
|
||||
=item $bridge->v_index()
|
||||
|
||||
Returns VLAN IDs
|
||||
@@ -628,7 +745,7 @@ identifier (iid)
|
||||
|
||||
Returns reference to hash of forwarding table entries status
|
||||
|
||||
(C<dot2dTpFdbStatus>)
|
||||
(C<dot1dTpFdbStatus>)
|
||||
|
||||
=back
|
||||
|
||||
@@ -654,6 +771,48 @@ to this port.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Spanning Tree Instance Globals
|
||||
|
||||
These are not part of a table, but return a hash reference to ease API
|
||||
compatibility with MST and PVST implementations indexed by a spanning tree
|
||||
instance id.
|
||||
|
||||
=over
|
||||
|
||||
=item $bridge->stp_i_time()
|
||||
|
||||
Returns time since last topology change detected. (100ths/second)
|
||||
|
||||
(C<dot1dStpTimeSinceTopologyChange>)
|
||||
|
||||
=item $bridge->stp_i_time()
|
||||
|
||||
Returns the total number of topology changes detected.
|
||||
|
||||
(C<dot1dStpTopChanges>)
|
||||
|
||||
=item $bridge->stp_i_root()
|
||||
|
||||
Returns root of STP.
|
||||
|
||||
(C<dot1dStpDesignatedRoot>)
|
||||
|
||||
=item $bridge->stp_i_root_port()
|
||||
|
||||
Returns the port number of the port that offers the lowest cost path
|
||||
to the root bridge.
|
||||
|
||||
(C<dot1dStpRootPort>)
|
||||
|
||||
=item $bridge->stp_i_priority()
|
||||
|
||||
Returns the port number of the port that offers the lowest cost path
|
||||
to the root bridge.
|
||||
|
||||
(C<dot1dStpPriority>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Spanning Tree Protocol Table (C<dot1dStpPortTable>)
|
||||
|
||||
Descriptions are straight from F<BRIDGE-MIB.my>
|
||||
@@ -852,6 +1011,10 @@ identifier (iid)
|
||||
|
||||
(C<dot1qTpFdbPort>)
|
||||
|
||||
=item $bridge->qb_fw_vlan()
|
||||
|
||||
Returns reference to hash of forwarding table entries VLAN ID
|
||||
|
||||
=item $bridge->qb_fw_status()
|
||||
|
||||
Returns reference to hash of forwarding table entries status
|
||||
@@ -873,6 +1036,10 @@ operations.
|
||||
|
||||
Currently unsupported. Throws an error and returns.
|
||||
|
||||
=item $bridge->set_i_untagged(vlan, ifIndex)
|
||||
|
||||
An alias for C<set_i_vlan>.
|
||||
|
||||
=item $bridge->set_i_pvid(pvid, ifIndex)
|
||||
|
||||
Currently unsupported. Throws an error and returns.
|
||||
@@ -885,4 +1052,6 @@ Currently unsupported. Throws an error and returns.
|
||||
|
||||
Currently unsupported. Throws an error and returns.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
266
Info/CDP.pm
266
Info/CDP.pm
@@ -40,9 +40,10 @@ use SNMP::Info;
|
||||
@SNMP::Info::CDP::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CDP::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MUNGE $INIT/;
|
||||
use vars
|
||||
qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MUNGE $INIT %CDP_CAPABILITIES/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
# Five data structures required by SNMP::Info
|
||||
%MIBS = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' );
|
||||
@@ -53,36 +54,53 @@ $VERSION = '2.00';
|
||||
'cdp_run' => 'cdpGlobalRun',
|
||||
'cdp_interval' => 'cdpGlobalMessageInterval',
|
||||
'cdp_holdtime' => 'cdpGlobalHoldTime',
|
||||
'cdp_id' => 'cdpGlobalDeviceId',
|
||||
'cdp_gid' => 'cdpGlobalDeviceId',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
'c_index' => 'cdpCacheIfIndex',
|
||||
'c_proto' => 'cdpCacheAddressType',
|
||||
'c_addr' => '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',
|
||||
'c_power' => 'cdpCachePowerConsumption',
|
||||
'cdp_index' => 'cdpCacheIfIndex',
|
||||
'cdp_proto' => 'cdpCacheAddressType',
|
||||
'cdp_addr' => 'cdpCacheAddress',
|
||||
'cdp_ver' => 'cdpCacheVersion',
|
||||
'cdp_dev_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' => \&SNMP::Info::munge_caps,
|
||||
'c_platform' => \&SNMP::Info::munge_null,
|
||||
'c_domain' => \&SNMP::Info::munge_null,
|
||||
'c_port' => \&SNMP::Info::munge_null,
|
||||
'c_id' => \&SNMP::Info::munge_null,
|
||||
'c_ver' => \&SNMP::Info::munge_null,
|
||||
'c_ip' => \&SNMP::Info::munge_ip,
|
||||
'c_power' => \&munge_power,
|
||||
'cdp_capabilities' => \&SNMP::Info::munge_bits,
|
||||
'cdp_platform' => \&SNMP::Info::munge_null,
|
||||
'cdp_domain' => \&SNMP::Info::munge_null,
|
||||
'cdp_port' => \&SNMP::Info::munge_null,
|
||||
'cdp_ver' => \&SNMP::Info::munge_null,
|
||||
'cdp_ip' => \&SNMP::Info::munge_ip,
|
||||
'cdp_power' => \&munge_power,
|
||||
|
||||
);
|
||||
|
||||
%CDP_CAPABILITIES = (
|
||||
'Router' => 0x001,
|
||||
'Trans-Bridge' => 0x002,
|
||||
'Source-Route-Bridge' => 0x004,
|
||||
'Switch' => 0x008,
|
||||
'Host' => 0x010,
|
||||
'IGMP' => 0x020,
|
||||
'Repeater' => 0x040,
|
||||
'VoIP-Phone' => 0x080,
|
||||
'Remotely-Managed-Device' => 0x100,
|
||||
'Supports-STP-Dispute' => 0x200,
|
||||
'Two-port Mac Relay' => 0x400,
|
||||
);
|
||||
|
||||
sub munge_power {
|
||||
my $power = shift;
|
||||
my $decimal = substr( $power, -3 );
|
||||
@@ -97,63 +115,114 @@ sub hasCDP {
|
||||
|
||||
# SNMP v1 clients dont have the globals
|
||||
if ( defined $ver and $ver == 1 ) {
|
||||
my $c_ip = $cdp->c_ip();
|
||||
my $cdp_ip = $cdp->cdp_ip();
|
||||
|
||||
# See if anything in cdp cache, if so we have cdp
|
||||
return 1 if ( defined $c_ip and scalar( keys %$c_ip ) );
|
||||
return 1 if ( defined $cdp_ip and scalar( keys %$cdp_ip ) );
|
||||
return;
|
||||
}
|
||||
|
||||
return $cdp->cdp_run();
|
||||
}
|
||||
|
||||
sub c_if {
|
||||
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 ) {
|
||||
my $cdp_ip = $cdp->cdp_ip();
|
||||
unless ( defined $cdp_ip ) {
|
||||
$cdp->error_throw(
|
||||
"SNMP::Info::CDP:c_if() - Device doesn't have cdp_ip() data. Can't fake cdp_index()"
|
||||
"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 ) {
|
||||
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+$//;
|
||||
$c_if{$key} = $iid;
|
||||
$cdp_if{$key} = $iid;
|
||||
}
|
||||
|
||||
return \%c_if;
|
||||
return \%cdp_if;
|
||||
}
|
||||
|
||||
sub c_ip {
|
||||
sub cdp_ip {
|
||||
my $cdp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $c_addr = $cdp->c_addr($partial) || {};
|
||||
my $c_proto = $cdp->c_proto($partial) || {};
|
||||
my $cdp_addr = $cdp->cdp_addr($partial) || {};
|
||||
my $cdp_proto = $cdp->cdp_proto($partial) || {};
|
||||
|
||||
my %c_ip;
|
||||
foreach my $key ( keys %$c_addr ) {
|
||||
my $addr = $c_addr->{$key};
|
||||
my $proto = $c_proto->{$key};
|
||||
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 ) );
|
||||
$c_ip{$key} = $ip;
|
||||
$cdp_ip{$key} = $ip;
|
||||
}
|
||||
return \%c_ip;
|
||||
return \%cdp_ip;
|
||||
}
|
||||
|
||||
sub cdp_cap {
|
||||
my $cdp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# Some devices return a hex-string, others return a space separated
|
||||
# string, we need the raw data to determine return value and
|
||||
# take appropriate action
|
||||
my $cdp_caps = $cdp->cdp_capabilities_raw($partial) || {};
|
||||
|
||||
my %cdp_cap;
|
||||
foreach my $key ( keys %$cdp_caps ) {
|
||||
my $cap_raw = $cdp_caps->{$key};
|
||||
next unless $cap_raw;
|
||||
|
||||
# Simple check, smallest single string is either Host or IGMP with a
|
||||
# space added on the end for a length of 5, hex string is normally
|
||||
# 4 bytes, but since only one byte was traditionally needed process
|
||||
# as hex for a length of 4 or less
|
||||
if ( length $cap_raw < 5 ) {
|
||||
my $cap_hex = join( '',
|
||||
map { sprintf "%x", $_ } unpack( 'C*', $cap_raw ) );
|
||||
foreach my $capability ( keys %CDP_CAPABILITIES ) {
|
||||
if ( ( hex $cap_hex ) & $CDP_CAPABILITIES{$capability} ) {
|
||||
push( @{ $cdp_cap{$key} }, $capability );
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
my @caps = split /\s/, $cap_raw;
|
||||
push( @{ $cdp_cap{$key} }, @caps );
|
||||
}
|
||||
}
|
||||
return \%cdp_cap;
|
||||
}
|
||||
|
||||
sub cdp_id {
|
||||
my $cdp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ch = $cdp->cdp_dev_id($partial) || {};
|
||||
|
||||
my %cdp_id;
|
||||
foreach my $key ( sort keys %$ch ) {
|
||||
my $id = $ch->{$key};
|
||||
next unless $id;
|
||||
$id = SNMP::Info::munge_mac($id) || SNMP::Info::munge_null($id);
|
||||
$cdp_id{$key} = $id;
|
||||
}
|
||||
return \%cdp_id;
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -184,15 +253,15 @@ Max Baker
|
||||
|
||||
# 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";
|
||||
}
|
||||
|
||||
@@ -256,7 +325,7 @@ Time in seconds that CDP messages are kept.
|
||||
|
||||
(C<cdpGlobalHoldTime>)
|
||||
|
||||
=item $cdp->cdp_id()
|
||||
=item $cdp->cdp_gid()
|
||||
|
||||
Returns CDP device ID.
|
||||
|
||||
@@ -276,153 +345,170 @@ 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
|
||||
table below.
|
||||
|
||||
From L<http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm#18843>:
|
||||
binary string, MSB. Each digit represents a bit from the table below from
|
||||
the CDP Capabilities Mapping to Smartport Type table within the
|
||||
Cisco Small Business 200 Series Smart Switch Administration Guide,
|
||||
L<http://www.cisco.com/c/en/us/support/switches/small-business-200-series-smart-switches/products-maintenance-guides-list.html>:
|
||||
|
||||
(Bit) - Description
|
||||
|
||||
=over
|
||||
|
||||
=item (0x40) - Provides level 1 functionality.
|
||||
=item (0x400) - Two-Port MAC Relay.
|
||||
|
||||
=item (0x20) - The bridge or switch does not forward IGMP Report packets on
|
||||
=item (0x200) - CAST Phone Port / CVTA / Supports-STP-Dispute depending
|
||||
upon platform.
|
||||
|
||||
=item (0x100) - Remotely-Managed Device.
|
||||
|
||||
=item (0x80) - VoIP Phone.
|
||||
|
||||
=item (0x40) - Provides level 1 functionality.
|
||||
|
||||
=item (0x20) - The bridge or switch does not forward IGMP Report packets on
|
||||
non router ports.
|
||||
|
||||
=item (0x10) - Sends and receives packets for at least one network layer
|
||||
=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
|
||||
=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
|
||||
=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 (0x02) - Performs level 2 transparent bridging.
|
||||
|
||||
=item (0x01) - Performs level 3 routing for at least one network layer
|
||||
=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 for a pointer to the original information and
|
||||
CPAN user Alex for updates.
|
||||
|
||||
(C<cdpCacheCapabilities>)
|
||||
|
||||
=item $cdp->c_domain()
|
||||
=item $cdp->cdp_domain()
|
||||
|
||||
Returns remote VTP Management Domain as defined in
|
||||
C<CISCO-VTP-MIB::managementDomainName>
|
||||
|
||||
(C<cdpCacheVTPMgmtDomain>)
|
||||
|
||||
=item $cdp->c_duplex()
|
||||
=item $cdp->cdp_duplex()
|
||||
|
||||
Returns the port duplex status from remote devices.
|
||||
|
||||
(C<cdpCacheDuplex>)
|
||||
|
||||
=item $cdp->c_id()
|
||||
=item $cdp->cdp_id()
|
||||
|
||||
Returns remote device id string
|
||||
|
||||
(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
|
||||
Note that a lot devices don't implement $cdp->cdp_index(), So if it isn't
|
||||
around, we fake it.
|
||||
|
||||
In order to map the cdp table entry back to the interfaces() entry, we
|
||||
truncate the last number off of it :
|
||||
|
||||
# it exists, yay.
|
||||
my $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()
|
||||
Most devices don't implement this, so you probably want to use $cdp->cdp_if()
|
||||
instead.
|
||||
|
||||
See c_if() entry.
|
||||
See cdp_if() entry.
|
||||
|
||||
(C<cdpCacheIfIndex>)
|
||||
|
||||
=item $cdp->c_ip()
|
||||
=item $cdp->cdp_ip()
|
||||
|
||||
If $cdp->c_proto() is supported, returns remote IPV4 address only. Otherwise
|
||||
If $cdp->cdp_proto() is supported, returns remote IPV4 address only. Otherwise
|
||||
it will return all addresses.
|
||||
|
||||
(C<cdpCacheAddress>)
|
||||
|
||||
=item $cdp->c_addr()
|
||||
=item $cdp->cdp_addr()
|
||||
|
||||
Returns remote address
|
||||
|
||||
(C<cdpCacheAddress>)
|
||||
|
||||
=item $cdp->c_platform()
|
||||
=item $cdp->cdp_platform()
|
||||
|
||||
Returns remote platform id
|
||||
|
||||
(C<cdpCachePlatform>)
|
||||
|
||||
=item $cdp->c_port()
|
||||
=item $cdp->cdp_port()
|
||||
|
||||
Returns remote port ID
|
||||
|
||||
(C<cdpDevicePort>)
|
||||
|
||||
=item $cdp->c_proto()
|
||||
=item $cdp->cdp_proto()
|
||||
|
||||
Returns remote address type received. Usually IP.
|
||||
|
||||
(C<cdpCacheAddressType>)
|
||||
|
||||
=item $cdp->c_ver()
|
||||
=item $cdp->cdp_ver()
|
||||
|
||||
Returns remote hardware version
|
||||
|
||||
(C<cdpCacheVersion>)
|
||||
|
||||
=item $cdp->c_vlan()
|
||||
=item $cdp->cdp_vlan()
|
||||
|
||||
Returns the remote interface native VLAN.
|
||||
|
||||
(C<cdpCacheNativeVLAN>)
|
||||
|
||||
=item $cdp->c_power()
|
||||
=item $cdp->cdp_power()
|
||||
|
||||
Returns the amount of power consumed by remote device in milliwatts munged
|
||||
for decimal placement.
|
||||
|
||||
(C<cdpCachePowerConsumption>)
|
||||
|
||||
=item $cdp->cdp_cap()
|
||||
|
||||
Returns hash of arrays with each array containing the system capabilities
|
||||
supported by the remote system. Possible elements in the array are
|
||||
C<Router>, C<Trans-Bridge>, C<Source-Route-Bridge>, C<Switch>, C<Host>,
|
||||
C<IGMP>, C<Repeater>, C<VoIP-Phone>, C<Remotely-Managed-Device>,
|
||||
C<Supports-STP-Dispute>, and C<Two-port Mac Relay>.
|
||||
|
||||
=back
|
||||
|
||||
=head1 Data Munging Callback Subroutines
|
||||
|
||||
150
Info/CiscoAgg.pm
Normal file
150
Info/CiscoAgg.pm
Normal file
@@ -0,0 +1,150 @@
|
||||
# SNMP::Info::CiscoAgg
|
||||
#
|
||||
# Copyright (c) 2014 SNMP::Info Developers
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoAgg;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::IEEE802dot3ad 'agg_ports_lag';
|
||||
|
||||
@SNMP::Info::CiscoAgg::ISA = qw/
|
||||
SNMP::Info::IEEE802dot3ad
|
||||
Exporter
|
||||
/;
|
||||
@SNMP::Info::CiscoAgg::EXPORT_OK = qw/
|
||||
agg_ports
|
||||
/;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::IEEE802dot3ad::MIBS,
|
||||
'CISCO-PAGP-MIB' => 'pagpGroupIfIndex',
|
||||
);
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = ();
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
sub agg_ports_pagp {
|
||||
my $dev = shift;
|
||||
|
||||
# Note that this mapping will miss any interfaces that are down during
|
||||
# polling. If one of the members is up, we could use
|
||||
# pagpAdminGroupCapability to figure things out, but if they're all
|
||||
# down, we're hosed. Since we could be hosed anyway, we skip the fancy
|
||||
# stuff.
|
||||
my $mapping = {};
|
||||
my $group = $dev->pagpGroupIfIndex;
|
||||
for my $slave (keys %$group) {
|
||||
my $master = $group->{$slave};
|
||||
next if($master == 0 || $slave == $master);
|
||||
|
||||
$mapping->{$slave} = $master;
|
||||
}
|
||||
|
||||
return $mapping;
|
||||
}
|
||||
|
||||
# until we have PAgP data and need to combine with LAG data
|
||||
sub agg_ports {
|
||||
my $ret = {%{agg_ports_pagp(@_)}, %{agg_ports_lag(@_)}};
|
||||
return $ret;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoAgg - SNMP Interface to Cisco Aggregated Links
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
SNMP::Info Developers
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $info = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $info->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This class provides access to Aggregated Links configuration on Cisco devices.
|
||||
It combines Cisco PAgP and IEEE 802.3ad information.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
L<SNMP::Info::IEEE802dot3ad>
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-PAGP-MIB>
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
||||
|
||||
=head1 METHODS
|
||||
|
||||
=over 4
|
||||
|
||||
=item C<agg_ports>
|
||||
|
||||
Returns a HASH reference mapping from slave to master port for each member of
|
||||
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
|
||||
ifIndex of the corresponding master ports.
|
||||
|
||||
=item C<agg_ports_pagp>
|
||||
|
||||
Implements the PAgP LAG info retrieval. Merged into C<agg_ports> data
|
||||
automatically.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
'CISCO-CONFIG-COPY-MIB' => 'ccCopyTable',
|
||||
@@ -449,7 +449,7 @@ devices running older code revisions.
|
||||
|
||||
Example:
|
||||
$ciscoconfig->copy_run_tftp('1.2.3.4', 'myconfig')
|
||||
or die Couldn't save config. ",$ciscoconfig->error(1);
|
||||
or die "Couldn't save config. ",$ciscoconfig->error(1);
|
||||
|
||||
=item $ciscoconfig->copy_run_start()
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ use Exporter;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PAECAPABILITIES/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
'CISCO-PORT-SECURITY-MIB' => 'ciscoPortSecurityMIB',
|
||||
|
||||
@@ -39,13 +39,17 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = ( 'CISCO-POWER-ETHERNET-EXT-MIB' => 'cpeExtPsePortEntPhyIndex' );
|
||||
%MIBS = ( 'CISCO-POWER-ETHERNET-EXT-MIB' => 'cpeExtPsePortEntPhyIndex',
|
||||
'CISCO-CDP-MIB' => 'cdpCachePowerConsumption' );
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = ( 'cpeth_ent_phy' => 'cpeExtPsePortEntPhyIndex', );
|
||||
%FUNCS = (
|
||||
'cpeth_ent_phy' => 'cpeExtPsePortEntPhyIndex',
|
||||
'peth_port_power' => 'cpeExtPsePortPwrConsumption',
|
||||
);
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
@@ -69,6 +73,31 @@ sub peth_port_ifindex {
|
||||
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__
|
||||
@@ -143,6 +172,22 @@ to a hash.
|
||||
|
||||
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
|
||||
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = ( 'CISCO-CLASS-BASED-QOS-MIB' => 'cbQosIfIndex', );
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = ( 'CISCO-RTTMON-MIB' => 'rttMonCtrlAdminOwner', );
|
||||
|
||||
|
||||
@@ -32,14 +32,13 @@ package SNMP::Info::CiscoStack;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::CiscoStack::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoStack::ISA = qw/Exporter/;
|
||||
@SNMP::Info::CiscoStack::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = ( 'CISCO-STACK-MIB' => 'ciscoStackMIB', );
|
||||
|
||||
@@ -65,6 +64,7 @@ $VERSION = '2.00';
|
||||
'm_type' => 'moduleType',
|
||||
'm_model' => 'moduleModel',
|
||||
'm_serial' => 'moduleSerialNumber',
|
||||
'm_serial_string' => 'moduleSerialNumberString',
|
||||
'm_status' => 'moduleStatus',
|
||||
'm_name' => 'moduleName',
|
||||
'm_ports' => 'moduleNumPorts',
|
||||
@@ -159,7 +159,7 @@ sub i_duplex {
|
||||
next if ( defined $partial and $iid !~ /^$partial$/ );
|
||||
|
||||
# Test for gigabit
|
||||
if ( $p_duplex_cap->{$port} == 0 ) {
|
||||
if ( defined $p_duplex_cap->{$port} and $p_duplex_cap->{$port} == 0 ) {
|
||||
$i_duplex->{$iid} = 'full';
|
||||
}
|
||||
|
||||
@@ -194,7 +194,7 @@ sub i_duplex_admin {
|
||||
next if ( defined $partial and $iid !~ /^$partial$/ );
|
||||
|
||||
# Test for gigabit
|
||||
if ( $p_duplex_cap->{$port} == 0 ) {
|
||||
if ( defined $p_duplex_cap->{$port} and $p_duplex_cap->{$port} == 1 ) {
|
||||
$i_duplex_admin->{$iid} = 'full';
|
||||
}
|
||||
|
||||
@@ -214,9 +214,8 @@ sub i_speed_admin {
|
||||
my $partial = shift;
|
||||
|
||||
my %i_speed_admin;
|
||||
my $p_port = $stack->p_port() || {};
|
||||
my %mapping = reverse %$p_port;
|
||||
my $p_speed = $stack->p_speed( $mapping{$partial} );
|
||||
my $p_port = $stack->p_port() || {};
|
||||
my $p_speed = $stack->p_speed() || {};
|
||||
|
||||
my %speeds = (
|
||||
'autoDetect' => 'auto',
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# SNMP::Info::CiscoStats
|
||||
# $Id$
|
||||
#
|
||||
# Changes since Version 0.7 Copyright (c) 2008 Max Baker
|
||||
# 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
|
||||
@@ -42,7 +42,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
'SNMPv2-MIB' => 'sysDescr',
|
||||
@@ -50,6 +50,8 @@ $VERSION = '2.00';
|
||||
'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',
|
||||
@@ -59,6 +61,7 @@ $VERSION = '2.00';
|
||||
|
||||
%GLOBALS = (
|
||||
'description' => 'sysDescr',
|
||||
'ent_physical_software_rev' => 'entPhysicalSoftwareRev.1',
|
||||
|
||||
# We will use the numeric OID's so that we don't require people
|
||||
# to install v1 MIBs, which can conflict.
|
||||
@@ -74,6 +77,7 @@ $VERSION = '2.00';
|
||||
|
||||
# OLD-CISCO-SYSTEM-MIB
|
||||
'write_mem' => 'writeMem',
|
||||
'rom_id' => 'romId',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
@@ -84,18 +88,57 @@ $VERSION = '2.00';
|
||||
|
||||
# CISCO-FLASH-MIB::ciscoFlashDeviceTable
|
||||
'cisco_flash_size' => 'ciscoFlashDeviceSize',
|
||||
|
||||
# CISCO-IMAGE-MIB
|
||||
'ci_images' => 'ciscoImageString',
|
||||
);
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub os {
|
||||
my $l2 = shift;
|
||||
my $descr = $l2->description() || '';
|
||||
|
||||
# order here matters - there are Catalysts that run IOS and have catalyst
|
||||
# in their description field.
|
||||
# in their description field, as well as Catalysts that run IOS-XE.
|
||||
return 'ios-xe' if ( $descr =~ /IOS-XE/ );
|
||||
return 'ios-xr' if ( $descr =~ /IOS XR/ );
|
||||
return 'ios' if ( $descr =~ /IOS/ );
|
||||
return 'catalyst' if ( $descr =~ /catalyst/i );
|
||||
return 'css' if ( $descr =~ /Content Switch SW/ );
|
||||
return 'css-sca' if ( $descr =~ /Cisco Systems Inc CSS-SCA-/ );
|
||||
return 'pix' if ( $descr =~ /Cisco PIX Security Appliance/ );
|
||||
return 'asa' if ( $descr =~ /Cisco Adaptive Security Appliance/ );
|
||||
return 'san-os' if ( $descr =~ /Cisco SAN-OS/ );
|
||||
|
||||
if ( $descr =~ /Application Control Engine Service Module/ ) {
|
||||
# Only the admin context implements the entity MIB
|
||||
return 'ace-admin' if defined $l2->ent_physical_software_rev();
|
||||
return 'ace-context';
|
||||
}
|
||||
|
||||
# Pre-version 3 FWSMs
|
||||
return 'fwsm' if ( $descr =~ /Cisco Secure FWSM Firewall/ );
|
||||
|
||||
# Version 3+ FWSMs (currently untested against version 4)
|
||||
if ( $descr =~ /Firewall Services Module/ ) {
|
||||
|
||||
my $model = $l2->model();
|
||||
|
||||
if ( defined $model && $model eq "WsSvcFwm1sc" ) {
|
||||
# Only the admin context implements the entity MIB
|
||||
return 'fwsm-admin' if defined $l2->ent_physical_software_rev();
|
||||
return 'fwsm-context';
|
||||
}
|
||||
|
||||
# Non context mode FWSM
|
||||
return 'fwsm';
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -113,12 +156,85 @@ sub os_ver {
|
||||
return $1;
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os eq 'css'
|
||||
and defined $descr
|
||||
and $descr =~ m/Content Switch SW Version ([0-9\.\(\)]+) with SNMPv1\/v2c Agent/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os eq 'css-sca'
|
||||
and defined $descr
|
||||
and $descr =~ m/Cisco Systems Inc CSS-SCA-2FE-K9, ([0-9\.\(\)]+) Release / )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os eq 'pix'
|
||||
and defined $descr
|
||||
and $descr =~ m/Cisco PIX Security Appliance Version ([0-9\.\(\)]+)/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os eq 'asa'
|
||||
and defined $descr
|
||||
and $descr =~ m/Cisco Adaptive Security Appliance Version ([0-9\.\(\)]+)/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os =~ /^ace/ )
|
||||
{
|
||||
return $l2->ent_physical_software_rev();
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os =~ /^fwsm/
|
||||
and defined $descr
|
||||
and $descr =~ m/Version (\d+\.\d+(\(\d+\)){0,1})/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os eq 'ios-xr'
|
||||
and defined $descr
|
||||
and $descr =~ m/Version (\d+[\.\d]+)/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
# Newer Catalysts and IOS devices
|
||||
if ( defined $descr
|
||||
and $descr =~ m/Version (\d+\.\d+\([^)]+\)[^,\s]*)(,|\s)+/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
# Generic fallback: try to determine running image from CISCO-IMAGE-MIB
|
||||
my $image_info = $l2->ciscoImageString() || {};
|
||||
foreach my $row (keys %$image_info) {
|
||||
my $info_string = $image_info->{$row};
|
||||
if ($info_string =~ /CW_VERSION\$([^\$]+)\$/) {
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub os_bin {
|
||||
my $self = shift;
|
||||
my $rom_id = $self->rom_id();
|
||||
if ($rom_id =~ m/Version ([^,]+),/) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -214,7 +330,7 @@ Devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
Eric Miller, Max Baker, Sam Stickland
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -263,6 +379,10 @@ None.
|
||||
|
||||
=item F<CISCO-FLASH-MIB>
|
||||
|
||||
=item F<ENTITY-MIB>
|
||||
|
||||
=item F<CISCO-IMAGE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
||||
@@ -287,13 +407,41 @@ Returns ios_cpu_5min() or cat_cpu5min(), whichever is available.
|
||||
|
||||
Returns mem_free() + mem_used()
|
||||
|
||||
=item $ciscostats->vendor()
|
||||
|
||||
'cisco'
|
||||
|
||||
=item $ciscostats->os()
|
||||
|
||||
Tries to parse if device is running IOS or CatOS from description()
|
||||
Tries to parse if device is running 'IOS', 'CatOS', 'IOS-XE' or something else
|
||||
from description()
|
||||
|
||||
Available values:
|
||||
|
||||
'ios' for Cisco IOS
|
||||
'ios-xe' for Cisco IOS XE
|
||||
'ios-xr' for Cisco IOS XR
|
||||
'pix' for Cisco PIX
|
||||
'asa' for Cisco ASA
|
||||
'fwsm' for Single-mode FWSM
|
||||
'fwsm-admin' for Admin context of multi-context FWSM
|
||||
'fwsm-context' for Standard context of multi-context FWSM
|
||||
'ace-admin' for Admin context of ACE module
|
||||
'ace-context' for Standard context of ACE module (NB: No OS version
|
||||
detection is available, but will be the same as it's
|
||||
'ace admin')
|
||||
'css' for Cisco Content Switch
|
||||
'css-sca' for Cisco Content Switch Secure Content Acceleration
|
||||
'san-os' for Cisco SAN-OS
|
||||
|
||||
=item $ciscostats->os_ver()
|
||||
|
||||
Tries 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()
|
||||
|
||||
@@ -394,4 +542,16 @@ zero if the device has been removed.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Cisco Image Table (C<ciscoImageTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $ci->ci_images()
|
||||
|
||||
Returns the table of image strings.
|
||||
|
||||
C<ciscoImageString>
|
||||
|
||||
=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.33';
|
||||
|
||||
@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
|
||||
102
Info/CiscoVTP.pm
102
Info/CiscoVTP.pm
@@ -41,7 +41,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
'CISCO-VTP-MIB' => 'vtpVlanName',
|
||||
@@ -149,6 +149,7 @@ sub i_vlan {
|
||||
|
||||
my $port_vlan = $vtp->vtp_trunk_native($partial) || {};
|
||||
my $i_vlan = $vtp->i_vlan2($partial) || {};
|
||||
my $trunk_dyn = $vtp->vtp_trunk_dyn($partial) || {};
|
||||
my $trunk_dyn_stat = $vtp->vtp_trunk_dyn_stat($partial) || {};
|
||||
|
||||
my %i_vlans;
|
||||
@@ -165,15 +166,23 @@ sub i_vlan {
|
||||
foreach my $port ( keys %$port_vlan ) {
|
||||
my $vlan = $port_vlan->{$port};
|
||||
next unless defined $vlan;
|
||||
|
||||
# ports up and trunking should have a trunking status
|
||||
my $stat = $trunk_dyn_stat->{$port};
|
||||
if ( defined $stat and $stat =~ /^trunking/ ) {
|
||||
|
||||
# vtp_trunk_dyn_stat is not useful for down ports
|
||||
# so we use vtp_trunk_dyn to see if trunking is set
|
||||
my $dyn = $trunk_dyn->{$port};
|
||||
|
||||
if (($stat and $stat =~ /^trunking/ )
|
||||
or ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate'))))
|
||||
{
|
||||
$i_vlans{$port} = $vlan;
|
||||
}
|
||||
}
|
||||
|
||||
# Check in CISCO-VLAN-IFTABLE-RELATION-MIB
|
||||
# Is this only for Aironet??? If so, it needs
|
||||
# to be removed from this class
|
||||
# Used for traditional Cisco Routers and Aironet
|
||||
|
||||
my $v_cvi_if = $vtp->v_cvi_if();
|
||||
if ( defined $v_cvi_if ) {
|
||||
@@ -191,6 +200,22 @@ sub i_vlan {
|
||||
return \%i_vlans;
|
||||
}
|
||||
|
||||
sub i_untagged {
|
||||
my $vtp = shift;
|
||||
my ( $ifindex ) = @_;
|
||||
|
||||
# cannot defer to i_vlan - vtp_trunk_dyn_stat is not useful for down ports
|
||||
# so we use vtp_trunk_dyn as a hint to use i_pvid
|
||||
|
||||
my $trunking = eval { $vtp->vtp_trunk_dyn($ifindex)->{$ifindex} };
|
||||
if ($trunking and (($trunking eq 'on') or ($trunking eq 'onNoNegotiate'))) {
|
||||
return $vtp->i_pvid(@_);
|
||||
}
|
||||
else {
|
||||
return $vtp->i_vlan(@_);
|
||||
}
|
||||
}
|
||||
|
||||
sub i_vlan_membership {
|
||||
my $vtp = shift;
|
||||
my $partial = shift;
|
||||
@@ -202,6 +227,8 @@ sub i_vlan_membership {
|
||||
my $vtp_vlans = $vtp->v_state();
|
||||
my $i_vlan = $vtp->i_vlan2($partial) || {};
|
||||
my $trunk_dyn_stat = $vtp->vtp_trunk_dyn_stat($partial) || {};
|
||||
my $trunk_dyn = $vtp->vtp_trunk_dyn($partial) || {};
|
||||
my $i_voice_vlan = $vtp->i_voice_vlan($partial) || {};
|
||||
|
||||
my $i_vlan_membership = {};
|
||||
|
||||
@@ -209,14 +236,24 @@ sub i_vlan_membership {
|
||||
foreach my $port ( keys %$i_vlan ) {
|
||||
my $vlan = $i_vlan->{$port};
|
||||
next unless defined $vlan;
|
||||
my $stat = $trunk_dyn_stat->{$port};
|
||||
if ( defined $stat and $stat =~ /notTrunking/ ) {
|
||||
my $dyn = $trunk_dyn->{$port};
|
||||
unless ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate'))) {
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan );
|
||||
}
|
||||
}
|
||||
|
||||
# Get voice VLANs
|
||||
foreach my $port ( keys %$i_voice_vlan ) {
|
||||
my $vlan = $i_voice_vlan->{$port};
|
||||
next unless defined $vlan;
|
||||
next unless ($vlan =~ m/[[:digit:]]+/ and $vlan < 4095);
|
||||
my $dyn = $trunk_dyn->{$port};
|
||||
unless ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate'))) {
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan );
|
||||
}
|
||||
}
|
||||
|
||||
# Get trunk ports
|
||||
|
||||
my %oper_vlans;
|
||||
foreach my $iid ( keys %$vtp_vlans ) {
|
||||
my $vlan = 0;
|
||||
@@ -233,7 +270,9 @@ sub i_vlan_membership {
|
||||
|
||||
foreach my $port ( keys %$ports_vlans ) {
|
||||
my $stat = $trunk_dyn_stat->{$port};
|
||||
if ( defined $stat and $stat =~ /^trunking/ ) {
|
||||
my $dyn = $trunk_dyn->{$port};
|
||||
if (($stat and $stat =~ /^trunking/ )
|
||||
or ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate')))) {
|
||||
my $k = 0;
|
||||
my $list1 = $ports_vlans->{$port} || '0';
|
||||
my $list2 = $ports_vlans_2k->{$port} || '0';
|
||||
@@ -244,6 +283,7 @@ sub i_vlan_membership {
|
||||
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 ] );
|
||||
}
|
||||
@@ -254,6 +294,20 @@ sub i_vlan_membership {
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
sub i_vlan_membership_untagged {
|
||||
my $vtp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $vlans = $vtp->i_vlan($partial);
|
||||
my $i_vlan_membership = {};
|
||||
foreach my $port (keys %$vlans) {
|
||||
my $vlan = $vlans->{$port};
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan );
|
||||
}
|
||||
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
sub set_i_pvid {
|
||||
my $vtp = shift;
|
||||
my ( $vlan_id, $ifindex ) = @_;
|
||||
@@ -305,6 +359,22 @@ sub set_i_vlan {
|
||||
return;
|
||||
}
|
||||
|
||||
sub set_i_untagged {
|
||||
my $vtp = shift;
|
||||
my ( $vlan_id, $ifindex ) = @_;
|
||||
|
||||
# cannot defer to i_vlan - vtp_trunk_dyn_stat is not useful for down ports
|
||||
# so we use vtp_trunk_dyn as a hint to use i_pvid
|
||||
|
||||
my $trunking = eval { $vtp->vtp_trunk_dyn($ifindex)->{$ifindex} };
|
||||
if ($trunking and (($trunking eq 'on') or ($trunking eq 'onNoNegotiate'))) {
|
||||
return $vtp->set_i_pvid(@_);
|
||||
}
|
||||
else {
|
||||
return $vtp->set_i_vlan(@_);
|
||||
}
|
||||
}
|
||||
|
||||
sub set_add_i_vlan_tagged {
|
||||
my $vtp = shift;
|
||||
my ( $vlan_id, $ifindex ) = @_;
|
||||
@@ -539,6 +609,10 @@ Your device will only implement a subset of these methods.
|
||||
Returns a mapping between C<ifIndex> and assigned VLAN ID for access ports
|
||||
and the default VLAN ID for trunk ports.
|
||||
|
||||
=item $vtp->i_untagged()
|
||||
|
||||
An alias for C<i_vlan>.
|
||||
|
||||
=item $vtp->i_vlan_membership()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
@@ -554,6 +628,12 @@ IDs. These are the VLANs which are members of enabled VLAN list for the port.
|
||||
print "Port: $port VLAN: $vlan\n";
|
||||
}
|
||||
|
||||
=item $vtp->i_vlan_membership_untagged()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
IDs. These are the VLANs which are members of the untagged egress list for
|
||||
the port.
|
||||
|
||||
=back
|
||||
|
||||
=head2 VLAN Table (C<CISCO-VTP-MIB::vtpVlanTable>)
|
||||
@@ -834,6 +914,12 @@ port C<ifIndex>. This method should only be used on trunk ports.
|
||||
$vtp->set_i_pvid('2', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't change port default VLAN. ",$vtp->error(1);
|
||||
|
||||
=item $vtp->set_i_untagged ( vlan, ifIndex )
|
||||
|
||||
This method attempts to work out whether the port referenced by ifIndex is
|
||||
trunking, and if so will return the value of C<set_i_pvid>. Otherwise, the
|
||||
value of C<set_i_vlan> is returned.
|
||||
|
||||
=item $vtp->set_add_i_vlan_tagged ( vlan, ifIndex )
|
||||
|
||||
Adds the VLAN to the enabled VLANs list of the port, must be supplied with the
|
||||
|
||||
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.33';
|
||||
|
||||
%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
|
||||
|
||||
@@ -41,7 +41,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = ( 'ENTITY-MIB' => 'entPhysicalSerialNum' );
|
||||
|
||||
@@ -138,7 +138,7 @@ Max Baker
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
F<ENTITY-MIB> is used by Layer 2 devices from HP, Aironet, Foundry, Cisco,
|
||||
F<ENTITY-MIB> is used by Layer 2 devices from Brocade, Cisco, HP,
|
||||
and more.
|
||||
|
||||
See RFC 2737 for full details.
|
||||
@@ -207,7 +207,7 @@ Human Friendly
|
||||
|
||||
=item $entity->e_fru()
|
||||
|
||||
BOOLEAN. Field Replaceable unit?
|
||||
BOOLEAN. Is a Field Replaceable unit?
|
||||
|
||||
(C<entPhysicalFRU>)
|
||||
|
||||
|
||||
@@ -41,9 +41,9 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = ( 'ETHERLIKE-MIB' => 'etherMIB' );
|
||||
%MIBS = ( 'EtherLike-MIB' => 'etherMIB' );
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
|
||||
84
Info/FDP.pm
84
Info/FDP.pm
@@ -42,18 +42,11 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = ( 'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snFdpGlobalRun' );
|
||||
|
||||
%GLOBALS = (
|
||||
|
||||
# CDP-Compatibility
|
||||
'cdp_interval' => 'snFdpGlobalMessageInterval',
|
||||
'cdp_holdtime' => 'snFdpGlobalHoldTime',
|
||||
'cdp_id' => 'snFdpGlobalDeviceId',
|
||||
|
||||
#
|
||||
'fdp_run' => 'snFdpGlobalRun',
|
||||
'fdp_interval' => 'snFdpGlobalMessageInterval',
|
||||
'fdp_holdtime' => 'snFdpGlobalHoldTime',
|
||||
@@ -61,27 +54,27 @@ $VERSION = '2.00';
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
'c_index' => 'snFdpCacheIfIndex',
|
||||
'c_proto' => 'snFdpCacheAddressType',
|
||||
'c_ip' => 'snFdpCacheAddress',
|
||||
'c_ver' => 'snFdpCacheVersion',
|
||||
'c_id' => 'snFdpCacheDeviceId',
|
||||
'c_port' => 'snFdpCacheDevicePort',
|
||||
'c_platform' => 'snFdpCachePlatform',
|
||||
'c_capabilities' => 'snFdpCacheCapabilities',
|
||||
'c_domain' => 'snFdpCacheVTPMgmtDomain',
|
||||
'c_vlan' => 'snFdpCacheNativeVLAN',
|
||||
'c_duplex' => 'snFdpCacheDuplex',
|
||||
'fdp_index' => 'snFdpCacheIfIndex',
|
||||
'fdp_proto' => 'snFdpCacheAddressType',
|
||||
'fdp_ip' => 'snFdpCacheAddress',
|
||||
'fdp_ver' => 'snFdpCacheVersion',
|
||||
'fdp_id' => 'snFdpCacheDeviceId',
|
||||
'fdp_port' => 'snFdpCacheDevicePort',
|
||||
'fdp_platform' => 'snFdpCachePlatform',
|
||||
'fdp_capabilities' => 'snFdpCacheCapabilities',
|
||||
'fdp_domain' => 'snFdpCacheVTPMgmtDomain',
|
||||
'fdp_vlan' => 'snFdpCacheNativeVLAN',
|
||||
'fdp_duplex' => 'snFdpCacheDuplex',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'c_capabilities' => \&SNMP::Info::munge_caps,
|
||||
'c_ip' => \&SNMP::Info::munge_ip
|
||||
'fdp_capabilities' => \&SNMP::Info::munge_bits,
|
||||
'fdp_ip' => \&SNMP::Info::munge_ip
|
||||
);
|
||||
|
||||
sub cdp_run {
|
||||
sub fdp_run {
|
||||
my $fdp = shift;
|
||||
my $fdp_run = $fdp->fdp_run();
|
||||
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;
|
||||
@@ -107,7 +100,7 @@ sub hasFDP {
|
||||
return $fdp->fdp_run();
|
||||
}
|
||||
|
||||
sub c_if {
|
||||
sub fdp_if {
|
||||
my $fdp = shift;
|
||||
|
||||
# See if by some miracle Cisco implemented the fdpCacheIfIndex entry
|
||||
@@ -115,7 +108,7 @@ sub c_if {
|
||||
return $fdp_index if defined $fdp_index;
|
||||
|
||||
# Nope, didn't think so. Now we fake it.
|
||||
my $fdp_ip = $fdp->c_ip();
|
||||
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()"
|
||||
@@ -185,8 +178,7 @@ interface to FDP information through SNMP.
|
||||
FDP is a Layer 2 protocol that supplies topology information of
|
||||
devices that also speak FDP, mostly switches and routers. It has
|
||||
similar functionality to Cisco's CDP, and the SNMP interface is
|
||||
virtually identical. FDP is implemented in Foundry devices, including
|
||||
the Bigiron and Fastiron range.
|
||||
virtually identical. FDP is implemented in Brocade (Foundry) devices.
|
||||
|
||||
Create or use a device subclass that inherits this class. Do not use
|
||||
directly.
|
||||
@@ -256,19 +248,19 @@ CDP compatibility
|
||||
|
||||
=over
|
||||
|
||||
=item $fdp->c_interval()
|
||||
=item $fdp->fdp_interval()
|
||||
|
||||
Interval in seconds at which FDP messages are generated.
|
||||
|
||||
(C<fdpGlobalMessageInterval>)
|
||||
|
||||
=item $fdp->c_holdtime()
|
||||
=item $fdp->fdp_holdtime()
|
||||
|
||||
Time in seconds that FDP messages are kept.
|
||||
|
||||
(C<fdpGlobalHoldTime>)
|
||||
|
||||
=item $fdp->c_id()
|
||||
=item $fdp->fdp_id()
|
||||
|
||||
Returns FDP device ID.
|
||||
|
||||
@@ -277,7 +269,7 @@ retrieved from remote devices with $fdp->id().
|
||||
|
||||
(C<fdpGlobalDeviceId>)
|
||||
|
||||
=item $cdp->cdp_run()
|
||||
=item $fdp->fdp_run()
|
||||
|
||||
Is FDP enabled on this device?
|
||||
|
||||
@@ -294,11 +286,10 @@ CDP compatibility
|
||||
|
||||
=over
|
||||
|
||||
=item $fdp->c_capabilities()
|
||||
=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.
|
||||
binary string, MSB. Each digit represents a bit from the table below.
|
||||
|
||||
From L<http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm#18843>:
|
||||
|
||||
@@ -328,31 +319,30 @@ protocol.
|
||||
|
||||
=back
|
||||
|
||||
Thanks to Martin Lorensen C<martin -at- lorensen.dk> for a pointer to
|
||||
this information.
|
||||
Thanks to Martin Lorensen for a pointer to this information.
|
||||
|
||||
(C<fdpCacheCapabilities>)
|
||||
|
||||
=item $fdp->c_domain()
|
||||
=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->c_duplex()
|
||||
=item $fdp->fdp_duplex()
|
||||
|
||||
Returns the port duplex status from remote devices.
|
||||
|
||||
(C<fdpCacheDuplex>)
|
||||
|
||||
=item $fdp->c_id()
|
||||
=item $fdp->fdp_id()
|
||||
|
||||
Returns remote device id string
|
||||
|
||||
(C<fdpCacheDeviceId>)
|
||||
|
||||
=item $fdp->c_if()
|
||||
=item $fdp->fdp_if()
|
||||
|
||||
Returns the mapping to the SNMP Interface Table.
|
||||
|
||||
@@ -380,7 +370,7 @@ truncate the last number off of it :
|
||||
return \%fdp_if;
|
||||
|
||||
|
||||
=item $fdp->c_index()
|
||||
=item $fdp->fdp_index()
|
||||
|
||||
Returns the mapping to the SNMP2 Interface table for FDP Cache Entries.
|
||||
|
||||
@@ -391,37 +381,37 @@ See fdp_if() entry.
|
||||
|
||||
(C<fdpCacheIfIndex>)
|
||||
|
||||
=item $fdp->c_ip()
|
||||
=item $fdp->fdp_ip()
|
||||
|
||||
Returns remote IP address
|
||||
|
||||
(C<fdpCacheAddress>)
|
||||
|
||||
=item $fdp->c_platform()
|
||||
=item $fdp->fdp_platform()
|
||||
|
||||
Returns remote platform id
|
||||
|
||||
(C<fdpCachePlatform>)
|
||||
|
||||
=item $fdp->c_port()
|
||||
=item $fdp->fdp_port()
|
||||
|
||||
Returns remote port ID
|
||||
|
||||
(C<fdpDevicePort>)
|
||||
|
||||
=item $fdp->c_proto()
|
||||
=item $fdp->fdp_proto()
|
||||
|
||||
Returns remote address type received. Usually IP.
|
||||
|
||||
(C<fdpCacheAddressType>)
|
||||
|
||||
=item $fdp->c_ver()
|
||||
=item $fdp->fdp_ver()
|
||||
|
||||
Returns remote hardware version
|
||||
|
||||
(C<fdpCacheVersion>)
|
||||
|
||||
=item $fdp->c_vlan()
|
||||
=item $fdp->fdp_vlan()
|
||||
|
||||
Returns the remote interface native VLAN.
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ use Exporter;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = ( 'IEEE802dot11-MIB' => 'dot11DesiredSSID', );
|
||||
|
||||
|
||||
141
Info/IEEE802dot3ad.pm
Normal file
141
Info/IEEE802dot3ad.pm
Normal file
@@ -0,0 +1,141 @@
|
||||
# SNMP::Info::IEEE802dot3ad
|
||||
#
|
||||
# Copyright (c) 2014 SNMP::Info Developers
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::IEEE802dot3ad;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Aggregate;
|
||||
|
||||
@SNMP::Info::IEEE802dot3ad::ISA = qw/
|
||||
SNMP::Info::Aggregate
|
||||
Exporter
|
||||
/;
|
||||
@SNMP::Info::IEEE802dot3ad::EXPORT_OK = qw/
|
||||
agg_ports_lag
|
||||
/;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Aggregate::MIBS,
|
||||
'IEEE8023-LAG-MIB' => 'dot3adAggPortSelectedAggID',
|
||||
);
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = ();
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
sub agg_ports_lag {
|
||||
my $dev = shift;
|
||||
|
||||
# TODO: implement partial
|
||||
my $masters = $dev->dot3adAggActorOperKey;
|
||||
my $slaves = $dev->dot3adAggPortActorOperKey;
|
||||
|
||||
return {} unless
|
||||
ref {} eq ref $masters and scalar keys %$masters
|
||||
and ref {} eq ref $slaves and scalar keys %$slaves;
|
||||
|
||||
my $ret = {};
|
||||
foreach my $s (keys %$slaves) {
|
||||
next if $slaves->{$s} == 0;
|
||||
foreach my $m (keys %$masters) {
|
||||
next unless $masters->{$m} == $slaves->{$s};
|
||||
$ret->{$s} = $m;
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::IEEE802dot3ad - SNMP Interface to IEEE Aggregated Links
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
SNMP::Info Developers
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $info = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $info->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This class provides access to Aggregated Links configuration on devices
|
||||
implementing C<IEEE8023-LAG-MIB>.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
L<SNMP::Info::Aggregate>
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<IEEE8023-LAG-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 METHODS
|
||||
|
||||
=over 4
|
||||
|
||||
=item C<agg_ports_lag>
|
||||
|
||||
Returns a HASH reference mapping from slave to master port for each member of
|
||||
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
|
||||
ifIndex of the corresponding master ports.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
518
Info/IPv6.pm
Normal file
518
Info/IPv6.pm
Normal file
@@ -0,0 +1,518 @@
|
||||
# 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.33';
|
||||
|
||||
|
||||
|
||||
%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-MIB
|
||||
'c_addr6_index' => 'cIpAddressIfIndex', # CISCO-IETF-IP-MIB
|
||||
|
||||
'ip_addr6_type' => 'ipAddressType', # IP-MIB
|
||||
'c_addr6_type' => 'cIpAddressType', # CISCO-IETF-IP-MIB
|
||||
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'ip_n2p_phys_addr' => \&SNMP::Info::munge_mac,
|
||||
'c_inet_phys_addr' => \&munge_physaddr,
|
||||
'i6_n2p_phys_addr' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
|
||||
sub ipv6_n2p_mac {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $phys_addr = &_test_methods( $info, {
|
||||
ip_n2p_phys_addr => IPMIB,
|
||||
c_inet_phys_addr => CISCO,
|
||||
i6_n2p_phys_addr => IPV6MIB,
|
||||
});
|
||||
return unless defined $phys_addr;
|
||||
foreach my $row (keys %$phys_addr) {
|
||||
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
|
||||
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
|
||||
if ($info::METHOD == IPV6MIB) {
|
||||
# IPV6-MIB doesn't include the addrtype in the index;
|
||||
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
|
||||
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
|
||||
$addrtype = 2;
|
||||
}
|
||||
if (($addrtype == 2) && (defined $phys_addr->{$row})) { # IPv6
|
||||
$return->{$row} = substr($phys_addr->{$row}, 0, 17);
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_n2p_addr {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $net_addr = &_test_methods( $info, {
|
||||
ip_n2p_phys_addr => IPMIB,
|
||||
c_inet_phys_addr => CISCO,
|
||||
i6_n2p_phys_addr => IPV6MIB,
|
||||
});
|
||||
return unless defined $net_addr;
|
||||
foreach my $row (keys %$net_addr) {
|
||||
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
|
||||
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
|
||||
if ($info::METHOD == IPV6MIB) {
|
||||
# IPV6-MIB doesn't include the addrtype in the index;
|
||||
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
|
||||
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
|
||||
$addrtype = 2;
|
||||
}
|
||||
if ($addrtype == 2) { # IPv6
|
||||
my $v6_packed = pack("C*", split(/\./, $v6addr));
|
||||
if (length($v6_packed) == 15) {
|
||||
# Workaround for some some IP-MIB implementations, eg on Cisco Nexus: no explicit addrsize,
|
||||
# so what we've collected in that variable is actually the first byte of the address.
|
||||
$v6_packed = pack('C', $addrsize) . $v6_packed;
|
||||
}
|
||||
if (length($v6_packed) == 17) {
|
||||
# Workaround for IPV6-MIB on Windows 2012: if the address is one byte too long, the SNMP agent probably has an incorrect
|
||||
# implementation where a length field precedes the actual IPv6 address.
|
||||
# In that case, the first character should be chr(16), ie 0x10; strip it if that's the case.
|
||||
$v6_packed =~ s/^\x10//;
|
||||
}
|
||||
if (length($v6_packed) == 16) {
|
||||
$v6addr = join(':', map { sprintf("%04x", $_) } unpack("n*", $v6_packed) );
|
||||
$return->{$row} = $v6addr;
|
||||
} else {
|
||||
printf("Invalid size for IPv6 address: expected 16 bytes, got %d (%s = %s)\n", length($v6_packed), $row, $net_addr->{$row});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_n2p_if {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $phys_addr = &_test_methods( $info, {
|
||||
ip_n2p_phys_addr => IPMIB,
|
||||
c_inet_phys_addr => CISCO,
|
||||
i6_n2p_phys_addr => IPV6MIB,
|
||||
});
|
||||
return unless defined $phys_addr;
|
||||
foreach my $row (keys %$phys_addr) {
|
||||
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
|
||||
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
|
||||
if ($info::METHOD == IPV6MIB) {
|
||||
# IPV6-MIB doesn't include the addrtype in the index;
|
||||
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
|
||||
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
|
||||
$addrtype = 2;
|
||||
}
|
||||
if ($addrtype == 2) { # IPv6
|
||||
$return->{$row} = $ifindex;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_n2p_type {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $phys_type = &_test_methods( $info, {
|
||||
ip_n2p_phys_type => IPMIB,
|
||||
c_inet_phys_type => CISCO,
|
||||
i6_n2p_phys_type => IPV6MIB,
|
||||
});
|
||||
return unless defined $phys_type;
|
||||
foreach my $row (keys %$phys_type) {
|
||||
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
|
||||
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
|
||||
if ($info::METHOD == IPV6MIB) {
|
||||
# IPV6-MIB doesn't include the addrtype in the index;
|
||||
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
|
||||
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
|
||||
$addrtype = 2;
|
||||
}
|
||||
if ($addrtype == 2) { # IPv6
|
||||
$return->{$row} = $phys_type->{$row};
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_n2p_state {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $phys_state = &_test_methods( $info, {
|
||||
ip_n2p_phys_state => IPMIB,
|
||||
c_inet_phys_state => CISCO,
|
||||
i6_n2p_phys_state => IPV6MIB,
|
||||
});
|
||||
return unless defined $phys_state;
|
||||
foreach my $row (keys %$phys_state) {
|
||||
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
|
||||
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
|
||||
if ($info::METHOD == IPV6MIB) {
|
||||
# IPV6-MIB doesn't include the addrtype in the index;
|
||||
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
|
||||
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
|
||||
$addrtype = 2;
|
||||
}
|
||||
if ($addrtype == 2) { # IPv6
|
||||
$return->{$row} = $phys_state->{$row};
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_index {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $ipv6_index = &_test_methods( $info, {
|
||||
ip_addr6_index => IPMIB,
|
||||
c_addr6_index => CISCO,
|
||||
});
|
||||
return unless defined $ipv6_index;
|
||||
foreach my $row (keys %$ipv6_index){
|
||||
if ($row =~ /^(\d+)\.([\d\.]+)$/) {
|
||||
my $addrtype = $1; my $v6addr = $2;
|
||||
if ($addrtype == 2) { # IPv6
|
||||
$return->{$row} = $ipv6_index->{$row};
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_type {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $ipv6_type = &_test_methods( $info, {
|
||||
ip_addr6_type => IPMIB,
|
||||
c_addr6_type => CISCO,
|
||||
});
|
||||
return unless defined $ipv6_type;
|
||||
foreach my $row (keys %$ipv6_type){
|
||||
if ($row =~ /^(\d+)\.([\d\.]+)$/) {
|
||||
my $addrtype = $1; my $v6addr = $2;
|
||||
if ($addrtype == 2) { # IPv6
|
||||
$return->{$row} = $ipv6_type->{$row};
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_pfx_origin {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $ipv6_pfx_origin = &_test_methods( $info, {
|
||||
ip_pfx_origin => IPMIB,
|
||||
c_pfx_origin => CISCO,
|
||||
});
|
||||
return unless defined $ipv6_pfx_origin;
|
||||
foreach my $row (keys %$ipv6_pfx_origin){
|
||||
if ($row =~ /^(\d+)\.(\d+)\.([\d\.]+)\.(\d+)$/) {
|
||||
my $ifindex = $1; my $type = $2; my $pfx = $3; my $len = $4;
|
||||
if ($type == 2) { # IPv6
|
||||
$return->{$row} = $ipv6_pfx_origin->{$row};
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_addr_prefix {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $ipv6_addr_prefix = &_test_methods( $info, {
|
||||
ip_addr6_pfx => IPMIB,
|
||||
c_addr6_pfx => CISCO,
|
||||
});
|
||||
return unless defined $ipv6_addr_prefix;
|
||||
foreach my $row (keys %$ipv6_addr_prefix){
|
||||
if ($row =~ /^(\d+)\.[\d\.]+$/) {
|
||||
my $type = $1;
|
||||
if ($type == 2) { # 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 ipv6_addr {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $indexes = $info->ipv6_index();
|
||||
foreach my $row (keys %$indexes) {
|
||||
my @parts = split(/\./, $row);
|
||||
my $is_valid = 0;
|
||||
if (scalar @parts == 18) {
|
||||
my $addrtype = shift @parts;
|
||||
$is_valid = 1;
|
||||
} elsif (scalar @parts == 17) {
|
||||
$is_valid = 1;
|
||||
}
|
||||
my $addrsize = shift @parts; # First element now is addrsize, should be 16
|
||||
if ($is_valid && $addrsize == 16) {
|
||||
$return->{$row} = join(':', unpack('(H4)*', pack('C*', @parts)));
|
||||
} else {
|
||||
warn sprintf("%s: unable to decode table index to IPv6 address. Raw data is [%s].\n", &_my_sub_name, $row);
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub _method_used {
|
||||
my $info = shift;
|
||||
my $return = 'none of the MIBs';
|
||||
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
|
||||
|
||||
=item $info->ipv6_addr()
|
||||
|
||||
Maps a table instance to an IPv6 address
|
||||
|
||||
=back
|
||||
|
||||
=head2 Internet Address Translation Table
|
||||
|
||||
=over
|
||||
|
||||
=item $info->c_inet_phys_address()
|
||||
|
||||
Maps an address of type C<cInetNetToMediaNetAddressType> on interface C<ifIndex> to a physical address.
|
||||
|
||||
=back
|
||||
|
||||
=head1 MUNGES
|
||||
|
||||
=over
|
||||
|
||||
=item munge_physaddr()
|
||||
|
||||
Takes an octet stream (HEX-STRING) and returns a colon separated ASCII hex
|
||||
string.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
193
Info/LLDP.pm
193
Info/LLDP.pm
@@ -39,7 +39,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
'LLDP-MIB' => 'lldpLocSysCapEnabled',
|
||||
@@ -67,6 +67,7 @@ $VERSION = '2.00';
|
||||
'lldp_rem_sysname' => 'lldpRemSysName',
|
||||
'lldp_rem_sysdesc' => 'lldpRemSysDesc',
|
||||
'lldp_rem_sys_cap' => 'lldpRemSysCapEnabled',
|
||||
'lldp_rem_cap_spt' => 'lldpRemSysCapSupported',
|
||||
|
||||
# LLDP-MIB::lldpRemManAddrTable
|
||||
'lldp_rman_addr' => 'lldpRemManAddrIfSubtype',
|
||||
@@ -80,6 +81,7 @@ $VERSION = '2.00';
|
||||
'lldp_rem_port_desc' => \&SNMP::Info::munge_null,
|
||||
'lldp_sys_cap' => \&SNMP::Info::munge_bits,
|
||||
'lldp_rem_sys_cap' => \&SNMP::Info::munge_bits,
|
||||
'lldp_rem_cap_spt' => \&SNMP::Info::munge_bits,
|
||||
);
|
||||
|
||||
sub hasLLDP {
|
||||
@@ -88,8 +90,12 @@ sub hasLLDP {
|
||||
# We may be have LLDP, but nothing in lldpRemoteSystemsData Tables
|
||||
# so we could be running LLDP but not return any useful information
|
||||
my $lldp_cap = $lldp->lldp_sys_cap();
|
||||
|
||||
return 1 if defined $lldp_cap;
|
||||
|
||||
# If the device doesn't return local system capabilities, fallback by checking if it would report neighbors
|
||||
my $lldp_rem = $lldp->lldp_rem_id() || {};
|
||||
return 1 if scalar keys %$lldp_rem;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -97,12 +103,31 @@ sub lldp_if {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $addr = $lldp->lldp_rem_pid($partial) || {};
|
||||
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 ( $desc && exists $r_i_descr{$desc} ) {
|
||||
$port = $r_i_descr{$desc};
|
||||
}
|
||||
elsif ( $desc && exists $r_i_alias{$desc} ) {
|
||||
$port = $r_i_alias{$desc};
|
||||
}
|
||||
|
||||
$lldp_if{$key} = $port;
|
||||
}
|
||||
return \%lldp_if;
|
||||
@@ -124,6 +149,38 @@ sub lldp_ip {
|
||||
return \%lldp_ip;
|
||||
}
|
||||
|
||||
sub lldp_ipv6 {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $rman_addr = $lldp->lldp_rman_addr($partial) || {};
|
||||
|
||||
my %lldp_ipv6;
|
||||
foreach my $key ( keys %$rman_addr ) {
|
||||
my ( $index, $proto, $addr ) = _lldp_addr_index($key);
|
||||
next unless defined $index;
|
||||
next unless $proto == 2;
|
||||
$lldp_ipv6{$index} = $addr;
|
||||
}
|
||||
return \%lldp_ipv6;
|
||||
}
|
||||
|
||||
sub lldp_mac {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $rman_addr = $lldp->lldp_rman_addr($partial) || {};
|
||||
|
||||
my %lldp_ipv6;
|
||||
foreach my $key ( keys %$rman_addr ) {
|
||||
my ( $index, $proto, $addr ) = _lldp_addr_index($key);
|
||||
next unless defined $index;
|
||||
next unless $proto == 6;
|
||||
$lldp_ipv6{$index} = $addr;
|
||||
}
|
||||
return \%lldp_ipv6;
|
||||
}
|
||||
|
||||
sub lldp_addr {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
@@ -146,14 +203,21 @@ sub lldp_port {
|
||||
my $pdesc = $lldp->lldp_rem_desc($partial) || {};
|
||||
my $pid = $lldp->lldp_rem_pid($partial) || {};
|
||||
my $ptype = $lldp->lldp_rem_pid_type($partial) || {};
|
||||
my $desc = $lldp->lldp_rem_sysdesc($partial) || {};
|
||||
|
||||
my %lldp_port;
|
||||
foreach my $key ( sort keys %$pid ) {
|
||||
my $port = $pdesc->{$key};
|
||||
my $type = $ptype->{$key};
|
||||
if ( $type and $type eq 'interfaceName' ) {
|
||||
|
||||
# If the pid claims to be an interface name,
|
||||
# believe it.
|
||||
$port = $pid->{$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
|
||||
@@ -163,10 +227,14 @@ sub lldp_port {
|
||||
}
|
||||
}
|
||||
|
||||
# Nortel lldpRemPortDesc doesn't match ifDescr, but we can still
|
||||
# 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";
|
||||
if ( defined $desc->{$key}
|
||||
&& $desc->{$key}
|
||||
=~ /^Ethernet\s(?:Routing\s)?Switch\s\d|^Virtual\sServices\sPlatform\s\d/
|
||||
&& $port =~ /^(Unit\s+(\d+)\s+)?Port\s+(\d+)$/ )
|
||||
{
|
||||
$port = defined $1 ? "$2.$3" : "1.$3";
|
||||
}
|
||||
|
||||
$lldp_port{$key} = $port;
|
||||
@@ -192,11 +260,69 @@ sub lldp_id {
|
||||
if ( $type =~ /mac/ ) {
|
||||
$id = join( ':', map { sprintf "%02x", $_ } unpack( 'C*', $id ) );
|
||||
}
|
||||
elsif ( $type eq 'networkAddress' ) {
|
||||
if ( length( unpack( 'H*', $id ) ) == 10 ) {
|
||||
|
||||
# IP address (first octet is sign, I guess)
|
||||
my @octets
|
||||
= ( map { sprintf "%02x", $_ } unpack( 'C*', $id ) )
|
||||
[ 1 .. 4 ];
|
||||
$id = join '.', map { hex($_) } @octets;
|
||||
}
|
||||
}
|
||||
$lldp_id{$key} = $id;
|
||||
}
|
||||
return \%lldp_id;
|
||||
}
|
||||
|
||||
sub lldp_platform {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $rid = $lldp->lldp_rem_id($partial) || {};
|
||||
my $desc = $lldp->lldp_rem_sysdesc($partial) || {};
|
||||
my $name = $lldp->lldp_rem_sysname($partial) || {};
|
||||
|
||||
my %lldp_platform;
|
||||
foreach my $key ( keys %$rid ) {
|
||||
$lldp_platform{$key} = $desc->{$key} || $name->{$key};
|
||||
}
|
||||
return \%lldp_platform;
|
||||
}
|
||||
|
||||
sub lldp_cap {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $lldp_caps = $lldp->lldp_rem_cap_spt($partial) || {};
|
||||
|
||||
# Encoded as BITS which Perl Net-SNMP implementation doesn't seem to
|
||||
# be able to enumerate for us, so we have to get it from the MIB
|
||||
# and enumerate ourselves
|
||||
my $oid = SNMP::translateObj( 'lldpRemSysCapEnabled', 0, 1 ) || '';
|
||||
my $enums = (
|
||||
( ref {} eq ref $SNMP::MIB{$oid}{'enums'} )
|
||||
? $SNMP::MIB{$oid}{'enums'}
|
||||
: {}
|
||||
);
|
||||
my %r_enums = reverse %$enums;
|
||||
|
||||
my %lldp_cap;
|
||||
foreach my $key ( keys %$lldp_caps ) {
|
||||
my $cap_bits = $lldp_caps->{$key};
|
||||
next unless $cap_bits;
|
||||
|
||||
my $count = 0;
|
||||
foreach my $bit ( split //, $cap_bits ) {
|
||||
if ($bit) {
|
||||
push( @{ $lldp_cap{$key} }, $r_enums{$count} );
|
||||
}
|
||||
$count++;
|
||||
}
|
||||
}
|
||||
return \%lldp_cap;
|
||||
}
|
||||
|
||||
#sub root_ip {
|
||||
# my $lldp = shift;
|
||||
#
|
||||
@@ -222,20 +348,26 @@ sub _lldp_addr_index {
|
||||
my @oids = split( /\./, $idx );
|
||||
my $index = join( '.', splice( @oids, 0, 3 ) );
|
||||
my $proto = shift(@oids);
|
||||
my $length = shift(@oids);
|
||||
shift(@oids) if scalar @oids > 4; # $length
|
||||
|
||||
# IPv4
|
||||
if ( $proto == 1 ) {
|
||||
return ( $index, $proto, join( '.', @oids ) );
|
||||
}
|
||||
|
||||
# IPv6
|
||||
elsif ( $proto == 2 ) {
|
||||
return ( $index, $proto,
|
||||
join(':', unpack('(H4)*', pack('C*', @oids)) ) );
|
||||
}
|
||||
|
||||
# MAC
|
||||
elsif ( $proto == 6 ) {
|
||||
return ( $index, $proto,
|
||||
join( ':', map { sprintf "%02x", $_ } @oids ) );
|
||||
}
|
||||
|
||||
# TODO - Need to handle other protocols, i.e. IPv6
|
||||
# TODO - Other protocols may be used as well; implement when needed?
|
||||
else {
|
||||
return;
|
||||
}
|
||||
@@ -337,7 +469,7 @@ Nulls are removed before the value is returned.
|
||||
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>)
|
||||
@@ -385,29 +517,56 @@ to a hash.
|
||||
|
||||
=item $lldp->lldp_id()
|
||||
|
||||
Returns the string value used to identify the chassis component associated
|
||||
Returns the string value used to identify the chassis component associated
|
||||
with the remote system.
|
||||
|
||||
(C<lldpRemChassisId>)
|
||||
|
||||
=item $lldp->lldp_if()
|
||||
|
||||
Returns the mapping to the SNMP Interface Table.
|
||||
Returns the mapping to the SNMP Interface Table. Tries to cross reference
|
||||
(C<lldpLocPortDesc>) with (C<ifDescr>) and (C<ifAlias>) to get (C<ifIndex>),
|
||||
if unable defaults to (C<lldpRemLocalPortNum>).
|
||||
|
||||
=item $lldp->lldp_ip()
|
||||
|
||||
Returns remote IPv4 address. Returns for all other address types, use
|
||||
lldp_addr if you want any return address type.
|
||||
|
||||
=item $lldp->lldp_ipv6()
|
||||
|
||||
Returns remote IPv6 address, if known. Returns for all other address types,
|
||||
use lldp_addr if you don't care about return address type.
|
||||
|
||||
=item $lldp->lldp_mac()
|
||||
|
||||
Returns remote (management) MAC address, if known. Returns for all other
|
||||
address types, use lldp_addr if you don't care about return address type.
|
||||
|
||||
=item $lldp->lldp_addr()
|
||||
|
||||
Returns remote address. Type may be any IANA Address Family Number.
|
||||
Currently only returns IPv4 or MAC addresses.
|
||||
Currently only returns IPv4, IPv6 or MAC addresses. If the remote device
|
||||
returns more than one address type, this method will give only one. Which one
|
||||
is returned is decided by chance, phase of the moon and Perl hash ordering.
|
||||
|
||||
Use lldp_mac, lldp_ip or lldp_ipv6 if you want a specific address type.
|
||||
|
||||
=item $lldp->lldp_port()
|
||||
|
||||
Returns remote port ID
|
||||
|
||||
=item $lldp->lldp_platform()
|
||||
|
||||
Tries to return something useful from C<lldp_rem_sysdesc()> or
|
||||
C<lldp_rem_sysname()>.
|
||||
|
||||
=item $lldp->lldp_cap()
|
||||
|
||||
Returns hash of arrays with each array containing the system capabilities
|
||||
supported by the remote system. Possible elements in the array are
|
||||
enumerated from C<LldpSystemCapabilitiesMap>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 LLDP Remote Table (C<lldpRemTable>)
|
||||
@@ -423,7 +582,7 @@ the remote system.
|
||||
|
||||
=item $lldp->lldp_rem_id()
|
||||
|
||||
Returns the string value used to identify the chassis component associated
|
||||
Returns the string value used to identify the chassis component associated
|
||||
with the remote system.
|
||||
|
||||
(C<lldpRemChassisId>)
|
||||
@@ -471,9 +630,9 @@ Nulls are removed before the value is returned.
|
||||
|
||||
=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:
|
||||
Returns which system capabilities are enabled on the remote system. Results
|
||||
are munged into an ascii binary string, LSB. Each digit represents a bit
|
||||
from the table below:
|
||||
|
||||
=over
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = ( %SNMP::Info::MIBS, 'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex' );
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ use SNMP::Info::Layer1;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, 'root_ip' => 'actualIPAddr', );
|
||||
@@ -78,7 +78,7 @@ sub model {
|
||||
|
||||
my $desc = $allied->description();
|
||||
|
||||
if ( $desc =~ /(AT-\d{4}\S{1}?)/ ) {
|
||||
if ( $desc =~ /(AT-\d{4}\S{1})/ ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
|
||||
@@ -41,7 +41,7 @@ use SNMP::Info::Layer1;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, );
|
||||
@@ -50,11 +50,11 @@ $VERSION = '2.00';
|
||||
%SNMP::Info::Layer1::FUNCS,
|
||||
'asante_port' => 'ePortIndex',
|
||||
'asante_group' => 'ePortGrpIndex',
|
||||
'i_type' => 'ePortStateType',
|
||||
'i_type' => 'ePortGrpIndex',
|
||||
'asante_up' => 'ePortStateLinkStatus',
|
||||
);
|
||||
|
||||
%MIBS = ( %SNMP::Info::Layer1::MIBS, 'ASANTE-HUB1012-MIB' => 'asante' );
|
||||
%MIBS = ( %SNMP::Info::Layer1::MIBS, 'ASANTE-AH1012-MIB' => 'asante' );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer1::MUNGE, );
|
||||
|
||||
@@ -202,7 +202,7 @@ Asante device through SNMP.
|
||||
|
||||
=over
|
||||
|
||||
=item F<ASANTE-HUB1012-MIB>
|
||||
=item F<ASANTE-AH1012-MIB>
|
||||
|
||||
=back
|
||||
|
||||
@@ -230,7 +230,7 @@ Returns 'asante' :)
|
||||
|
||||
=item $asante->model()
|
||||
|
||||
Cross references $asante->id() to the F<ASANTE-HUB1012-MIB> and returns
|
||||
Cross references $asante->id() to the F<ASANTE-AH1012-MIB> and returns
|
||||
the results.
|
||||
|
||||
=back
|
||||
|
||||
@@ -42,7 +42,7 @@ use SNMP::Info::Layer2;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
@@ -93,7 +93,7 @@ sub os {
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'nortel';
|
||||
return 'avaya';
|
||||
}
|
||||
|
||||
sub model {
|
||||
@@ -334,6 +334,13 @@ sub bp_index {
|
||||
return \%bp_index;
|
||||
}
|
||||
|
||||
sub fw_mac {
|
||||
my $bayhub = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $bayhub->SUPER::fw_mac($partial);
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $bayhub = shift;
|
||||
my $partial = shift;
|
||||
@@ -469,7 +476,7 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer1::Bayhub - SNMP Interface to Bay / Nortel Hubs
|
||||
SNMP::Info::Layer1::Bayhub - SNMP Interface to Bay/Nortel/Avaya Hubs
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
@@ -541,7 +548,7 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=item $bayhub->vendor()
|
||||
|
||||
Returns 'nortel'
|
||||
Returns 'avaya'
|
||||
|
||||
=item $bayhub->os()
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer1;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer1::MIBS,
|
||||
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer2;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
@@ -324,6 +324,13 @@ sub bp_index {
|
||||
return \%bp_index;
|
||||
}
|
||||
|
||||
sub fw_mac {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $s3000->SUPER::fw_mac($partial);
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
@@ -38,18 +38,20 @@ use SNMP::Info;
|
||||
use SNMP::Info::Bridge;
|
||||
use SNMP::Info::Entity;
|
||||
use SNMP::Info::PowerEthernet;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer2::ISA
|
||||
= qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::Entity SNMP::Info::PowerEthernet Exporter/;
|
||||
= qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::Entity SNMP::Info::PowerEthernet SNMP::Info::LLDP Exporter/;
|
||||
@SNMP::Info::Layer2::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS,
|
||||
%SNMP::Info::Entity::MIBS, %SNMP::Info::PowerEthernet::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
@@ -57,6 +59,7 @@ $VERSION = '2.00';
|
||||
%SNMP::Info::Bridge::GLOBALS,
|
||||
%SNMP::Info::Entity::GLOBALS,
|
||||
%SNMP::Info::PowerEthernet::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
'serial1' =>
|
||||
'.1.3.6.1.4.1.9.3.6.3.0', # OLD-CISCO-CHASSIS-MIB::chassisId.0
|
||||
);
|
||||
@@ -64,6 +67,7 @@ $VERSION = '2.00';
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS, %SNMP::Info::Bridge::FUNCS,
|
||||
%SNMP::Info::Entity::FUNCS, %SNMP::Info::PowerEthernet::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
@@ -73,6 +77,7 @@ $VERSION = '2.00';
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
%SNMP::Info::Entity::MUNGE,
|
||||
%SNMP::Info::PowerEthernet::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
);
|
||||
|
||||
# Method OverRides
|
||||
@@ -123,30 +128,16 @@ sub serial {
|
||||
# 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 );
|
||||
|
||||
if ( defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
return $serial1 if ( defined $serial1 and $serial1 !~ /^\s*$/ );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $l2 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_type = $l2->i_type($partial) || {};
|
||||
|
||||
my %i_ignore = ();
|
||||
|
||||
foreach my $if ( keys %$i_type ) {
|
||||
my $type = $i_type->{$if};
|
||||
$i_ignore{$if}++
|
||||
if $type =~ /(loopback|other|cpu)/i;
|
||||
}
|
||||
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $l2 = shift;
|
||||
my $partial = shift;
|
||||
@@ -155,10 +146,18 @@ sub interfaces {
|
||||
my $i_descr = $l2->i_description($partial) || {};
|
||||
|
||||
# Replace the Index with the ifDescr field.
|
||||
# Check for duplicates in ifDescr, if so uniquely identify by adding
|
||||
# ifIndex to repeated values
|
||||
my %seen;
|
||||
foreach my $iid ( keys %$i_descr ) {
|
||||
my $port = $i_descr->{$iid};
|
||||
next unless defined $port;
|
||||
$interfaces->{$iid} = $port;
|
||||
if ( $seen{$port}++ ) {
|
||||
$interfaces->{$iid} = sprintf( "%s (%d)", $port, $iid );
|
||||
}
|
||||
else {
|
||||
$interfaces->{$iid} = $port;
|
||||
}
|
||||
}
|
||||
return $interfaces;
|
||||
}
|
||||
@@ -224,6 +223,8 @@ after determining a more specific class using the method above.
|
||||
|
||||
=item SNMP::Info::Entity
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
@@ -277,6 +278,10 @@ See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
|
||||
|
||||
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
@@ -293,12 +298,6 @@ name.
|
||||
|
||||
Defaults to C<ifDescr> but checks and overrides with C<ifName>
|
||||
|
||||
=item $l2->i_ignore()
|
||||
|
||||
Returns reference to hash. Increments value of IID if port is to be ignored.
|
||||
|
||||
Ignores ports with C<ifType> of loopback, propvirtual, other, and cpu
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
@@ -313,4 +312,8 @@ See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
|
||||
|
||||
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
173
Info/Layer2/3Com.pm
Normal file
173
Info/Layer2/3Com.pm
Normal file
@@ -0,0 +1,173 @@
|
||||
package SNMP::Info::Layer2::3Com;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::LLDP;
|
||||
use SNMP::Info::CDP;
|
||||
|
||||
@SNMP::Info::Layer2::3Com::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::3Com::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/;
|
||||
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
'A3Com-products-MIB' => 'wlanAP7760',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
);
|
||||
|
||||
|
||||
sub os {
|
||||
return '3Com';
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $dev = shift;
|
||||
my $e_serial = $dev->e_serial();
|
||||
|
||||
# Find entity table entry for this unit
|
||||
foreach my $e ( sort keys %$e_serial ) {
|
||||
if (defined $e_serial->{$e} and $e_serial->{$e} !~ /^\s*$/) {
|
||||
return $e_serial->{$e};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
|
||||
my $dev = shift;
|
||||
my $e_swver = $dev->e_swver();
|
||||
# Find entity table entry for this unit
|
||||
foreach my $e ( sort keys %$e_swver ) {
|
||||
if (defined $e_swver->{$e} and $e_swver->{$e} !~ /^\s*$/) {
|
||||
return $e_swver->{$e};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return '3Com';
|
||||
}
|
||||
|
||||
sub model {
|
||||
|
||||
my $dsmodel = shift;
|
||||
my $descr = $dsmodel->description();
|
||||
if ( $descr =~ /^([\S ]+) Software.*/){
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::3Com - SNMP Interface to L2 3Com Switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Kosmach
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $router = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 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 3Com L2 devices
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<A3Com-products-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $device->vendor()
|
||||
|
||||
Returns '3Com'
|
||||
|
||||
=item $device->os()
|
||||
|
||||
Returns '3Com'
|
||||
|
||||
=item $device->os_ver()
|
||||
|
||||
Return os version
|
||||
|
||||
=item $device->model()
|
||||
|
||||
Returns device model extracted from description
|
||||
|
||||
=item $device->serial()
|
||||
|
||||
Returns serial number
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
# SNMP::Info::Layer2::Airespace
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
#
|
||||
@@ -41,11 +40,14 @@ use SNMP::Info::Airespace;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%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 = (
|
||||
@@ -56,13 +58,68 @@ $VERSION = '2.00';
|
||||
%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';
|
||||
}
|
||||
@@ -79,6 +136,91 @@ sub 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__
|
||||
|
||||
@@ -134,6 +276,12 @@ my $airespace = new SNMP::Info::Layer2::Airespace(...);
|
||||
|
||||
=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.
|
||||
@@ -181,11 +329,25 @@ See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item cd11_mac()
|
||||
|
||||
Returns client radio interface MAC addresses.
|
||||
|
||||
=item cd11_txrate()
|
||||
|
||||
Returns client transmission speed in Mbs.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item None
|
||||
=item i_mac()
|
||||
|
||||
Adds AP Ethernet MAC as port mac on radio ports from C<CISCO-LWAPP-AP-MIB>.
|
||||
|
||||
=back
|
||||
|
||||
@@ -201,4 +363,23 @@ See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
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,7 +1,7 @@
|
||||
# SNMP::Info::Layer2::Aironet
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
# Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
@@ -38,17 +38,18 @@ 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
|
||||
SNMP::Info::CiscoStats SNMP::Info::CDP Exporter/;
|
||||
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/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::IEEE802dot11::GLOBALS,
|
||||
@@ -56,9 +57,11 @@ $VERSION = '2.00';
|
||||
%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'
|
||||
'descr' => 'sysDescr',
|
||||
'ps1_type' => 'cpoePdCurrentPowerSource'
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
@@ -67,11 +70,11 @@ $VERSION = '2.00';
|
||||
%SNMP::Info::Entity::FUNCS,
|
||||
%SNMP::Info::EtherLike::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
'i_ssidlist' => 'cd11IfAuxSsid',
|
||||
'i_ssidbcast' => 'cd11IfAuxSsidBroadcastSsid',
|
||||
'i_80211channel' => 'cd11IfPhyDsssCurrentChannel',
|
||||
'c_dot11subif' => 'cDot11ClientSubIfIndex',
|
||||
'cd11_rateset' => 'cDot11ClientDataRateSet',
|
||||
'cd11_txrate' => 'cDot11ClientCurrentTxRateSet',
|
||||
'cd11_uptime' => 'cDot11ClientUpTime',
|
||||
'cd11_sigstrength' => 'cDot11ClientSignalStrength',
|
||||
@@ -89,12 +92,13 @@ $VERSION = '2.00';
|
||||
%SNMP::Info::Entity::MIBS,
|
||||
%SNMP::Info::EtherLike::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
'CISCO-DOT11-IF-MIB' => 'cd11IfAuxSsid',
|
||||
'CISCO-DOT11-ASSOCIATION-MIB' => 'cDot11ClientSubIfIndex',
|
||||
'CISCO-DOT11-SSID-SECURITY-MIB' => 'cdot11SecVlanNameId',
|
||||
'CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB' => 'cviRoutedVlanIfIndex',
|
||||
'CISCO-POE-PD-MIB' => 'cpoePdCurrentPowerSource',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
@@ -103,8 +107,10 @@ $VERSION = '2.00';
|
||||
%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,
|
||||
);
|
||||
|
||||
@@ -189,7 +195,7 @@ sub _aironet_breakout_dot11idx {
|
||||
sub fw_mac {
|
||||
my $aironet = shift;
|
||||
|
||||
return qb_fw_mac($aironet) unless _aironet_special($aironet);
|
||||
return $aironet->qb_fw_mac() unless _aironet_special($aironet);
|
||||
my $c_dot11subif = $aironet->c_dot11subif();
|
||||
my $fw_mac = {};
|
||||
|
||||
@@ -314,6 +320,19 @@ sub cd11_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.
|
||||
@@ -363,6 +382,95 @@ sub i_mac {
|
||||
return $mbss_mac;
|
||||
}
|
||||
|
||||
sub i_ssidlist {
|
||||
my $aironet = shift;
|
||||
|
||||
# no partial is possible due to the levels
|
||||
# of indirection.
|
||||
my $ssid_row = $aironet->cdot11SecInterfSsidRowStatus();
|
||||
my $ssid_vlan = $aironet->cdot11SecAuxSsidVlan();
|
||||
if ( !defined($ssid_row) || !defined($ssid_vlan) ) {
|
||||
return $aironet->cd11IfAuxSsid();
|
||||
}
|
||||
my $ssidlist = {};
|
||||
my $if_ssidcount = {};
|
||||
my $vlan_map = $aironet->_vlan_map_n_stack();
|
||||
foreach my $idx ( keys %$ssid_row ) {
|
||||
next unless $ssid_row->{$idx} eq 'active';
|
||||
|
||||
# ssid_row index is radio.ssid
|
||||
my ( $interface, $ssid ) = split( /\./, $idx, 2 );
|
||||
my ( $len, @ssidt ) = split( /\./, $ssid );
|
||||
my $mappedintf = $vlan_map->{ $ssid_vlan->{$ssid} }->{$interface};
|
||||
next unless $mappedintf;
|
||||
if ( !$if_ssidcount->{$mappedintf} ) {
|
||||
$if_ssidcount->{$mappedintf} = 1;
|
||||
}
|
||||
my $ssidlist_idx
|
||||
= sprintf( "%s.%d", $mappedintf, $if_ssidcount->{$mappedintf} );
|
||||
$ssidlist->{$ssidlist_idx} = pack( "C*", @ssidt );
|
||||
$if_ssidcount->{$mappedintf}++;
|
||||
}
|
||||
return $ssidlist;
|
||||
}
|
||||
|
||||
sub i_ssidbcast {
|
||||
my $aironet = shift;
|
||||
my $partial = shift;
|
||||
my $mbss_bcast = $aironet->cdot11SecAuxSsidMbssidBroadcast();
|
||||
if ( !defined($mbss_bcast) ) {
|
||||
return $aironet->cd11IfAuxSsidBroadcastSsid($partial);
|
||||
}
|
||||
my $map = {};
|
||||
foreach my $key ( keys %$mbss_bcast ) {
|
||||
my (@idx) = split( /\./, $key );
|
||||
my $len = shift(@idx);
|
||||
$map->{ pack( "C*", @idx ) } = $mbss_bcast->{$key};
|
||||
}
|
||||
|
||||
# This needs to return the same indexes as i_ssidlist.
|
||||
# mbss_bcast maps ssid -> broadcasting
|
||||
# so we just replace the i_ssidlist values with the mbss_bcast ones.
|
||||
my $i_ssidlist = $aironet->i_ssidlist();
|
||||
my $i_ssidbcast = {};
|
||||
foreach my $key ( keys %$i_ssidlist ) {
|
||||
$i_ssidbcast->{$key} = $map->{ $i_ssidlist->{$key} };
|
||||
}
|
||||
return $i_ssidbcast;
|
||||
}
|
||||
|
||||
sub i_ssidmac {
|
||||
my $aironet = shift;
|
||||
my $partial = shift;
|
||||
my $mbss_mac_addr = $aironet->mbss_mac_addr();
|
||||
|
||||
# Same logic as i_ssidbcast to return same indexes as i_ssidlist
|
||||
my $map = {};
|
||||
foreach my $key ( keys %$mbss_mac_addr ) {
|
||||
my ( $interface, @idx ) = split( /\./, $key );
|
||||
$map->{ pack( "C*", @idx ) } = $mbss_mac_addr->{$key};
|
||||
}
|
||||
|
||||
my $i_ssidlist = $aironet->i_ssidlist();
|
||||
my $i_ssidmac = {};
|
||||
foreach my $key ( keys %$i_ssidlist ) {
|
||||
$i_ssidmac->{$key} = $map->{ $i_ssidlist->{$key} };
|
||||
}
|
||||
return $i_ssidmac;
|
||||
}
|
||||
|
||||
###
|
||||
# PoE status. The ps1_type is the PoE injector type, which is just
|
||||
# a scalar; the status is a little more complex.
|
||||
sub ps1_status {
|
||||
my $aironet = shift;
|
||||
my $idx = $aironet->cpoePdCurrentPowerLevel();
|
||||
my $mw = $aironet->cpoePdSupportedPower( $idx );
|
||||
my $descr = $aironet->cpoePdSupportedPowerMode( $idx );
|
||||
|
||||
return sprintf( "%.2fW (%s)", $mw->{$idx} * 0.001, $descr->{$idx} );
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
@@ -424,7 +532,9 @@ my $aironet = new SNMP::Info::Layer2::Aironet(...);
|
||||
|
||||
=item SNMP::Info::EtherLike
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=back
|
||||
|
||||
@@ -444,17 +554,13 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $aironet->discription()
|
||||
|
||||
Adds info from method e_descr() from SNMP::Info::Entity
|
||||
|
||||
=item $aironet->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=item $aironet->description()
|
||||
|
||||
System description
|
||||
System description. Adds info from method e_descr() from SNMP::Info::Entity
|
||||
|
||||
=back
|
||||
|
||||
@@ -480,7 +586,7 @@ Returns radio interfaces.
|
||||
|
||||
=item $aironet->cd11_mac()
|
||||
|
||||
Returns radio interface MAC addresses.
|
||||
Returns client radio interface MAC addresses.
|
||||
|
||||
=item $aironet->cd11_ssid()
|
||||
|
||||
@@ -536,6 +642,27 @@ Returns VLAN IDs
|
||||
|
||||
Returns VLAN names
|
||||
|
||||
=item $aironet->i_ssidlist()
|
||||
|
||||
Returns a list of SSIDs associated with interfaces. This function
|
||||
is C<MBSSID> aware, so when using C<MBSSID> can map SSIDs to the sub-interface
|
||||
to which they belong.
|
||||
|
||||
=item $aironet->i_ssidbcast()
|
||||
|
||||
With the same keys as i_ssidlist, returns whether the given SSID is
|
||||
being broadcast.
|
||||
|
||||
=item $aironet->i_ssidmac()
|
||||
|
||||
With the same keys as i_ssidlist, returns the Basic service set
|
||||
identification (BSSID), MAC address, the AP is using for the SSID.
|
||||
|
||||
=item $aironet ps1_status()
|
||||
|
||||
Returns the PoE injector status based on C<cpoePdSupportedPower> and
|
||||
C<cpoePdSupportedPowerMode>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
@@ -40,7 +40,7 @@ use SNMP::Info::Layer1;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );
|
||||
|
||||
@@ -129,7 +129,7 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Allied - SNMP Interface to Allied Telesyn switches
|
||||
SNMP::Info::Layer2::Allied - SNMP Interface to Allied Telesis switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
|
||||
@@ -1,648 +0,0 @@
|
||||
# SNMP::Info::Layer2::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::Layer2::Aruba;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::Aruba::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Aruba::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
'WLSX-SWITCH-MIB' => 'wlsxHostname',
|
||||
'WLSX-WLAN-MIB' => 'wlanAPFQLN',
|
||||
'WLSR-AP-MIB' => 'wlsrHideSSID',
|
||||
#'ALCATEL-IND1-TP-DEVICES' => 'familyOmniAccessWireless',
|
||||
);
|
||||
|
||||
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS, );
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::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::Layer2::MUNGE, );
|
||||
|
||||
sub layers {
|
||||
return '00000011';
|
||||
}
|
||||
|
||||
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::Layer2::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::Layer2::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::Layer2::Aruba(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<WLSX-SWITCH-MIB>
|
||||
|
||||
=item F<WLSR-AP-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 $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::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 $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::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
@@ -1,492 +0,0 @@
|
||||
# SNMP::Info::Layer2::Bay
|
||||
# $Id$
|
||||
# This module depricated. See Layer2::BayStack
|
||||
#
|
||||
# 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::Bay;
|
||||
|
||||
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/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
'cdp_id' => 's5EnMsTopIpAddr',
|
||||
'cdp_run' => 's5EnMsTopStatus',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
'imac2' => 'ifPhysAddress',
|
||||
|
||||
# S5-ETH-MULTISEG-TOPOLOGY-MIB::s5EnMsTopNmmTable
|
||||
'bay_topo_slot' => 's5EnMsTopNmmSlot',
|
||||
'bay_topo_port' => 's5EnMsTopNmmPort',
|
||||
'bay_topo_ip' => 's5EnMsTopNmmIpAddr',
|
||||
'bay_topo_seg' => 's5EnMsTopNmmSegId',
|
||||
'bay_topo_mac' => 's5EnMsTopNmmMacAddr',
|
||||
'bay_topo_platform' => 's5EnMsTopNmmChassisType',
|
||||
'bay_topo_localseg' => 's5EnMsTopNmmLocalSeg',
|
||||
);
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
'SYNOPTICS-ROOT-MIB' => 'synoptics',
|
||||
'S5-ETH-MULTISEG-TOPOLOGY-MIB' => 's5EnMsTop'
|
||||
);
|
||||
|
||||
delete $MIBS{'CISCO-CDP-MIB'};
|
||||
|
||||
# 450's report full duplex as speed = 20mbps?!
|
||||
$SNMP::Info::SPEED_MAP{20_000_000} = '10 Mbps';
|
||||
$SNMP::Info::SPEED_MAP{200_000_000} = '100 Mbps';
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, 'i_mac2' => \&SNMP::Info::munge_mac, );
|
||||
|
||||
sub os {
|
||||
return 'bay';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $bay = shift;
|
||||
my $descr = $bay->description();
|
||||
return unless defined $descr;
|
||||
|
||||
# 303 / 304
|
||||
if ( $descr =~ m/Rev: \d+\.\d+\.\d+\.\d+-(\d+\.\d+\.\d+\.\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
# 450
|
||||
if ( $descr =~ m/SW:v(\d+\.\d+\.\d+\.\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub os_bin {
|
||||
my $bay = shift;
|
||||
my $descr = $bay->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+\.\d+\.\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
|
||||
# or nortel, or synopsis?
|
||||
return 'bay';
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $bay = shift;
|
||||
my $descr = $bay->description();
|
||||
|
||||
my $i_type = $bay->i_type();
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if ( keys %$i_type ) {
|
||||
my $type = $i_type->{$if};
|
||||
$i_ignore{$if}++ if $type =~ /(loopback|propvirtual|cpu)/i;
|
||||
}
|
||||
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $bay = shift;
|
||||
my $i_index = $bay->i_index();
|
||||
|
||||
return $i_index;
|
||||
}
|
||||
|
||||
sub i_mac {
|
||||
my $bay = shift;
|
||||
my $i_mac = $bay->i_mac2();
|
||||
|
||||
# Bay 303's with a hw rev < 2.11.4.5 report the mac as all zeros
|
||||
foreach my $iid ( keys %$i_mac ) {
|
||||
my $mac = $i_mac->{$iid};
|
||||
delete $i_mac->{$iid} if $mac eq '00:00:00:00:00:00';
|
||||
}
|
||||
return $i_mac;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $bay = shift;
|
||||
my $id = $bay->id();
|
||||
return unless defined $id;
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
$model =~ s/^sreg-//i;
|
||||
|
||||
my $descr = $bay->description();
|
||||
|
||||
return '303' if ( $descr =~ /\D303\D/ );
|
||||
return '304' if ( $descr =~ /\D304\D/ );
|
||||
return '450' if ( $model =~ /BayStack450/ );
|
||||
return $model;
|
||||
}
|
||||
|
||||
# Hack in some CDP type stuff
|
||||
|
||||
sub c_if {
|
||||
my $bay = shift;
|
||||
my $bay_topo_port = $bay->bay_topo_port();
|
||||
|
||||
my %c_if;
|
||||
foreach my $entry ( keys %$bay_topo_port ) {
|
||||
my $port = $bay_topo_port->{$entry};
|
||||
next unless defined $port;
|
||||
next if $port == 0;
|
||||
$c_if{"$port.1"} = $port;
|
||||
}
|
||||
return \%c_if;
|
||||
}
|
||||
|
||||
sub c_ip {
|
||||
my $bay = shift;
|
||||
my $bay_topo_ip = $bay->bay_topo_ip();
|
||||
my $bay_topo_port = $bay->bay_topo_port();
|
||||
my $ip = $bay->cdp_ip();
|
||||
|
||||
# Count the number of devices seen on each port.
|
||||
# more than one device seen means connected to a non-bay
|
||||
# device, but other bay devices are squawking further away.
|
||||
my %ip_port;
|
||||
foreach my $entry ( keys %$bay_topo_ip ) {
|
||||
my $port = $bay_topo_port->{$entry};
|
||||
next unless defined $port;
|
||||
next if ( $port =~ /^[\d\.]+$/ and $port == 0 );
|
||||
my $ip = $bay_topo_ip->{$entry};
|
||||
push( @{ $ip_port{$port} }, $ip );
|
||||
}
|
||||
|
||||
my %c_ip;
|
||||
foreach my $port ( keys %ip_port ) {
|
||||
my $ips = $ip_port{$port};
|
||||
if ( scalar @$ips == 1 ) {
|
||||
$c_ip{"$port.1"} = $ips->[0];
|
||||
}
|
||||
else {
|
||||
$c_ip{"$port.1"} = $ips;
|
||||
}
|
||||
}
|
||||
|
||||
return \%c_ip;
|
||||
}
|
||||
|
||||
sub c_port {
|
||||
my $bay = shift;
|
||||
my $bay_topo_port = $bay->bay_topo_port();
|
||||
my $bay_topo_seg = $bay->bay_topo_seg();
|
||||
|
||||
my %c_port;
|
||||
foreach my $entry ( keys %$bay_topo_seg ) {
|
||||
my $port = $bay_topo_port->{$entry};
|
||||
next unless defined $port;
|
||||
next if $port == 0;
|
||||
|
||||
# For fake remotes (multiple IPs for a c_ip), use first found
|
||||
next if defined $c_port{"$port.1"};
|
||||
|
||||
my $seg = $bay_topo_seg->{$entry};
|
||||
|
||||
# Segment id is (256 * remote slot_num) + (remote_port)
|
||||
my $remote_port = $seg % 256;
|
||||
|
||||
$c_port{"$port.1"} = $remote_port;
|
||||
}
|
||||
|
||||
return \%c_port;
|
||||
}
|
||||
|
||||
sub c_platform {
|
||||
my $bay = shift;
|
||||
my $bay_topo_port = $bay->bay_topo_port();
|
||||
my $bay_topo_platform = $bay->bay_topo_platform();
|
||||
|
||||
my %c_platform;
|
||||
foreach my $entry ( keys %$bay_topo_platform ) {
|
||||
my $port = $bay_topo_port->{$entry} || 0;
|
||||
next if $port == 0;
|
||||
|
||||
# For fake remotes (multiple IPs for a c_ip), use first found
|
||||
next if defined $c_platform{"$port.1"};
|
||||
|
||||
my $platform = $bay_topo_platform->{$entry};
|
||||
|
||||
$c_platform{"$port.1"} = $platform;
|
||||
}
|
||||
|
||||
return \%c_platform;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Bay - SNMP Interface to old Bay Network BayStack Switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
This module is Deprecated. Please use Layer2::BayStack instead.
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Bay device through SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $bay = new SNMP::Info::Layer2::Bay(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<SYNOPTICS-ROOT-MIB>
|
||||
|
||||
=item F<S5-ETH-MULTISEG-TOPOLOGY-MIB>
|
||||
|
||||
=item Inherited classes
|
||||
|
||||
MIBs required by L<SNMP::Info::Layer2/"Required MIBs"> and its superclasses.
|
||||
|
||||
=back
|
||||
|
||||
=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 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.
|
||||
|
||||
Removes C<sreg-> from the model name
|
||||
|
||||
=item $baystack->os()
|
||||
|
||||
Returns 'bay'.
|
||||
|
||||
=item $bay->os_ver()
|
||||
|
||||
Returns the os version extracted from C<sysDescr>.
|
||||
|
||||
=item $bay->os_bin()
|
||||
|
||||
Returns the firmware version extracted from C<sysDescr>.
|
||||
|
||||
=item $bay->cdp_id()
|
||||
|
||||
Returns the IP that the device is sending out for its Nmm topology info.
|
||||
|
||||
(C<s5EnMsTopIpAddr>)
|
||||
|
||||
=item $bay->cdp_run()
|
||||
|
||||
Returns if the F<S5-ETH-MULTISEG-TOPOLOGY> info is on for this device.
|
||||
|
||||
(C<s5EnMsTopStatus>)
|
||||
|
||||
=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
|
||||
|
||||
=item $bay->interfaces()
|
||||
|
||||
Returns reference to map of IIDs to physical ports.
|
||||
|
||||
Currently simply returns the C<ifIndex>
|
||||
|
||||
=item $bay->i_ignore()
|
||||
|
||||
Returns reference to hash of IIDs to ignore.
|
||||
|
||||
Simply calls the SNMP::Info::Layer2::i_ignore() for this.
|
||||
|
||||
=item $bay->i_mac()
|
||||
|
||||
Returns the C<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 Pseudo CDP information
|
||||
|
||||
All entries with port=0 are local and ignored.
|
||||
|
||||
=over
|
||||
|
||||
=item $bay->c_if()
|
||||
|
||||
Returns reference to hash. Key: port.1 Value: port (iid)
|
||||
|
||||
=item $bay->c_ip()
|
||||
|
||||
Returns reference 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 neighbors, 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->c_port()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Remote port (interfaces)
|
||||
|
||||
=item $bay->c_platform()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Remote device type
|
||||
|
||||
=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 (C<s5EnMsTopNmmTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $bay->bay_topo_slot()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:slot number
|
||||
|
||||
(C<s5EnMsTopNmmSlot>)
|
||||
|
||||
=item $bay->bay_topo_port()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:Port Number
|
||||
(interface iid)
|
||||
|
||||
(C<s5EnMsTopNmmPort>)
|
||||
|
||||
=item $bay->bay_topo_ip()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:Remote IP address of entry
|
||||
|
||||
(C<s5EnMsTopNmmIpAddr>)
|
||||
|
||||
=item $bay->bay_topo_seg()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:Remote Segment ID
|
||||
|
||||
(C<s5EnMsTopNmmSegId>)
|
||||
|
||||
=item $bay->bay_topo_mac
|
||||
(C<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
|
||||
|
||||
(C<s5EnMsTopNmmChassisType>)
|
||||
|
||||
=item $bay->bay_topo_localseg
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:Boolean, if bay_topo_seg()
|
||||
is local
|
||||
|
||||
(C<s5EnMsTopNmmLocalSeg>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
@@ -46,12 +46,13 @@ use SNMP::Info::Layer3;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS, %SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::RapidCity::MIBS, %SNMP::Info::NortelStack::MIBS,
|
||||
%SNMP::Info::SONMP::MIBS,
|
||||
'BAY-STACK-PETH-EXT-MIB' => 'bspePethPsePortExtMeasuredPower',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
@@ -64,6 +65,7 @@ $VERSION = '2.00';
|
||||
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::LLDP::FUNCS,
|
||||
%SNMP::Info::RapidCity::FUNCS, %SNMP::Info::NortelStack::FUNCS,
|
||||
%SNMP::Info::SONMP::FUNCS,
|
||||
'peth_port_power' => 'bspePethPsePortExtMeasuredPower',
|
||||
);
|
||||
|
||||
# 450's report full duplex as speed = 20mbps?!
|
||||
@@ -79,23 +81,22 @@ $SNMP::Info::SPEED_MAP{2_000_000_000} = '1.0 Gbps';
|
||||
|
||||
sub os {
|
||||
my $baystack = shift;
|
||||
my $descr = $baystack->description();
|
||||
my $model = $baystack->model();
|
||||
my $descr = $baystack->description() || "";
|
||||
my $model = $baystack->model() || "";
|
||||
|
||||
if (( defined $model
|
||||
and $model
|
||||
=~ /(325|420|425|470|460|BPS|2500|3510|4524|4526|4548|4550|5510|5520|5530)/
|
||||
)
|
||||
and ( defined $descr and $descr =~ m/SW:v[3-5]/i )
|
||||
)
|
||||
{
|
||||
return 'boss';
|
||||
}
|
||||
if ( ( defined $descr and $descr =~ /Business Ethernet Switch.*SW:v/i ) )
|
||||
{
|
||||
if ( $descr =~ /Business Ethernet Switch.*SW:v/i ) {
|
||||
return 'bes';
|
||||
}
|
||||
return 'baystack';
|
||||
if ( ( ( $model =~ /(420|425|BPS)/ ) and ( $descr =~ m/SW:v[1-2]/i ) )
|
||||
or ( ( $model =~ /(410|450|380)/ ) ) )
|
||||
{
|
||||
return 'baystack';
|
||||
}
|
||||
if ( $model =~ /VSP/ ) {
|
||||
return 'vsp';
|
||||
}
|
||||
|
||||
return 'boss';
|
||||
}
|
||||
|
||||
sub os_bin {
|
||||
@@ -120,7 +121,7 @@ sub os_bin {
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'nortel';
|
||||
return 'avaya';
|
||||
}
|
||||
|
||||
sub model {
|
||||
@@ -135,9 +136,12 @@ sub model {
|
||||
return '303' if ( defined $descr and $descr =~ /\D303\D/ );
|
||||
return '304' if ( defined $descr and $descr =~ /\D304\D/ );
|
||||
return 'BPS' if ( $model =~ /BPS2000/i );
|
||||
return $2
|
||||
if ( $model
|
||||
=~ /(ES|ERS|BayStack|EthernetRoutingSwitch|EthernetSwitch)-?(\d+)/ );
|
||||
|
||||
# Pull sreg- from all
|
||||
$model =~ s/^sreg-//;
|
||||
# Strip ES/ERS/BayStack etc. from those families
|
||||
$model =~ s/^(E(R)?S|BayStack|Ethernet(Routing)?Switch)-?//;
|
||||
$model =~ s/-ethSwitchNMM//;
|
||||
|
||||
return $model;
|
||||
}
|
||||
@@ -156,7 +160,7 @@ sub interfaces {
|
||||
next unless defined $index;
|
||||
|
||||
# Ignore cascade ports
|
||||
next if $index > 513;
|
||||
next if $index > $index_factor * 8;
|
||||
|
||||
my $port = ( $index % $index_factor );
|
||||
my $slot = ( int( $index / $index_factor ) ) + $slot_offset;
|
||||
@@ -208,147 +212,30 @@ sub i_name {
|
||||
|
||||
sub index_factor {
|
||||
my $baystack = shift;
|
||||
my $model = $baystack->model();
|
||||
my $model = $baystack->model() || "";
|
||||
my $os = $baystack->os();
|
||||
my $os_ver = $baystack->os_ver();
|
||||
my $op_mode = $baystack->ns_op_mode();
|
||||
|
||||
$op_mode = 'pure' unless defined $op_mode;
|
||||
if ( $os_ver =~ m/^(\d+)\./ ) {
|
||||
$os_ver = $1;
|
||||
} else {
|
||||
$os_ver = 1;
|
||||
}
|
||||
|
||||
my $index_factor = 32;
|
||||
$index_factor = 64
|
||||
if ( ( defined $model and $model =~ /(470)/ )
|
||||
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;
|
||||
}
|
||||
|
||||
# Use SONMP and/or LLDP
|
||||
|
||||
sub hasCDP {
|
||||
my $baystack = shift;
|
||||
|
||||
return $baystack->hasLLDP() || $baystack->SUPER::hasCDP();
|
||||
}
|
||||
|
||||
sub c_ip {
|
||||
my $baystack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $cdp = $baystack->SUPER::c_ip($partial) || {};
|
||||
my $lldp = $baystack->lldp_ip($partial) || {};
|
||||
|
||||
my %c_ip;
|
||||
foreach my $iid ( keys %$cdp ) {
|
||||
my $ip = $cdp->{$iid};
|
||||
next unless defined $ip;
|
||||
|
||||
$c_ip{$iid} = $ip;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$lldp ) {
|
||||
my $ip = $lldp->{$iid};
|
||||
next unless defined $ip;
|
||||
|
||||
$c_ip{$iid} = $ip;
|
||||
}
|
||||
return \%c_ip;
|
||||
}
|
||||
|
||||
sub c_if {
|
||||
my $baystack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $lldp = $baystack->lldp_if($partial) || {};
|
||||
my $cdp = $baystack->SUPER::c_if($partial) || {};
|
||||
|
||||
my %c_if;
|
||||
foreach my $iid ( keys %$cdp ) {
|
||||
my $if = $cdp->{$iid};
|
||||
next unless defined $if;
|
||||
|
||||
$c_if{$iid} = $if;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$lldp ) {
|
||||
my $if = $lldp->{$iid};
|
||||
next unless defined $if;
|
||||
|
||||
$c_if{$iid} = $if;
|
||||
}
|
||||
return \%c_if;
|
||||
}
|
||||
|
||||
sub c_port {
|
||||
my $baystack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $lldp = $baystack->lldp_port($partial) || {};
|
||||
my $cdp = $baystack->SUPER::c_port($partial) || {};
|
||||
|
||||
my %c_port;
|
||||
foreach my $iid ( keys %$cdp ) {
|
||||
my $port = $cdp->{$iid};
|
||||
next unless defined $port;
|
||||
|
||||
$c_port{$iid} = $port;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$lldp ) {
|
||||
my $port = $lldp->{$iid};
|
||||
next unless defined $port;
|
||||
|
||||
$c_port{$iid} = $port;
|
||||
}
|
||||
return \%c_port;
|
||||
}
|
||||
|
||||
sub c_id {
|
||||
my $baystack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $lldp = $baystack->lldp_id($partial) || {};
|
||||
my $cdp = $baystack->SUPER::c_id($partial) || {};
|
||||
|
||||
my %c_id;
|
||||
foreach my $iid ( keys %$cdp ) {
|
||||
my $id = $cdp->{$iid};
|
||||
next unless defined $id;
|
||||
|
||||
$c_id{$iid} = $id;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$lldp ) {
|
||||
my $id = $lldp->{$iid};
|
||||
next unless defined $id;
|
||||
|
||||
$c_id{$iid} = $id;
|
||||
}
|
||||
return \%c_id;
|
||||
}
|
||||
|
||||
sub c_platform {
|
||||
my $baystack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $lldp = $baystack->lldp_rem_sysdesc($partial) || {};
|
||||
my $cdp = $baystack->SUPER::c_platform($partial) || {};
|
||||
|
||||
my %c_platform;
|
||||
foreach my $iid ( keys %$cdp ) {
|
||||
my $platform = $cdp->{$iid};
|
||||
next unless defined $platform;
|
||||
|
||||
$c_platform{$iid} = $platform;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$lldp ) {
|
||||
my $platform = $lldp->{$iid};
|
||||
next unless defined $platform;
|
||||
|
||||
$c_platform{$iid} = $platform;
|
||||
}
|
||||
return \%c_platform;
|
||||
}
|
||||
|
||||
# Newer devices support ENTITY-MIB, use if available otherwise use proprietary
|
||||
# methods.
|
||||
@@ -437,14 +324,85 @@ sub e_vendor {
|
||||
return $stack->SUPER::e_vendor($partial) || $stack->ns_e_vendor($partial);
|
||||
}
|
||||
|
||||
# fix for stack of switches without POE on module 1
|
||||
# https://sourceforge.net/tracker/?func=detail&aid=3317739&group_id=70362&atid=527529
|
||||
sub peth_port_ifindex {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my %peth_port_ifindex = ();
|
||||
my $poe_port_st = $stack->peth_port_status($partial);
|
||||
my $if_index = $stack->interfaces($partial);
|
||||
|
||||
foreach my $i (keys %$if_index) {
|
||||
next unless defined $poe_port_st->{$if_index->{$i}};
|
||||
$peth_port_ifindex{$if_index->{$i}} = $i;
|
||||
}
|
||||
return \%peth_port_ifindex;
|
||||
}
|
||||
|
||||
# Currently only ERS 4800 v5.8+ support the rcBridgeSpbmMacTable
|
||||
# which holds the FDB for a SPBM edge deployment.
|
||||
#
|
||||
# Q-BRIDGE still holds some entries when the rcBridgeSpbmMacTable is in use
|
||||
# so we merge hash entries.
|
||||
|
||||
sub fw_mac {
|
||||
my $rapidcity = shift;
|
||||
|
||||
my $qb = $rapidcity->SUPER::fw_mac() || {};
|
||||
my $spbm = $rapidcity->rc_spbm_fw_mac() || {};
|
||||
my $fw_mac = { %$qb, %$spbm };
|
||||
|
||||
return $fw_mac;
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $rapidcity = shift;
|
||||
|
||||
my $qb = $rapidcity->SUPER::fw_port() || {};
|
||||
my $spbm = $rapidcity->rc_spbm_fw_port() || {};
|
||||
my $fw_port = { %$qb, %$spbm };
|
||||
|
||||
return $fw_port;
|
||||
}
|
||||
|
||||
sub fw_status {
|
||||
my $rapidcity = shift;
|
||||
|
||||
my $qb = $rapidcity->SUPER::fw_status() || {};
|
||||
my $spbm = $rapidcity->rc_spbm_fw_status() || {};
|
||||
my $fw_status = { %$qb, %$spbm };
|
||||
|
||||
return $fw_status;
|
||||
}
|
||||
|
||||
sub qb_fw_vlan {
|
||||
my $rapidcity = shift;
|
||||
|
||||
my $qb = $rapidcity->SUPER::qb_fw_vlan() || {};
|
||||
my $spbm = $rapidcity->rc_spbm_fw_vlan() || {};
|
||||
my $qb_fw_vlan = { %$qb, %$spbm };
|
||||
|
||||
return $qb_fw_vlan;
|
||||
}
|
||||
|
||||
# Baystack uses S5-AGENT-MIB (loaded in NortelStack) versus RAPID-CITY
|
||||
sub stp_ver {
|
||||
my $rapidcity = shift;
|
||||
|
||||
return $rapidcity->s5AgSysSpanningTreeOperMode()
|
||||
|| $rapidcity->SUPER::stp_ver();
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Baystack - SNMP Interface to Nortel Ethernet (Baystack)
|
||||
Switches
|
||||
SNMP::Info::Layer2::Baystack - SNMP Interface to Avaya Ethernet Switch
|
||||
(Baystack) and VSP 7000 series switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
@@ -467,8 +425,9 @@ Eric Miller
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a Nortel
|
||||
Ethernet Switch (Baystack) through SNMP.
|
||||
Provides abstraction to the configuration information obtainable from an
|
||||
Avaya Ethernet Switch (formerly Nortel/Bay Baystack) and VSP 7000 series
|
||||
through SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
@@ -495,6 +454,8 @@ my $baystack = new SNMP::Info::Layer2::Baystack(...);
|
||||
|
||||
=over
|
||||
|
||||
=item F<BAY-STACK-PETH-EXT-MIBB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
@@ -517,7 +478,7 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=item $baystack->vendor()
|
||||
|
||||
Returns 'nortel'
|
||||
Returns 'avaya'
|
||||
|
||||
=item $baystack->model()
|
||||
|
||||
@@ -537,6 +498,14 @@ Returns 'baystack' or 'boss' depending on software version.
|
||||
|
||||
Returns the firmware version extracted from C<sysDescr>.
|
||||
|
||||
=item $baystack->stp_ver()
|
||||
|
||||
Returns the particular STP version running on this device.
|
||||
|
||||
Values: C<nortelStpg>, C<pvst>, C<rstp>, C<mstp>, C<ieee8021d>
|
||||
|
||||
(C<s5AgSysSpanningTreeOperMode>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
@@ -613,6 +582,16 @@ revisions of Baystack firmware report all zeros for each port mac.
|
||||
Crosses C<ifName> with C<ifAlias> and returns the human set port name if
|
||||
exists.
|
||||
|
||||
=item $baystack->peth_port_ifindex()
|
||||
|
||||
Maps the C<pethPsePortTable> to C<ifIndex> by way of the F<ENTITY-MIB>.
|
||||
|
||||
=item $baystack->peth_port_power()
|
||||
|
||||
Power supplied by PoE ports, in milliwatts
|
||||
|
||||
(C<bspePethPsePortExtMeasuredPower>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 F<ENTITY-MIB> Information
|
||||
@@ -683,51 +662,29 @@ ns_e_vendor().
|
||||
|
||||
=back
|
||||
|
||||
=head2 Topology information
|
||||
=head2 Layer 2 Forwarding Database
|
||||
|
||||
Based upon the software version devices may support SynOptics Network
|
||||
Management Protocol (SONMP) and Link Layer Discovery Protocol (LLDP). These
|
||||
methods will query both and return the combination of all information. As a
|
||||
result, there may be identical topology information returned from the two
|
||||
protocols causing duplicate entries. It is the calling program's
|
||||
responsibility to identify any duplicate entries and remove duplicates if
|
||||
necessary.
|
||||
These methods try to obtain the layer 2 forwarding database entries via the
|
||||
normal bridge methods as well as SPBM entries via rapid city methods.
|
||||
|
||||
=over
|
||||
|
||||
=item $baystack->hasCDP()
|
||||
=item $baystack->fw_mac()
|
||||
|
||||
Returns true if the device is running either SONMP or LLDP.
|
||||
Returns reference to hash of forwarding table MAC Addresses
|
||||
|
||||
=item $baystack->c_if()
|
||||
=item $baystack->fw_port()
|
||||
|
||||
Returns reference to hash. Key: iid Value: local device port (interfaces)
|
||||
Returns reference to hash of forwarding table entries port interface
|
||||
identifier (iid)
|
||||
|
||||
=item $baystack->c_ip()
|
||||
=item $baystack->qb_fw_vlan()
|
||||
|
||||
Returns reference to hash. Key: iid Value: remote IPv4 address
|
||||
Returns reference to hash of forwarding table entries VLAN ID
|
||||
|
||||
If multiple entries exist with the same local port, c_if(), with the same IPv4
|
||||
address, c_ip(), it may be a duplicate entry.
|
||||
=item $baystack->fw_status()
|
||||
|
||||
If multiple entries exist with the same local port, c_if(), with different
|
||||
IPv4 addresses, c_ip(), there is either a non-SONMP/LLDP device in between two or
|
||||
more devices or multiple devices which are not directly connected.
|
||||
|
||||
Use the data from the Layer2 Topology Table below to dig deeper.
|
||||
|
||||
=item $baystack->c_port()
|
||||
|
||||
Returns reference to hash. Key: iid Value: remote port (interfaces)
|
||||
|
||||
=item $baystack->c_id()
|
||||
|
||||
Returns reference to hash. Key: iid Value: string value used to identify the
|
||||
chassis component associated with the remote system.
|
||||
|
||||
=item $baystack->c_platform()
|
||||
|
||||
Returns reference to hash. Key: iid Value: Remote Device Type
|
||||
Returns reference to hash of forwarding table entries status
|
||||
|
||||
=back
|
||||
|
||||
|
||||
@@ -37,19 +37,23 @@ use Exporter;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::CiscoStpExtensions;
|
||||
use SNMP::Info::CiscoAgg;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::C1900::ISA = qw/SNMP::Info::CDP SNMP::Info::CiscoStats
|
||||
SNMP::Info::CiscoConfig SNMP::Info::Layer2
|
||||
SNMP::Info::CiscoConfig SNMP::Info::CiscoStpExtensions SNMP::Info::CiscoAgg SNMP::Info::Layer2
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer2::C1900::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::CiscoAgg::GLOBALS,
|
||||
%SNMP::Info::CiscoStpExtensions::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
@@ -58,6 +62,8 @@ $VERSION = '2.00';
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::CiscoAgg::FUNCS,
|
||||
%SNMP::Info::CiscoStpExtensions::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
@@ -75,6 +81,8 @@ $VERSION = '2.00';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::CiscoAgg::MIBS,
|
||||
%SNMP::Info::CiscoStpExtensions::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
@@ -84,8 +92,9 @@ $VERSION = '2.00';
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoAgg::MUNGE,
|
||||
%SNMP::Info::CiscoStpExtensions::MUNGE, %SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
|
||||
);
|
||||
|
||||
sub bulkwalk_no { return 1; }
|
||||
@@ -203,7 +212,8 @@ sub i_vlan {
|
||||
my $partial = shift;
|
||||
|
||||
# Overlap allows more than one VLAN per port. Unable to determine default
|
||||
my $overlap = $c1900->bridgeGroupAllowMembershipOverlap()
|
||||
my $overlap
|
||||
= $c1900->bridgeGroupAllowMembershipOverlap()
|
||||
|| $c1900->vlanAllowMembershipOverlap()
|
||||
|| 'disabled';
|
||||
|
||||
@@ -251,6 +261,20 @@ sub i_vlan_membership {
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
sub i_vlan_membership_untagged { return; }
|
||||
|
||||
sub bp_index {
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $if_index = $c1900->i_index($partial);
|
||||
my $index = $c1900->orig_bp_index($partial) || {};
|
||||
foreach my $iid ( keys %$if_index ) {
|
||||
$index->{$iid} = $iid if ( !defined $index->{$iid} );
|
||||
}
|
||||
return $index;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
@@ -300,6 +324,10 @@ after determining a more specific class using the method above.
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=item SNMP::Info::CiscoStpExtensions
|
||||
|
||||
=item SNMP::Info::CiscoAgg
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
@@ -324,6 +352,10 @@ See L<SNMP::Info::CiscoStats/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoAgg/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
@@ -382,6 +414,14 @@ See L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
See L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoAgg
|
||||
|
||||
See L<SNMP::Info::CiscoAgg/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
@@ -432,6 +472,16 @@ bridge group IDs.
|
||||
print "Port: $port VLAN: $vlan\n";
|
||||
}
|
||||
|
||||
=item $c1900->i_vlan_membership_untagged()
|
||||
|
||||
Unsupported, returns nothing.
|
||||
|
||||
=item $c1900->bp_index()
|
||||
|
||||
Returns a bp_index that contains the original bp_index entries and extra
|
||||
entries for those interfaces listed in if_index, as some C1900 devices do not
|
||||
return complete bp_indexes.
|
||||
|
||||
=back
|
||||
|
||||
=head2 F<STAND-ALONE-ETHERNET-SWITCH-MIB> Switch Port Table Entries:
|
||||
@@ -494,6 +544,14 @@ See L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
See L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoAgg
|
||||
|
||||
See L<SNMP::Info::CiscoAgg/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
@@ -34,33 +34,21 @@ package SNMP::Info::Layer2::C2900;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::Layer2::Cisco;
|
||||
|
||||
@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::ISA = qw/SNMP::Info::Layer2::Cisco Exporter/;
|
||||
@SNMP::Info::Layer2::C2900::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS, %SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
%SNMP::Info::Layer2::Cisco::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
%SNMP::Info::Layer2::Cisco::FUNCS,
|
||||
'i_name' => 'ifAlias',
|
||||
|
||||
# C2900PortEntry
|
||||
@@ -71,15 +59,12 @@ $VERSION = '2.00';
|
||||
);
|
||||
|
||||
%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',
|
||||
%SNMP::Info::Layer2::Cisco::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,
|
||||
%SNMP::Info::Layer2::Cisco::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
@@ -139,6 +124,32 @@ sub i_duplex_admin {
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
sub i_speed_admin {
|
||||
my $c2900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my %i_speed_admin;
|
||||
my $p_port = $c2900->p_port() || {};
|
||||
my $interfaces = $c2900->interfaces($partial);
|
||||
my $c2900_p_index = $c2900->c2900_p_index() || {};
|
||||
|
||||
my %reverse_2900 = reverse %$c2900_p_index;
|
||||
my $c2900_p_speed
|
||||
= $c2900->c2900_p_speed_admin( $reverse_2900{$partial} );
|
||||
|
||||
my %speeds = (
|
||||
'autoDetect' => 'auto',
|
||||
's10000000' => '10 Mbps',
|
||||
's100000000' => '100 Mbps',
|
||||
);
|
||||
|
||||
%i_speed_admin
|
||||
= map { $c2900_p_index->{$_} => $speeds{ $c2900_p_speed->{$_} } }
|
||||
keys %$c2900_p_index;
|
||||
|
||||
return \%i_speed_admin;
|
||||
}
|
||||
|
||||
sub set_i_speed_admin {
|
||||
my $c2900 = shift;
|
||||
my ( $speed, $iid ) = @_;
|
||||
@@ -243,15 +254,7 @@ after determining 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
|
||||
=item SNMP::Info::Layer2::Cisco
|
||||
|
||||
=back
|
||||
|
||||
@@ -267,15 +270,7 @@ Part of the v2 MIBs from Cisco.
|
||||
|
||||
=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.
|
||||
See L<SNMP::Info::Layer2::Cisco/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
@@ -295,25 +290,9 @@ Returns 1. Use vlan indexing.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoVTP
|
||||
=head2 Globals imported from SNMP::Info::Layer2::Cisco
|
||||
|
||||
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 L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
See L<SNMP::Info::Layer2::Cisco/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
@@ -349,6 +328,10 @@ Returns reference to hash of IIDs to admin duplex setting
|
||||
|
||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin()
|
||||
|
||||
=item $c2900->i_speed_admin()
|
||||
|
||||
Returns reference to hash of IIDs to admin speed setting.
|
||||
|
||||
=back
|
||||
|
||||
=head2 F<C2900-MIB> Port Entry Table
|
||||
@@ -381,25 +364,9 @@ Gives Admin speed of port
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2::Cisco
|
||||
|
||||
See L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
See L<SNMP::Info::Layer2::Cisco/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 SET METHODS
|
||||
|
||||
|
||||
@@ -34,48 +34,34 @@ package SNMP::Info::Layer2::Catalyst;
|
||||
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 SNMP::Info::Layer2::Cisco;
|
||||
|
||||
@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/;
|
||||
= qw/SNMP::Info::CiscoStack SNMP::Info::Layer2::Cisco Exporter/;
|
||||
@SNMP::Info::Layer2::Catalyst::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%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,
|
||||
%SNMP::Info::Layer2::Cisco::MIBS,
|
||||
%SNMP::Info::CiscoStack::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::CiscoPortSecurity::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
%SNMP::Info::Layer2::Cisco::GLOBALS,
|
||||
%SNMP::Info::CiscoStack::GLOBALS,
|
||||
);
|
||||
|
||||
%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,
|
||||
%SNMP::Info::Layer2::Cisco::FUNCS,
|
||||
%SNMP::Info::CiscoStack::FUNCS,
|
||||
);
|
||||
|
||||
%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,
|
||||
%SNMP::Info::Layer2::Cisco::MUNGE,
|
||||
%SNMP::Info::CiscoStack::MUNGE,
|
||||
);
|
||||
|
||||
# Overidden Methods
|
||||
@@ -148,7 +134,9 @@ sub 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;
|
||||
@@ -226,18 +214,10 @@ after determining a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2::Cisco
|
||||
|
||||
=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
|
||||
|
||||
=head2 Required MIBs
|
||||
@@ -246,19 +226,10 @@ after determining a more specific class using the method above.
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer2::Cisco/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStack/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
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
|
||||
|
||||
These MIBs are found in the standard v2 MIBs from Cisco.
|
||||
@@ -288,30 +259,14 @@ Returns 1. Use vlan indexing.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer2::Cisco
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2::Cisco/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoStack
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
@@ -346,29 +301,12 @@ have problems with F<BRIDGE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2::Cisco
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2::Cisco/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStack
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStack/"TABLE METHODS"> for details.
|
||||
|
||||
=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::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
|
||||
details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -43,7 +43,7 @@ use SNMP::Info::SONMP;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS,
|
||||
@@ -246,6 +246,20 @@ sub slot_offset {
|
||||
return 0;
|
||||
}
|
||||
|
||||
sub fw_mac {
|
||||
my $centillion = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $centillion->SUPER::fw_mac($partial);
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $centillion = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $centillion->SUPER::fw_port($partial);
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
@@ -371,11 +385,6 @@ Returns 'Centillion'
|
||||
|
||||
=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
|
||||
|
||||
@@ -35,49 +35,71 @@ 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::CiscoPortSecurity;
|
||||
use SNMP::Info::CiscoStpExtensions;
|
||||
use SNMP::Info::CiscoAgg;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::Cisco::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
|
||||
SNMP::Info::CiscoStats SNMP::Info::CiscoImage
|
||||
SNMP::Info::CiscoRTT SNMP::Info::CiscoQOS
|
||||
SNMP::Info::CiscoConfig SNMP::Info::Layer2
|
||||
SNMP::Info::CiscoStats SNMP::Info::CiscoRTT
|
||||
SNMP::Info::CiscoConfig SNMP::Info::CiscoPortSecurity
|
||||
SNMP::Info::CiscoStpExtensions SNMP::Info::CiscoAgg
|
||||
SNMP::Info::Layer2
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer2::Cisco::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%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,
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::CiscoAgg::MIBS,
|
||||
%SNMP::Info::CiscoStpExtensions::MIBS,
|
||||
%SNMP::Info::CiscoPortSecurity::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CiscoRTT::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::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,
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::CiscoAgg::GLOBALS,
|
||||
%SNMP::Info::CiscoStpExtensions::GLOBALS,
|
||||
%SNMP::Info::CiscoPortSecurity::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoRTT::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS, %SNMP::Info::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,
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::CiscoAgg::FUNCS,
|
||||
%SNMP::Info::CiscoStpExtensions::FUNCS,
|
||||
%SNMP::Info::CiscoPortSecurity::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CiscoRTT::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::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,
|
||||
%SNMP::Info::Layer2::MUNGE,
|
||||
%SNMP::Info::CiscoAgg::MUNGE,
|
||||
%SNMP::Info::CiscoStpExtensions::MUNGE,
|
||||
%SNMP::Info::CiscoPortSecurity::MUNGE,
|
||||
%SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CiscoRTT::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
);
|
||||
|
||||
1;
|
||||
@@ -85,8 +107,9 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Cisco - SNMP Interface to L3 and L2+L3 IOS Cisco Device
|
||||
that are not covered in other classes.
|
||||
SNMP::Info::Layer2::Cisco - SNMP Interface to L2 Cisco devices that are
|
||||
not covered in other classes and the base L2 Cisco class for other device
|
||||
specific L2 Cisco classes.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
@@ -110,7 +133,8 @@ Max Baker
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Generic Cisco Routers running IOS
|
||||
Subclass for Generic Layer 2 Cisco devices and the base L2 Cisco class for
|
||||
other device specific L2 Cisco classes.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
@@ -122,14 +146,16 @@ Subclass for Generic Cisco Routers running IOS
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoImage
|
||||
|
||||
=item SNMP::Info::CiscoRTT
|
||||
|
||||
=item SNMP::Info::CiscoQOS
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=item SNMP::Info::CiscoPortSecurity
|
||||
|
||||
=item SNMP::Info::CiscoStpExtensions
|
||||
|
||||
=item SNMP::Info::CiscoAgg
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
@@ -142,18 +168,20 @@ Subclass for Generic Cisco Routers running IOS
|
||||
|
||||
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::CiscoStats/"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::CiscoPortSecurity/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoAgg/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
@@ -182,22 +210,26 @@ See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
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::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoAgg
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoAgg/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
@@ -219,22 +251,26 @@ See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
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::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoAgg
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoAgg/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
274
Info/Layer2/CiscoSB.pm
Normal file
274
Info/Layer2/CiscoSB.pm
Normal file
@@ -0,0 +1,274 @@
|
||||
# SNMP::Info::Layer2::CiscoSB
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2013 Nic Bernstein
|
||||
#
|
||||
# Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::CiscoSB;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::Entity;
|
||||
use SNMP::Info::EtherLike;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::CDP;
|
||||
|
||||
@SNMP::Info::Layer2::CiscoSB::ISA
|
||||
= qw/SNMP::Info::Layer2 SNMP::Info::Entity SNMP::Info::EtherLike
|
||||
SNMP::Info::CiscoStats SNMP::Info::CiscoConfig SNMP::Info::CDP Exporter/;
|
||||
@SNMP::Info::Layer2::CiscoSB::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.33';
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::Entity::GLOBALS,
|
||||
%SNMP::Info::EtherLike::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
'descr' => 'sysDescr'
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::Entity::FUNCS,
|
||||
%SNMP::Info::EtherLike::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
);
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::Entity::MIBS,
|
||||
%SNMP::Info::EtherLike::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE,
|
||||
%SNMP::Info::Entity::MUNGE,
|
||||
%SNMP::Info::EtherLike::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE,
|
||||
);
|
||||
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'ros';
|
||||
}
|
||||
|
||||
# Walk the entPhysicalSerialNum table and return the first serial found
|
||||
sub serial {
|
||||
my $ciscosb = shift;
|
||||
my $e_serial = $ciscosb->e_serial();
|
||||
|
||||
# Find entity table entry for this unit
|
||||
foreach my $e ( sort keys %$e_serial ) {
|
||||
if (defined $e_serial->{$e} and $e_serial->{$e} !~ /^\s*$/) {
|
||||
return $e_serial->{$e};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $ciscosb = shift;
|
||||
my $e_swver = $ciscosb->e_swver();
|
||||
|
||||
foreach my $e ( sort keys %$e_swver ) {
|
||||
if (defined $e_swver->{$e} and $e_swver->{$e} !~ /^\s*$/) {
|
||||
return $e_swver->{$e};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Grab e_model from Entity and tag on e_hwver
|
||||
sub model {
|
||||
my $ciscosb = shift;
|
||||
my $e_model = $ciscosb->e_model();
|
||||
my $e_hwver = $ciscosb->e_hwver();
|
||||
|
||||
foreach my $e ( sort keys %$e_model ) {
|
||||
if (defined $e_model->{$e} and $e_model->{$e} !~ /^\s*$/) {
|
||||
my $model = "$e_model->{$e} $e_hwver->{$e}";
|
||||
return $model;
|
||||
}
|
||||
}
|
||||
return $ciscosb->description();
|
||||
}
|
||||
|
||||
# ifDescr is the same for all interfaces in a class, but the ifName is
|
||||
# unique, so let's use that for port name.
|
||||
sub interfaces {
|
||||
my $ciscosb = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $ciscosb->i_name($partial);
|
||||
|
||||
return $interfaces;
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::CiscoSB - SNMP Interface to Cisco Small Business series
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Nic Bernstein (shamelessly stolen from Max Baker's Aironet code)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $ciscosb = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $ciscosb->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides interface to SNMP Data available on Cisco Small Business (nee LinkSys)
|
||||
managed switches. [i.e. those matching enterprises(1).cisco(9).otherEnterprises(6).ciscosb(1)]
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=item SNMP::Info::Entity
|
||||
|
||||
=item SNMP::Info::EtherLike
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes
|
||||
|
||||
MIBs required by the inherited classes listed above.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $ciscosb->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=item $ciscosb->os()
|
||||
|
||||
Returns 'ros'
|
||||
|
||||
=item $ciscosb->os_ver()
|
||||
|
||||
Returns software version (C<entPhysicalSoftwareRev>)
|
||||
|
||||
=item $ciscosb->serial()
|
||||
|
||||
Returns serial number of unit (C<entPhysicalSerialNum>)
|
||||
|
||||
=item $ciscosb->model()
|
||||
|
||||
Returns model and hardware revision of unit
|
||||
(C<entPhysicalModelName+entPhysicalHardwareRev>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Entity
|
||||
|
||||
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::EtherLike
|
||||
|
||||
See documentation in L<SNMP::Info::EtherLike/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $ciscosb->interfaces()
|
||||
|
||||
Uses the i_name() field.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Entity
|
||||
|
||||
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::EtherLike
|
||||
|
||||
See documentation in L<SNMP::Info::EtherLike/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
@@ -1,349 +0,0 @@
|
||||
# SNMP::Info::Layer2::Foundry - SNMP Interface to Foundry Switches
|
||||
# $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::Foundry;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::FDP;
|
||||
use SNMP::Info::EtherLike;
|
||||
use SNMP::Info::MAU;
|
||||
|
||||
@SNMP::Info::Layer2::Foundry::ISA
|
||||
= qw/SNMP::Info::Layer2 SNMP::Info::FDP SNMP::Info::EtherLike
|
||||
SNMP::Info::MAU Exporter/;
|
||||
@SNMP::Info::Layer2::Foundry::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS, %SNMP::Info::FDP::MIBS,
|
||||
%SNMP::Info::EtherLike::MIBS, %SNMP::Info::MAU::MIBS,
|
||||
'FOUNDRY-SN-ROOT-MIB' => 'foundry',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::FDP::GLOBALS,
|
||||
%SNMP::Info::EtherLike::GLOBALS, %SNMP::Info::MAU::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS, %SNMP::Info::FDP::FUNCS,
|
||||
%SNMP::Info::EtherLike::FUNCS, %SNMP::Info::MAU::FUNCS,
|
||||
'test' => 'dot1dStpPortState',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::FDP::MUNGE,
|
||||
%SNMP::Info::EtherLike::MUNGE, %SNMP::Info::MAU::MUNGE,
|
||||
);
|
||||
|
||||
# Method OverRides
|
||||
|
||||
#sub bulkwalk_no { 1;}
|
||||
|
||||
*SNMP::Info::Layer2::Foundry::i_duplex = \&SNMP::Info::MAU::mau_i_duplex;
|
||||
*SNMP::Info::Layer2::Foundry::i_duplex_admin
|
||||
= \&SNMP::Info::MAU::mau_i_duplex_admin;
|
||||
*SNMP::Info::Layer2::Foundry::i_vlan = \&SNMP::Info::Bridge::qb_i_vlan_t;
|
||||
|
||||
# todo doc these
|
||||
|
||||
sub os_ver {
|
||||
my $foundry = shift;
|
||||
|
||||
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';
|
||||
}
|
||||
|
||||
# Default to OID method if no dice.
|
||||
unless ( defined $unit_iid ) {
|
||||
return $foundry->SUPER::model();
|
||||
}
|
||||
|
||||
# Find Model Name
|
||||
my $e_fwver = $foundry->e_fwver();
|
||||
if ( defined $e_fwver->{$unit_iid} ) {
|
||||
return $e_fwver->{$unit_iid};
|
||||
}
|
||||
|
||||
# Not found in ENTITY-MIB, go up a level.
|
||||
return $foundry->SUPER::os_ver();
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $foundry = shift;
|
||||
|
||||
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';
|
||||
}
|
||||
|
||||
# Default to OID method if no dice.
|
||||
unless ( defined $unit_iid ) {
|
||||
return $foundry->SUPER::model();
|
||||
}
|
||||
|
||||
# Find Model Name
|
||||
my $e_model = $foundry->e_model();
|
||||
if ( defined $e_model->{$unit_iid} ) {
|
||||
return $e_model->{$unit_iid};
|
||||
}
|
||||
|
||||
# Not found in ENTITY-MIB, go up a level.
|
||||
return $foundry->SUPER::model();
|
||||
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $foundry = shift;
|
||||
|
||||
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';
|
||||
}
|
||||
return unless 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};
|
||||
|
||||
return $foundry->SUPER::serial();
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $foundry = shift;
|
||||
my $i_descr = $foundry->i_description;
|
||||
my $i_name = $foundry->i_name;
|
||||
|
||||
# use ifName only if it is in portn
|
||||
# format. 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;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $foundry = shift;
|
||||
my $i_type = $foundry->i_type();
|
||||
|
||||
my %i_ignore = ();
|
||||
|
||||
foreach my $iid ( keys %$i_type ) {
|
||||
my $type = $i_type->{$iid} || '';
|
||||
$i_ignore{$iid}++
|
||||
|
||||
# 33 is the console port
|
||||
if $type =~ /(loopback|propvirtual|other|cpu|33)/i;
|
||||
}
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'foundry';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'foundry';
|
||||
}
|
||||
|
||||
# this hangs on a edgeiron24g
|
||||
# TODO: check by devicetype and deferr to SUPER if not bad device
|
||||
sub stp_p_state { return; }
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Foundry - SNMP Interface to Foundry FastIron Network
|
||||
Devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
This module is Deprecated. Please use Layer3::Foundry instead.
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $foundry = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $foundry->class();
|
||||
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This module is Deprecated. Please use Layer3::Foundry instead.
|
||||
|
||||
This module provides support for Foundry EdgeIron Switches
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=item SNMP::Info::FDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<FOUNDRY-SN-ROOT-MIB>
|
||||
|
||||
=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 $foundry->model()
|
||||
|
||||
Returns model type.
|
||||
|
||||
=item $foundry->vendor()
|
||||
|
||||
Returns 'foundry'
|
||||
|
||||
=item $foundry->os()
|
||||
|
||||
Returns 'foundry'
|
||||
|
||||
=item $foundry->os_ver()
|
||||
|
||||
Returns the software version
|
||||
|
||||
=item $foundry->serial()
|
||||
|
||||
Returns the serial number
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::FDP
|
||||
|
||||
See documentation in L<SNMP::Info::FDP/"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 $foundry->interfaces()
|
||||
|
||||
Returns reference to hash of interface names to iids.
|
||||
|
||||
=item $foundry->i_ignore()
|
||||
|
||||
Returns reference to hash of interfaces to be ignored.
|
||||
|
||||
Ignores interfaces with descriptions of tunnel,loopback,null
|
||||
|
||||
=item $foundry->i_duplex()
|
||||
|
||||
Returns reference to hash of interface link duplex status.
|
||||
|
||||
Crosses $foundry->sw_duplex() with $foundry->sw_index()
|
||||
|
||||
=item $foundry->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of interface administrative duplex status.
|
||||
|
||||
=item $foundry->stp_p_state()
|
||||
|
||||
"The port's current state as defined by application of the Spanning Tree
|
||||
Protocol.
|
||||
|
||||
Skipped if device is an EdgeIron 24G due to reports of hangs.
|
||||
|
||||
(C<dot1dStpPortState>)
|
||||
|
||||
=item $foundry->i_vlan()
|
||||
|
||||
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
|
||||
|
||||
=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::FDP
|
||||
|
||||
See documentation in L<SNMP::Info::FDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
File diff suppressed because it is too large
Load Diff
744
Info/Layer2/HP4000.pm
Normal file
744
Info/Layer2/HP4000.pm
Normal file
@@ -0,0 +1,744 @@
|
||||
# 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.33';
|
||||
|
||||
%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 i_vlan_membership_untagged {
|
||||
my $hp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $vlans = $hp->i_vlan($partial);
|
||||
my $i_vlan_membership = {};
|
||||
foreach my $port (keys %$vlans) {
|
||||
my $vlan = $vlans->{$port};
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan );
|
||||
}
|
||||
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
sub set_i_vlan {
|
||||
my $hp = shift;
|
||||
my $rv;
|
||||
|
||||
my $hp_v_index = $hp->hp_v_index();
|
||||
my $hp_v_if_tag = $hp->hp_v_if_tag();
|
||||
if (defined $hp_v_index and scalar(keys %$hp_v_index)){
|
||||
my $vlan = shift;
|
||||
my $iid = shift;
|
||||
my $old_untagged;
|
||||
# Hash to lookup VLAN index of the VID (dot1q tag)
|
||||
my %vl_trans = reverse %$hp_v_index;
|
||||
|
||||
# Translate the VLAN identifier (tag) value to the index used by the HP-VLAN MIB
|
||||
my $vlan_index = $vl_trans{$vlan};
|
||||
if (defined $vlan_index) {
|
||||
|
||||
# First, loop through table to determine current untagged vlan for the port we're about to change
|
||||
foreach my $row (keys %$hp_v_if_tag){
|
||||
my ($index,$if) = split(/\./,$row);
|
||||
if ($if == $iid and $hp_v_if_tag->{$row} =~ /untagged/) {
|
||||
# Store the row information of the current untagged VLAN and temporarily set it to tagged
|
||||
$old_untagged = $row;
|
||||
$rv = $hp->set_hp_v_if_tag(1, $row);
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
# Then set our port untagged in the desired VLAN
|
||||
my $rv = $hp->set_hp_v_if_tag(2, "$vlan_index.$iid");
|
||||
if (defined $rv) {
|
||||
# If vlan change is successful, remove VLAN that used to be untagged from the port
|
||||
if (defined $old_untagged) {
|
||||
$rv = $hp->set_hp_v_if_tag(3, $old_untagged);
|
||||
$hp->error_throw("Error removing previous untagged vlan from port, should never happen...\n") unless defined $rv;
|
||||
}
|
||||
} else {
|
||||
# If vlan change was not 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->i_vlan_membership_untagged()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
IDs. These are the VLANs which are members of the untagged egress list for
|
||||
the port.
|
||||
|
||||
=item $hp->v_index()
|
||||
|
||||
Returns VLAN IDs
|
||||
|
||||
=item $hp->v_name()
|
||||
|
||||
Returns VLAN names
|
||||
|
||||
=item $hp->bp_index()
|
||||
|
||||
Returns reference to hash of bridge port table entries map back to interface
|
||||
identifier (iid)
|
||||
|
||||
Returns (C<ifIndex>) for both key and value for 1600, 2424, 4000, and 8000
|
||||
models since they seem to have problems with F<BRIDGE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 SET METHODS
|
||||
|
||||
These are methods that provide SNMP set functionality for overridden methods
|
||||
or provide a simpler interface to complex set operations. See
|
||||
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
|
||||
operations.
|
||||
|
||||
=over
|
||||
|
||||
=item set_i_vlan()
|
||||
|
||||
=item set_i_vlan_tagged()
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
214
Info/Layer2/HPVC.pm
Normal file
214
Info/Layer2/HPVC.pm
Normal file
@@ -0,0 +1,214 @@
|
||||
# SNMP::Info::Layer2::HPVC - SNMP Interface to HP VirtualConnect Switches
|
||||
#
|
||||
# Copyright (c) 2011 Jeroen van Ingen
|
||||
#
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::HPVC;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer2::HPVC::ISA
|
||||
= qw/SNMP::Info::Layer2 SNMP::Info::LLDP Exporter/;
|
||||
@SNMP::Info::Layer2::HPVC::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
'HPVC-MIB' => 'vcDomainName',
|
||||
'CPQSINFO-MIB' => 'cpqSiSysSerialNum',
|
||||
'HPVCMODULE-MIB' => 'vcModuleDomainName',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
'serial1' => 'cpqSiSysSerialNum.0',
|
||||
'os_ver' => 'cpqHoSWRunningVersion.1',
|
||||
'os_bin' => 'cpqHoFwVerVersion.1',
|
||||
'productname' => 'cpqSiProductName.0',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer2::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
);
|
||||
|
||||
|
||||
# Method Overrides
|
||||
|
||||
sub os {
|
||||
return 'hpvc';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'hp';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $hp = shift;
|
||||
return $hp->productname();
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::HPVC - SNMP Interface to HP Virtual Connect Switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Jeroen van Ingen
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $hp = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $hp->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
HP Virtual Connect Switch via SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $hp = new SNMP::Info::Layer2::HPVC(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<HPVC-MIB>
|
||||
|
||||
=item F<CPQSINFO-MIB>
|
||||
|
||||
=item F<HPVCMODULE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
All required MIBs can be found in the netdisco-mibs package.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $hp->os()
|
||||
|
||||
Returns C<'hpvc'>
|
||||
|
||||
=item $hp->os_bin()
|
||||
|
||||
C<cpqHoFwVerVersion.1>
|
||||
|
||||
=item $hp->os_ver()
|
||||
|
||||
C<cpqHoSWRunningVersion.1>
|
||||
|
||||
=item $hp->serial()
|
||||
|
||||
C<cpqSiSysSerialNum.0>
|
||||
|
||||
=item $hp->vendor()
|
||||
|
||||
hp
|
||||
|
||||
=item $hp->model()
|
||||
|
||||
C<cpqSiProductName.0>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 MUNGES
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head1 SET METHODS
|
||||
|
||||
These are methods that provide SNMP set functionality for overridden methods
|
||||
or provide a simpler interface to complex set operations. See
|
||||
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
|
||||
operations.
|
||||
|
||||
=cut
|
||||
180
Info/Layer2/Kentrox.pm
Normal file
180
Info/Layer2/Kentrox.pm
Normal file
@@ -0,0 +1,180 @@
|
||||
package SNMP::Info::Layer2::Kentrox;
|
||||
|
||||
# Copyright (c) 2011 Netdisco Project
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::Kentrox::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Kentrox::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/;
|
||||
|
||||
$VERSION = '3.33';
|
||||
|
||||
%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
|
||||
|
||||
@@ -43,7 +43,7 @@ use SNMP::Info::Airespace;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS,
|
||||
|
||||
@@ -42,7 +42,7 @@ use SNMP::Info::Layer2;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS, %SNMP::Info::IEEE802dot11::MIBS,
|
||||
|
||||
1299
Info/Layer2/NWSS2300.pm
Normal file
1299
Info/Layer2/NWSS2300.pm
Normal file
File diff suppressed because it is too large
Load Diff
@@ -33,21 +33,31 @@ 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::Layer2 Exporter/;
|
||||
@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 = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = ( %SNMP::Info::Layer2::MIBS, );
|
||||
# This will be filled in with the device's index into the EntPhysicalEntry
|
||||
# table by the serial() function.
|
||||
our $index = undef;
|
||||
|
||||
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS, );
|
||||
%MIBS = ( %SNMP::Info::Layer2::MIBS, %SNMP::Info::LLDP::MIBS, );
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, );
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::LLDP::GLOBALS,
|
||||
ng_fsosver => '.1.3.6.1.4.1.4526.11.11.1.0',
|
||||
ng_gsmserial => '.1.3.6.1.4.1.4526.10.1.1.1.4.0',
|
||||
ng_gsmosver => '.1.3.6.1.4.1.4526.10.1.1.1.13.0',
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, );
|
||||
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::LLDP::FUNCS, );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::LLDP::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'netgear';
|
||||
@@ -57,33 +67,89 @@ 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.
|
||||
# We will attempt to use Entity-MIB if present. In that case, we will
|
||||
# also set the shared variable $index, which is used by other functions
|
||||
# to index within Entity-MIB tables. This assumes, of course, that there
|
||||
# is only one serial number (entPhysicalSerialNum) present in the table.
|
||||
sub serial {
|
||||
my $netgear = shift;
|
||||
my $serial = undef;
|
||||
|
||||
my $e_serial = $netgear->e_serial();
|
||||
if (defined($e_serial)) { # This unit sports the Entity-MIB
|
||||
# Find entity table entry for this unit
|
||||
foreach my $e ( keys %$e_serial ) {
|
||||
if (defined ($e_serial->{$e}) and $e_serial->{$e} !~ /^\s*$/) {
|
||||
$index = $e;
|
||||
last;
|
||||
}
|
||||
}
|
||||
return $e_serial->{$index} if defined $index;
|
||||
}
|
||||
|
||||
# Without Enitity-MIB, we've got to work our way through a bunch of
|
||||
# different locales...
|
||||
return $netgear->ng_gsmserial() if defined $netgear->model and $netgear->model =~ m/GSM\d/i;;
|
||||
return 'none';
|
||||
}
|
||||
|
||||
# If device supports Entity-MIB, index into that to divine model and
|
||||
# hardware version, otherwise default to sysDescr.
|
||||
sub model {
|
||||
my $netgear = shift;
|
||||
if (defined($index)) {
|
||||
my $model = $netgear->e_descr();
|
||||
my $e_hwver = $netgear->e_hwver();
|
||||
|
||||
$model = "$model->{$index} $e_hwver->{$index}";
|
||||
return $model;
|
||||
}
|
||||
return $netgear->description();
|
||||
}
|
||||
|
||||
#
|
||||
# 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 {
|
||||
# ifDescr is the same for all interfaces in a class, but the ifName is
|
||||
# unique, so let's use that for port name. If all else fails,
|
||||
# concatentate ifDesc and ifIndex.
|
||||
sub interfaces {
|
||||
my $netgear = shift;
|
||||
my $ret = $netgear->qb_fw_mac();
|
||||
$ret = $netgear->orig_fw_mac() if ( !defined($ret) );
|
||||
return $ret;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $netgear->i_index($partial) || {};
|
||||
my $i_descr = $netgear->i_description($partial) || {};
|
||||
my $i_name = $netgear->i_name($partial);
|
||||
my $i_isset = ();
|
||||
# Replace the description with the ifName field, if set
|
||||
foreach my $iid ( keys %$i_name ) {
|
||||
my $name = $i_name->{$iid};
|
||||
next unless defined $name;
|
||||
if (defined $name and $name !~ /^\s*$/) {
|
||||
$interfaces->{$iid} = $name;
|
||||
$i_isset->{$iid} = 1;
|
||||
}
|
||||
}
|
||||
# Replace the Index with the ifDescr field, appended with index
|
||||
# number, to deal with devices with non-unique ifDescr.
|
||||
foreach my $iid ( keys %$i_descr ) {
|
||||
my $port = $i_descr->{$iid} . '-' . $iid;
|
||||
next unless defined $port;
|
||||
next if (defined $i_isset->{$iid} and $i_isset->{$iid} == 1);
|
||||
$interfaces->{$iid} = $port;
|
||||
}
|
||||
|
||||
return $interfaces;
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
# these seem to work for GSM models but not GS
|
||||
# https://sourceforge.net/tracker/?func=detail&aid=3085413&group_id=70362&atid=527529
|
||||
sub os_ver {
|
||||
my $netgear = shift;
|
||||
my $ret = $netgear->qb_fw_port();
|
||||
$ret = $netgear->orig_fw_port() if ( !defined($ret) );
|
||||
return $ret;
|
||||
my $serial = $netgear->serial(); # Make sure that index gets primed
|
||||
if (defined($index)) {
|
||||
my $os_ver = $netgear->e_swver();
|
||||
return $os_ver->{$index} if defined $os_ver;
|
||||
}
|
||||
return $netgear->ng_gsmosver() if defined $netgear->model and $netgear->model =~ m/GSM\d/i;
|
||||
return $netgear->ng_fsosver() if defined $netgear->model and $netgear->model =~ m/FS\d/i;
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -96,7 +162,9 @@ SNMP::Info::Layer2::Netgear - SNMP Interface to Netgear switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Bill Fenner and Zoltan Erszenyi
|
||||
Bill Fenner and Zoltan Erszenyi,
|
||||
Hacked in LLDP support from Baystack.pm by
|
||||
Nic Bernstein <nic@onlight.com>
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -124,6 +192,8 @@ inherited methods.
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
=item SNMP::Info::Entity
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
@@ -136,6 +206,10 @@ inherited methods.
|
||||
MIBs listed in L<SNMP::Info::Layer2/"Required MIBs"> and its inherited
|
||||
classes.
|
||||
|
||||
See L<SNMP::Info::Entity/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
@@ -156,7 +230,17 @@ Returns 'netgear'
|
||||
|
||||
=item $netgear->model()
|
||||
|
||||
Returns description()
|
||||
Returns concatenation of $e_model and $e_hwver if Entity MIB present,
|
||||
otherwise returns description()
|
||||
|
||||
=item $netgear->os_ver()
|
||||
|
||||
Returns OS Version.
|
||||
|
||||
=item $netgear->serial()
|
||||
|
||||
Returns Serial Number if available (older FS switches have no accessible
|
||||
serial number).
|
||||
|
||||
=back
|
||||
|
||||
@@ -164,6 +248,14 @@ Returns description()
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Entity
|
||||
|
||||
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::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
|
||||
@@ -173,22 +265,9 @@ a reference to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $netgear->fw_mac()
|
||||
=item $netgear->interfaces()
|
||||
|
||||
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.
|
||||
Uses the i_name() field.
|
||||
|
||||
=back
|
||||
|
||||
@@ -196,4 +275,12 @@ C<Q-BRIDGE-MIB> doesn't return anything.
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Entity
|
||||
|
||||
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -41,7 +41,7 @@ use SNMP::Info::Layer2;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
@@ -114,6 +114,8 @@ sub model {
|
||||
|
||||
return $1 if ( $descr =~ /(AP-\d+)/ );
|
||||
return 'WavePOINT-II' if ( $descr =~ /WavePOINT-II/ );
|
||||
return 'Outdoor Router' if ( $descr =~ /Wireless Router/ );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
1303
Info/Layer2/Trapeze.pm
Normal file
1303
Info/Layer2/Trapeze.pm
Normal file
File diff suppressed because it is too large
Load Diff
177
Info/Layer2/Ubiquiti.pm
Normal file
177
Info/Layer2/Ubiquiti.pm
Normal file
@@ -0,0 +1,177 @@
|
||||
# SNMP::Info::Layer2::Ubiquiti
|
||||
# $Id$
|
||||
#
|
||||
|
||||
package SNMP::Info::Layer2::Ubiquiti;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::IEEE802dot11;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::Ubiquiti::ISA
|
||||
= qw/SNMP::Info::IEEE802dot11 SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Ubiquiti::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::IEEE802dot11::MIBS,
|
||||
|
||||
);
|
||||
|
||||
%GLOBALS
|
||||
= ( %SNMP::Info::Layer2::GLOBALS, %SNMP::Info::IEEE802dot11::GLOBALS, );
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::IEEE802dot11::FUNCS,
|
||||
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::IEEE802dot11::MUNGE, );
|
||||
|
||||
sub os {
|
||||
return 'Ubiquiti';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $dot11 = shift;
|
||||
|
||||
my $versions = $dot11->dot11_prod_ver();
|
||||
|
||||
foreach my $iid ( keys %$versions ) {
|
||||
my $ver = $versions->{$iid};
|
||||
next unless defined $ver;
|
||||
return $ver;
|
||||
if ( $ver =~ /([\d\.]+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'Ubiquiti Networks, Inc.';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $dot11 = shift;
|
||||
|
||||
my $names = $dot11->dot11_prod_name();
|
||||
|
||||
foreach my $iid ( keys %$names ) {
|
||||
my $prod = $names->{$iid};
|
||||
next unless defined $prod;
|
||||
return $prod;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Ubiquiti - SNMP Interface to Ubiquiti Access Points
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Kosmach
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $ubnt = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $ubnt->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from
|
||||
Ubiquiti Access Point through SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $ubnt = new SNMP::Info::Layer2::Ubiquiti(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=item SNMP::Info::IEEE802dot11
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
None.
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::IEEE802dot11/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $ubnt->vendor()
|
||||
|
||||
Returns 'Ubiquiti Networks, Inc.'
|
||||
|
||||
=item $ubnt->model()
|
||||
|
||||
Returns the model extracted from C<dot11manufacturerProductName>.
|
||||
|
||||
=item $ubnt->os()
|
||||
|
||||
Returns 'Ubiquiti'
|
||||
|
||||
=item $ubnt->os_ver()
|
||||
|
||||
Returns the software version extracted from C<dot11manufacturerProductVersion>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::IEEE802dot11
|
||||
|
||||
See L<SNMP::Info::IEEE802dot11/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::IEEE802dot11
|
||||
|
||||
See L<SNMP::Info::IEEE802dot11/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer2;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );
|
||||
|
||||
164
Info/Layer3.pm
164
Info/Layer3.pm
@@ -39,22 +39,31 @@ 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 SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer3::ISA = qw/SNMP::Info::PowerEthernet
|
||||
@SNMP::Info::Layer3::ISA = qw/
|
||||
SNMP::Info::PowerEthernet SNMP::Info::IPv6
|
||||
SNMP::Info::Entity SNMP::Info::EtherLike
|
||||
SNMP::Info::Bridge SNMP::Info Exporter/;
|
||||
SNMP::Info::Bridge SNMP::Info::AdslLine
|
||||
SNMP::Info::LLDP
|
||||
SNMP::Info Exporter/;
|
||||
@SNMP::Info::Layer3::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%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,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
'IP-MIB' => 'ipNetToMediaIfIndex',
|
||||
'OSPF-MIB' => 'ospfRouterId',
|
||||
'BGP4-MIB' => 'bgpIdentifier',
|
||||
@@ -64,10 +73,13 @@ $VERSION = '2.00';
|
||||
|
||||
# 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,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
'mac' => 'ifPhysAddress.1',
|
||||
'serial1' =>
|
||||
'.1.3.6.1.4.1.9.3.6.3.0', # OLD-CISCO-CHASSIS-MIB::chassisId.0
|
||||
@@ -78,10 +90,13 @@ $VERSION = '2.00';
|
||||
|
||||
%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,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
|
||||
# Obsolete Address Translation Table (ARP Cache)
|
||||
'old_at_index' => 'atIfIndex',
|
||||
@@ -120,18 +135,30 @@ $VERSION = '2.00';
|
||||
'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::AdslLine::MUNGE,
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
%SNMP::Info::EtherLike::MUNGE,
|
||||
%SNMP::Info::Entity::MUNGE,
|
||||
%SNMP::Info::PowerEthernet::MUNGE,
|
||||
%SNMP::Info::IPv6::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
'old_at_paddr' => \&SNMP::Info::munge_mac,
|
||||
'at_paddr' => \&SNMP::Info::munge_mac,
|
||||
'n2p_paddr' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
# Method OverRides
|
||||
@@ -142,6 +169,14 @@ sub root_ip {
|
||||
my $router_ip = $l3->router_ip();
|
||||
my $ospf_ip = $l3->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 ) {
|
||||
@@ -153,45 +188,32 @@ sub root_ip {
|
||||
}
|
||||
}
|
||||
|
||||
return $router_ip
|
||||
if (( defined $router_ip )
|
||||
and ( $router_ip ne '0.0.0.0' )
|
||||
and ( $l3->snmp_connect_ip($router_ip) ) );
|
||||
return;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $l3->interfaces($partial) || {};
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
|
||||
# lo -> cisco aironet 350 loopback
|
||||
if ( $interfaces->{$if} =~ /(tunnel|loopback|\blo\b|null)/i ) {
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $l3 = shift;
|
||||
|
||||
my $serial1 = $l3->serial1();
|
||||
my $e_descr = $l3->e_descr() || {};
|
||||
my $e_serial = $l3->e_serial() || {};
|
||||
my $serial1 = $l3->serial1();
|
||||
my $e_parent = $l3->e_parent() || {};
|
||||
|
||||
my $serial2 = $e_serial->{1} || undef;
|
||||
my $chassis = $e_descr->{1} || undef;
|
||||
foreach my $iid ( keys %$e_parent ) {
|
||||
my $parent = $e_parent->{$iid};
|
||||
if ( $parent eq '0' ) {
|
||||
my $serial = $l3->e_serial($iid);
|
||||
if ( $serial ) {
|
||||
return $serial->{$iid};
|
||||
}
|
||||
else {
|
||||
my $descr = $l3->e_descr($iid);
|
||||
if ( $descr and $descr =~ /serial#?:\s*([a-z0-9]+)/i )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# 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;
|
||||
@@ -268,27 +290,37 @@ sub interfaces {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $l3->i_index($partial);
|
||||
my $descriptions = $l3->i_description($partial);
|
||||
my $interfaces = $l3->i_index($partial);
|
||||
my $i_descr = $l3->i_description($partial);
|
||||
|
||||
my %interfaces = ();
|
||||
foreach my $iid ( keys %$interfaces ) {
|
||||
my $desc = $descriptions->{$iid};
|
||||
next unless defined $desc;
|
||||
|
||||
$interfaces{$iid} = $desc;
|
||||
# Check for duplicates in ifDescr, if so uniquely identify by adding
|
||||
# ifIndex to repeated values
|
||||
my %seen;
|
||||
foreach my $iid ( keys %$i_descr ) {
|
||||
my $port = $i_descr->{$iid};
|
||||
next unless defined $port;
|
||||
if ( $seen{$port}++ ) {
|
||||
$interfaces->{$iid} = sprintf( "%s (%d)", $port, $iid );
|
||||
}
|
||||
else {
|
||||
$interfaces->{$iid} = $port;
|
||||
}
|
||||
}
|
||||
|
||||
return \%interfaces;
|
||||
return $interfaces;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
my $l3 = shift;
|
||||
|
||||
my $descr = $l3->description();
|
||||
my $id = $l3->id();
|
||||
|
||||
# .1.3.6.1.4.1.9.1 is the CISCO-PRODUCTS-MIB
|
||||
# .1.3.6.1.4.1.9.9.368.4 is an old tree that Cisco CSSs were numbered from
|
||||
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 'foundry' if ( $descr =~ /foundry/i );
|
||||
return 'brocade' if ( $descr =~ /foundry/i );
|
||||
|
||||
return 'unknown';
|
||||
|
||||
@@ -380,6 +412,12 @@ after determining a more specific class using the method above.
|
||||
|
||||
=item SNMP::Info::Entity
|
||||
|
||||
=item SNMP::Info::PowerEthernet
|
||||
|
||||
=item SNMP::Info::IPv6
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
@@ -404,6 +442,12 @@ 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.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
@@ -477,6 +521,18 @@ See L<SNMP::Info::EtherLike/"GLOBALS"> for details.
|
||||
|
||||
See L<SNMP::Info::Entity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info:PowerEthernet
|
||||
|
||||
See L<SNMP::Info::PowerEthernet/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::IPv6
|
||||
|
||||
See L<SNMP::Info::IPv6/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
@@ -493,12 +549,6 @@ name.
|
||||
|
||||
Only returns those iids that have a description listed in $l3->i_description()
|
||||
|
||||
=item $l3->i_ignore()
|
||||
|
||||
Returns reference to hash. Creates a key for each IID that should be ignored.
|
||||
|
||||
Currently looks for tunnel,loopback,lo,null from $l3->interfaces()
|
||||
|
||||
=item $l3->i_name()
|
||||
|
||||
Returns reference to hash of iid to human set name.
|
||||
@@ -744,4 +794,16 @@ See L<SNMP::Info::EtherLike/"TABLE METHODS"> for details.
|
||||
|
||||
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.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -41,7 +41,7 @@ use SNMP::Info::Layer3;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
|
||||
@@ -34,20 +34,28 @@ 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::LLDP SNMP::Info::MAU
|
||||
SNMP::Info::Layer3 Exporter/;
|
||||
@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 = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%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',
|
||||
@@ -64,17 +72,17 @@ delete $MIBS{'POWER-ETHERNET-MIB'};
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS, %SNMP::Info::MAU::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS, %SNMP::Info::AMAP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::MAU::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS, %SNMP::Info::AMAP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::MAU::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE, %SNMP::Info::AMAP::MUNGE,
|
||||
);
|
||||
|
||||
# use MAU-MIB for admin. duplex and admin. speed
|
||||
@@ -190,21 +198,6 @@ sub interfaces {
|
||||
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;
|
||||
@@ -285,53 +278,6 @@ sub bp_index {
|
||||
# return $i_vlan;
|
||||
#}
|
||||
|
||||
# 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
|
||||
# )
|
||||
sub hasCDP {
|
||||
my $alu = shift;
|
||||
|
||||
return $alu->hasLLDP();
|
||||
}
|
||||
|
||||
sub c_ip {
|
||||
my $alu = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $alu->lldp_ip($partial);
|
||||
}
|
||||
|
||||
sub c_if {
|
||||
my $alu = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $alu->lldp_if($partial);
|
||||
}
|
||||
|
||||
sub c_port {
|
||||
my $alu = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $alu->lldp_port($partial);
|
||||
}
|
||||
|
||||
sub c_id {
|
||||
my $alu = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $alu->lldp_id($partial);
|
||||
}
|
||||
|
||||
sub c_platform {
|
||||
my $alu = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $alu->lldp_rem_sysdesc($partial);
|
||||
}
|
||||
|
||||
# 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.
|
||||
@@ -428,10 +374,6 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
Returns 'alcatel-lucent'
|
||||
|
||||
=item $alu->hasCDP()
|
||||
|
||||
Returns whether LLDP is enabled.
|
||||
|
||||
=item $alu->model()
|
||||
|
||||
Tries to reference $alu->id() to one of the product MIBs listed above
|
||||
@@ -488,40 +430,12 @@ to a hash.
|
||||
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->c_id()
|
||||
|
||||
Returns LLDP information.
|
||||
|
||||
=item $alu->c_if()
|
||||
|
||||
Returns LLDP information.
|
||||
|
||||
=item $alu->c_ip()
|
||||
|
||||
Returns LLDP information.
|
||||
|
||||
=item $alu->c_platform()
|
||||
|
||||
Returns LLDP information.
|
||||
|
||||
=item $alu->c_port()
|
||||
|
||||
Returns LLDP information.
|
||||
|
||||
=item $alu->i_duplex_admin()
|
||||
|
||||
Returns info from F<MAU-MIB>
|
||||
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer3;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
@@ -66,6 +66,10 @@ $VERSION = '2.00';
|
||||
'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 = (
|
||||
@@ -132,7 +136,7 @@ sub model {
|
||||
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^aceswitch//;
|
||||
$model =~ s/^(aceswitch|aws|ods)//;
|
||||
$model =~ s/^acedirector/AD/;
|
||||
$model =~ s/^(copper|fiber)Module/BladeCenter GbESM/;
|
||||
|
||||
@@ -140,7 +144,7 @@ sub model {
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'nortel';
|
||||
return 'radware';
|
||||
}
|
||||
|
||||
sub os {
|
||||
@@ -155,6 +159,36 @@ sub os_ver {
|
||||
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();
|
||||
@@ -174,6 +208,7 @@ sub interfaces {
|
||||
# varies by switch model
|
||||
elsif ( defined $ip_max and $iid > $ip_max ) {
|
||||
$desc = ( $iid % $ip_max );
|
||||
$desc = 'mgmt' if $desc == 231;
|
||||
}
|
||||
$interfaces{$iid} = $desc;
|
||||
}
|
||||
@@ -207,39 +242,48 @@ sub i_duplex {
|
||||
sub i_duplex_admin {
|
||||
my $alteon = shift;
|
||||
|
||||
my $ag_pref = $alteon->new_ag_p_cfg_pref()
|
||||
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()
|
||||
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()
|
||||
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()
|
||||
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 $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
|
||||
my $i_speed = $alteon->i_speed() || {};
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $if ( keys %$ag_pref ) {
|
||||
my $pref = $ag_pref->{$if};
|
||||
next unless defined $pref;
|
||||
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} || '';
|
||||
|
||||
my $string = 'other';
|
||||
if ( $pref =~ /gigabit/i ) {
|
||||
my $ge_auto = $ag_ge_auto->{$if};
|
||||
$string = 'full' if ( $ge_auto =~ /off/i );
|
||||
$string = 'auto' if ( $ge_auto =~ /on/i );
|
||||
# Default to auto
|
||||
my $string = 'auto';
|
||||
|
||||
if ( $ge_auto =~ /off/i
|
||||
&& ( $pref =~ /gigabit/i || $speed eq '1.0 Gbps' ) )
|
||||
{
|
||||
$string = 'full';
|
||||
}
|
||||
elsif ( $pref =~ /fast/i ) {
|
||||
my $fe_auto = $ag_fe_auto->{$if};
|
||||
my $fe_mode = $ag_fe_mode->{$if};
|
||||
if ( $fe_auto =~ /off/i
|
||||
&& ( $pref =~ /fast/i || $speed =~ /100?\sMbps/ ) )
|
||||
{
|
||||
$string = 'half'
|
||||
if ( $fe_mode =~ /half/i and $fe_auto =~ /off/i );
|
||||
if ( $fe_mode =~ /half/i );
|
||||
$string = 'full'
|
||||
if ( $fe_mode =~ /full/i and $fe_auto =~ /off/i );
|
||||
$string = 'auto' if $fe_auto =~ /on/i;
|
||||
if ( $fe_mode =~ /full/i );
|
||||
}
|
||||
|
||||
my $idx;
|
||||
@@ -341,6 +385,20 @@ sub i_vlan_membership {
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
sub i_vlan_membership_untagged {
|
||||
my $alteon = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $vlans = $alteon->i_vlan($partial);
|
||||
my $i_vlan_membership = {};
|
||||
foreach my $port (keys %$vlans) {
|
||||
my $vlan = $vlans->{$port};
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan );
|
||||
}
|
||||
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
# Bridge MIB does not map Bridge Port to ifIndex correctly on some code
|
||||
# versions
|
||||
sub bp_index {
|
||||
@@ -365,7 +423,7 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::AlteonAD - SNMP Interface to Nortel Alteon Layer 2-7
|
||||
SNMP::Info::Layer3::AlteonAD - SNMP Interface to Radware Alteon ADC
|
||||
Switches.
|
||||
|
||||
=head1 AUTHOR
|
||||
@@ -389,8 +447,8 @@ Eric Miller
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Abstraction subclass for Nortel Alteon Series Layer 2-7 load balancing
|
||||
switches and Nortel BladeCenter Layer2-3 GbE Switch Modules.
|
||||
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.
|
||||
@@ -438,12 +496,12 @@ These are methods that return scalar value from SNMP
|
||||
=item $alteon->model()
|
||||
|
||||
Returns model type. Checks $alteon->id() against the F<ALTEON-ROOT-MIB> and
|
||||
then parses out C<aceswitch>, replaces C<acedirector> with AD, and replaces
|
||||
copperModule/fiberModule with BladeCenter GbESM.
|
||||
then parses out C<aceswitch>, C<aws>, and C<ods> replaces C<acedirector>
|
||||
with AD, and replaces copperModule/fiberModule with BladeCenter GbESM.
|
||||
|
||||
=item $alteon->vendor()
|
||||
|
||||
Returns 'nortel'
|
||||
Returns 'radware'
|
||||
|
||||
=item $alteon->os()
|
||||
|
||||
@@ -469,6 +527,18 @@ Returns the software version reported by C<agSoftwareVersion>
|
||||
|
||||
(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
|
||||
@@ -477,8 +547,8 @@ 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.
|
||||
These are methods that return tables of information in the form of a
|
||||
reference to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
@@ -518,6 +588,12 @@ IDs. These are the VLANs which are members of the egress list for the port.
|
||||
print "Port: $port VLAN: $vlan\n";
|
||||
}
|
||||
|
||||
=item $alteon->i_vlan_membership_untagged()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
IDs. These are the VLANs which are members of the untagged egress list for
|
||||
the port.
|
||||
|
||||
=item $alteon->v_index()
|
||||
|
||||
Returns VLAN IDs
|
||||
|
||||
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.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
'ALTIGA-VERSION-STATS-MIB' => 'alVersionString',
|
||||
'ALTIGA-SESSION-STATS-MIB' => 'alActiveSessionCount',
|
||||
'ALTIGA-HARDWARE-STATS-MIB' => 'alHardwarePs1Type',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
# From ALTIGA-VERSION-STATS-MIB
|
||||
'os_ver' => 'alVersionString',
|
||||
# From ALTIGA-SESSION-STATS-MIB
|
||||
'vpn_act_sess' => 'alActiveSessionCount',
|
||||
'vpn_total_sess' => 'alTotalSessionCount',
|
||||
'vpn_max_sess' => 'alMaxSessionCount',
|
||||
'vpn_l2l_sess' => 'alActiveLanToLanSessionCount',
|
||||
'vpn_mgmt_sess' => 'alActiveManagementSessionCount',
|
||||
'vpn_ras_sess' => 'alActiveRemoteAccessSessionCount',
|
||||
# From ALTIGA-HARDWARE-STATS-MIB
|
||||
'ps1_type' => 'alHardwarePs1Type',
|
||||
'ps1_3v_alarm' => 'alHardwarePs1Voltage3vAlarm',
|
||||
'ps1_5v_alarm' => 'alHardwarePs1Voltage5vAlarm',
|
||||
'ps2_type' => 'alHardwarePs2Type',
|
||||
'ps2_3v_alarm' => 'alHardwarePs2Voltage3vAlarm',
|
||||
'ps2_5v_alarm' => 'alHardwarePs2Voltage5vAlarm',
|
||||
'fan1_alarm' => 'alHardwareFan1RpmAlarm',
|
||||
'fan2_alarm' => 'alHardwareFan2RpmAlarm',
|
||||
'fan3_alarm' => 'alHardwareFan3RpmAlarm',
|
||||
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
'i_type2' => 'ifType',
|
||||
'i_lastchange2' => 'ifLastChange',
|
||||
'vpn_sess_status' => 'alActiveSessionRowStatus',
|
||||
'vpn_sess_user' => 'alActiveSessionUserName',
|
||||
'vpn_sess_peer_ip' => 'alActiveSessionIpAddress',
|
||||
'vpn_sess_protocol' => 'alActiveSessionProtocol',
|
||||
'vpn_sess_encr' => 'alActiveSessionEncrType',
|
||||
'vpn_sess_start' => 'alActiveSessionStartTime',
|
||||
'vpn_sess_conntime' => 'alActiveSessionConnectTime',
|
||||
'vpn_sess_out_oct' => 'alActiveSessionOctetsSent',
|
||||
'vpn_sess_in_oct' => 'alActiveSessionOctetsRcvd',
|
||||
'vpn_sess_group' => 'alActiveSessionGroupName',
|
||||
'vpn_sess_gid' => 'alActiveSessionGroupId',
|
||||
'vpn_sess_rem_ip' => 'alActiveSessionPublicIpAddress',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
'ps1_3v_alarm' => \&munge_alarm,
|
||||
'ps1_5v_alarm' => \&munge_alarm,
|
||||
'ps2_3v_alarm' => \&munge_alarm,
|
||||
'ps2_5v_alarm' => \&munge_alarm,
|
||||
'fan1_alarm' => \&munge_alarm,
|
||||
'fan2_alarm' => \&munge_alarm,
|
||||
'fan3_alarm' => \&munge_alarm,
|
||||
|
||||
);
|
||||
|
||||
# Variable to modify behaviour of "interfaces" subroutine.
|
||||
# * When set to 0, "interfaces" returns only fixed interfaces from the IF-MIB,
|
||||
# * When set to 1, "interfaces" returns fixed interfaces from IF-MIB and LAN-to-LAN tunnels from ALTIGA-SESSION-MIB
|
||||
# TODO: This should be an instance method, not a class global
|
||||
$int_include_vpn = 1;
|
||||
|
||||
# Variable to prepended to each tunnel index when tunnel is added to %interfaces, to avoid overwriting "real" ifIndex entries
|
||||
$fake_idx = 3076;
|
||||
|
||||
# Variable to classify session types into categories: 0 - unclassified, 1 - LAN-to-LAN or fixed, 2 - RAS or dynamic, 3 - administrative
|
||||
$type_class = {
|
||||
'pptp' => 2,
|
||||
'l2tp' => 2,
|
||||
'ipsec' => 2,
|
||||
'http' => 3,
|
||||
'ftp' => 3,
|
||||
'telnet' => 3,
|
||||
'snmp' => 3,
|
||||
'tftp' => 3,
|
||||
'console' => 3,
|
||||
'debugTelnet' => 3,
|
||||
'debugConsole' => 3,
|
||||
'other' => 3,
|
||||
'ike' => 0,
|
||||
'l2tpOverIpSec' => 2,
|
||||
'ipsecLanToLan' => 1,
|
||||
'ipsecOverUdp' => 2,
|
||||
'ssh' => 3,
|
||||
'vcaLanToLan' => 1,
|
||||
'ipsecOverTcp' => 2,
|
||||
'pppoe' => 2,
|
||||
'ipsecOverNatT' => 2,
|
||||
'ipsecLan2LanOverNatT' => 1,
|
||||
'l2tpOverIpsecOverNatT' => 2,
|
||||
'userHttps' => 2,
|
||||
'pop3s' => 2,
|
||||
'imap4s' => 2,
|
||||
'smtps' => 2,
|
||||
'httpsTunnel' => 2,
|
||||
};
|
||||
|
||||
sub vendor {
|
||||
return 'altiga';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'altiga';
|
||||
}
|
||||
|
||||
# $altiga->interfaces() - Map the Interfaces to their physical names
|
||||
# Add interface number to interface name to prevent duplicate ifDescr
|
||||
# Included statically configured VPN tunnels if ($int_include_vpn)
|
||||
sub interfaces {
|
||||
my $altiga = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $altiga->i_index($partial);
|
||||
my $descriptions = $altiga->i_description($partial);
|
||||
|
||||
my %int_rev = ();
|
||||
my %interfaces = ();
|
||||
foreach my $iid (sort {$a cmp $b} keys %$interfaces) {
|
||||
my $desc = $descriptions->{$iid};
|
||||
next unless defined $desc;
|
||||
if (!exists $int_rev{$desc}) {
|
||||
$interfaces{$iid} = $desc;
|
||||
$int_rev{$desc} = $iid;
|
||||
} else {
|
||||
my $done = 0;
|
||||
my $unique_desc;
|
||||
my $cnt = 1;
|
||||
until ($done) {
|
||||
$cnt++;
|
||||
$unique_desc = sprintf("%s (%d)", $desc, $cnt);
|
||||
if (!exists $int_rev{$unique_desc}) {
|
||||
$done++;
|
||||
}
|
||||
}
|
||||
$int_rev{$unique_desc} = $iid;
|
||||
$interfaces{$iid} = $unique_desc;
|
||||
$interfaces{ $int_rev{$desc} } = sprintf("%s (%d)", $desc, 1);
|
||||
}
|
||||
}
|
||||
if ($int_include_vpn) {
|
||||
my $tun_type = $altiga->vpn_sess_protocol();
|
||||
my $peer = $altiga->vpn_sess_peer_ip();
|
||||
my $remote = $altiga->vpn_sess_rem_ip();
|
||||
my $group = $altiga->vpn_sess_gid();
|
||||
foreach my $tunnel (keys %$tun_type) {
|
||||
if ($type_class->{$tun_type->{$tunnel}} eq 1) {
|
||||
$interfaces{"$fake_idx.$tunnel"} = sprintf("%s VPN to %s", uc($tun_type->{$tunnel}), $remote->{$tunnel});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return \%interfaces;
|
||||
}
|
||||
|
||||
sub i_type {
|
||||
my $altiga = shift;
|
||||
my $partial = shift;
|
||||
my $types = $altiga->i_type2();
|
||||
if ($int_include_vpn) {
|
||||
my $tun_type = $altiga->vpn_sess_protocol();
|
||||
foreach my $tunnel (keys %$tun_type) {
|
||||
$types->{"$fake_idx.$tunnel"} = $tun_type->{$tunnel};
|
||||
}
|
||||
}
|
||||
return $types;
|
||||
}
|
||||
|
||||
sub i_lastchange {
|
||||
my $altiga = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# TODO: This is what munges are for.
|
||||
my $lastchange = $altiga->i_lastchange2();
|
||||
if ($int_include_vpn) {
|
||||
my $tun_start = $altiga->vpn_sess_start();
|
||||
foreach my $tunnel (keys %$tun_start) {
|
||||
$lastchange->{"$fake_idx.$tunnel"} = $tun_start->{$tunnel};
|
||||
}
|
||||
}
|
||||
return $lastchange;
|
||||
}
|
||||
|
||||
sub ps1_status {
|
||||
my $altiga = shift;
|
||||
my $alarm_3v = $altiga->ps1_3v_alarm() || "";
|
||||
my $alarm_5v = $altiga->ps1_5v_alarm() || "";
|
||||
return sprintf("3V: %s, 5V: %s", $alarm_3v, $alarm_5v);
|
||||
}
|
||||
|
||||
sub ps2_status {
|
||||
my $altiga = shift;
|
||||
my $alarm_3v = $altiga->ps2_3v_alarm() || "";
|
||||
my $alarm_5v = $altiga->ps2_5v_alarm() || "";
|
||||
return sprintf("3V: %s, 5V: %s", $alarm_3v, $alarm_5v);
|
||||
}
|
||||
|
||||
sub fan {
|
||||
my $altiga = shift;
|
||||
my $alarm_fan1 = $altiga->fan1_alarm() || "";
|
||||
my $alarm_fan2 = $altiga->fan2_alarm() || "";
|
||||
my $alarm_fan3 = $altiga->fan3_alarm() || "";
|
||||
return sprintf("Fan 1: %s, Fan 2: %s, Fan 3: %s", $alarm_fan1, $alarm_fan2, $alarm_fan3);
|
||||
}
|
||||
|
||||
sub munge_alarm {
|
||||
my $alarm = shift;
|
||||
if ($alarm eq 'false') {
|
||||
return 'OK';
|
||||
} elsif ($alarm eq 'true') {
|
||||
return 'FAIL';
|
||||
} else {
|
||||
return "(n/a)";
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Altiga - SNMP Interface to Cisco (formerly Altiga) VPN concentrators
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Jeroen van Ingen Schenau
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $altiga = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'my_vpn_host',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $altiga->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Cisco (formerly Altiga) VPN concentrators
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 Class Variables (options)
|
||||
|
||||
=over
|
||||
|
||||
=item $SNMP::Info::Layer3::Altiga::int_include_vpn
|
||||
|
||||
Variable to modify behavior of "interfaces" subroutine.
|
||||
|
||||
* When set to 0, "interfaces" returns only fixed interfaces from the IF-MIB,
|
||||
* When set to 1, "interfaces" returns fixed interfaces from IF-MIB and
|
||||
LAN-to-LAN tunnels from ALTIGA-SESSION-MIB (default)
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $altiga->vendor()
|
||||
|
||||
Returns 'altiga'
|
||||
|
||||
=item $altiga->os()
|
||||
|
||||
Returns 'altiga'
|
||||
|
||||
=item $altiga->os_ver()
|
||||
|
||||
Tries to determine OS version from the C<sysDescr.0> field. Returns version or C<sysDescr.0>
|
||||
|
||||
=item $altiga->fan()
|
||||
|
||||
Combines results from C<fan1_alarm>, C<fan2_alarm>, and C<fam3_alarm> methods.
|
||||
|
||||
=item $altiga->ps1_status()
|
||||
|
||||
Combines C<ps1_3v_alarm> and C<ps1_5v_alarm> methods.
|
||||
|
||||
=item $altiga->ps2_status()
|
||||
|
||||
Combines C<ps2_3v_alarm> and C<ps2_5v_alarm> methods.
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $altiga->interfaces()
|
||||
|
||||
This method overrides the interfaces() method inherited from SNMP::Info.
|
||||
It provides a mapping between the Interface Table Index (iid) and the physical
|
||||
port name, adding a port number to the port name to prevent duplicate names.
|
||||
|
||||
=item $altiga->i_lastchange()
|
||||
|
||||
Filters out the results depending on the value of $SNMP::Info::Layer3::Altiga::int_include_vpn
|
||||
|
||||
=item $altiga->i_type()
|
||||
|
||||
Filters out the results depending on the value of $SNMP::Info::Layer3::Altiga::int_include_vpn
|
||||
|
||||
=back
|
||||
|
||||
=head1 MUNGES
|
||||
|
||||
=over
|
||||
|
||||
=item munge_alarm()
|
||||
|
||||
Changes C<true> and C<false> to C<FAIL>, C<OK>, and C<(n/a)>.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
276
Info/Layer3/Arista.pm
Normal file
276
Info/Layer3/Arista.pm
Normal file
@@ -0,0 +1,276 @@
|
||||
# SNMP::Info::Layer3::Arista
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Arista Networks, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of Arista Networks, Inc. nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Arista;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::MAU;
|
||||
use SNMP::Info::LLDP;
|
||||
use SNMP::Info::Aggregate 'agg_ports_ifstack';
|
||||
|
||||
@SNMP::Info::Layer3::Arista::ISA = qw/
|
||||
SNMP::Info::Aggregate
|
||||
SNMP::Info::LLDP
|
||||
SNMP::Info::MAU
|
||||
SNMP::Info::Layer3 Exporter
|
||||
/;
|
||||
@SNMP::Info::Layer3::Arista::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::MAU::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::Aggregate::MIBS,
|
||||
'ARISTA-PRODUCTS-MIB' => 'aristaProducts',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::MAU::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::MAU::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::MAU::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
);
|
||||
|
||||
# use MAU-MIB for admin. duplex and admin. speed
|
||||
*SNMP::Info::Layer3::Arista::i_duplex_admin
|
||||
= \&SNMP::Info::MAU::mau_i_duplex_admin;
|
||||
*SNMP::Info::Layer3::Arista::i_speed_admin
|
||||
= \&SNMP::Info::MAU::mau_i_speed_admin;
|
||||
|
||||
sub vendor {
|
||||
return 'arista';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'EOS';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $arista = shift;
|
||||
my $descr = $arista->description();
|
||||
my $os_ver = undef;
|
||||
|
||||
$os_ver = $1 if ( $descr =~ /\s+EOS\s+version\s+(\S+)\s+/ );
|
||||
return $os_ver;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $arista = shift;
|
||||
my $id = $arista->id();
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^arista//;
|
||||
return $model;
|
||||
}
|
||||
|
||||
# The LLDP MIB leaves it up in the air what the index means.
|
||||
# On EOS, it's a dot1d port.
|
||||
sub lldp_if {
|
||||
my $arista = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# We pick a column that someone else is likely to want,
|
||||
# so that the cache means that hopefully this doesn't
|
||||
# cause any more SNMP transactions in total.
|
||||
my $desc = $arista->lldp_rem_desc($partial) || {};
|
||||
my $bp_index = $arista->bp_index() || {};
|
||||
|
||||
my $lldp_if = {};
|
||||
foreach my $key ( keys %$desc ) {
|
||||
my @aOID = split( '\.', $key );
|
||||
my $port = $aOID[1];
|
||||
$lldp_if->{$key} = $bp_index->{$port};
|
||||
}
|
||||
return $lldp_if;
|
||||
}
|
||||
|
||||
sub agg_ports { return agg_ports_ifstack(@_) }
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Arista - SNMP Interface to Arista Networks EOS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Bill Fenner
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $arista = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $arista->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Arista Networks EOS-based devices
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Aggregate
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::MAU
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<ARISTA-PRODUCTS-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Aggregate/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $arista->vendor()
|
||||
|
||||
Returns 'Arista Networks, Inc.'
|
||||
|
||||
=item $arista->model()
|
||||
|
||||
Tries to reference $arista->id() to one of the product MIBs listed above
|
||||
|
||||
Removes 'arista' from the name for readability.
|
||||
|
||||
=item $arista->os()
|
||||
|
||||
Returns 'EOS'
|
||||
|
||||
=item $arista->os_ver()
|
||||
|
||||
Grabs the os version from C<sysDescr>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $arista->i_duplex_admin()
|
||||
|
||||
Returns info from F<MAU-MIB>
|
||||
|
||||
=item $arista->i_speed_admin()
|
||||
|
||||
Returns info from F<MAU-MIB>
|
||||
|
||||
=item $arista->lldp_if()
|
||||
|
||||
Returns the mapping to the SNMP Interface Table.
|
||||
|
||||
=item C<agg_ports>
|
||||
|
||||
Returns a HASH reference mapping from slave to master port for each member of
|
||||
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
|
||||
ifIndex of the corresponding master ports.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
1838
Info/Layer3/Aruba.pm
Normal file
1838
Info/Layer3/Aruba.pm
Normal file
File diff suppressed because it is too large
Load Diff
@@ -43,7 +43,7 @@ use SNMP::Info::Bridge;
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE %MODEL_MAP
|
||||
%MODID_MAP %PROCID_MAP/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS,
|
||||
@@ -545,7 +545,7 @@ sub model {
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'nortel';
|
||||
return 'avaya';
|
||||
}
|
||||
|
||||
sub os {
|
||||
@@ -732,6 +732,8 @@ sub i_vlan {
|
||||
return \%i_vlan;
|
||||
}
|
||||
|
||||
sub i_pvid { goto &i_vlan }
|
||||
|
||||
sub root_ip {
|
||||
my $bayrs = shift;
|
||||
|
||||
@@ -1191,7 +1193,7 @@ sub e_vendor {
|
||||
|
||||
my %wf_e_vendor;
|
||||
foreach my $iid ( keys %$wf_e_idx ) {
|
||||
$wf_e_vendor{$iid} = 'nortel';
|
||||
$wf_e_vendor{$iid} = 'avaya';
|
||||
}
|
||||
return \%wf_e_vendor;
|
||||
}
|
||||
@@ -1378,7 +1380,8 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::BayRS - SNMP Interface to Nortel routers running BayRS.
|
||||
SNMP::Info::Layer3::BayRS - SNMP Interface to Avaya/Nortel routers running
|
||||
BayRS.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
@@ -1401,7 +1404,7 @@ Eric Miller
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Abstraction subclass for routers running Nortel BayRS.
|
||||
Abstraction subclass for routers running Avaya/Nortel BayRS.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
@@ -1474,7 +1477,7 @@ and the common model with this map :
|
||||
|
||||
=item $bayrs->vendor()
|
||||
|
||||
Returns 'nortel'
|
||||
Returns 'avaya'
|
||||
|
||||
=item $bayrs->os()
|
||||
|
||||
@@ -1548,6 +1551,10 @@ interfaces.
|
||||
|
||||
Returns reference to hash. Maps port VLAN ID to IIDs.
|
||||
|
||||
=item $bayrs->i_pvid()
|
||||
|
||||
Returns reference to hash. Maps port VLAN ID to IIDs.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Pseudo F<ENTITY-MIB> information
|
||||
@@ -1583,7 +1590,7 @@ Returns reference to hash. Key: IID, Value: Hardware version.
|
||||
|
||||
=item $bayrs->e_vendor()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: nortel.
|
||||
Returns reference to hash. Key: IID, Value: avaya.
|
||||
|
||||
=item $bayrs->e_serial()
|
||||
|
||||
@@ -1634,11 +1641,11 @@ See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=over
|
||||
|
||||
=item $extreme->munge_hw_rev()
|
||||
=item $bayrs->munge_hw_rev()
|
||||
|
||||
Converts octets to a decimal major.minor string.
|
||||
|
||||
=item $extreme->munge_wf_serial()
|
||||
=item $bayrs->munge_wf_serial()
|
||||
|
||||
Coverts octets to a decimal string.
|
||||
|
||||
|
||||
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.33';
|
||||
|
||||
%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,7 +1,7 @@
|
||||
# SNMP::Info::Layer3::C3550
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
# 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.
|
||||
#
|
||||
@@ -32,66 +32,46 @@
|
||||
package SNMP::Info::Layer3::C3550;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::CiscoStack;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoImage;
|
||||
use SNMP::Info::CiscoPortSecurity;
|
||||
use SNMP::Info::CiscoPower;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::C3550::ISA
|
||||
= qw/SNMP::Info::CiscoVTP SNMP::Info::CiscoStack
|
||||
SNMP::Info::CDP SNMP::Info::CiscoStats
|
||||
SNMP::Info::CiscoPortSecurity
|
||||
SNMP::Info::CiscoImage SNMP::Info::CiscoPower
|
||||
SNMP::Info::Layer3
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer3::C3550::EXPORT_OK = qw//;
|
||||
use SNMP::Info::Layer3::CiscoSwitch;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
# NOTE : Top-most items gets precedence for @ISA
|
||||
@SNMP::Info::Layer3::C3550::ISA = qw/
|
||||
SNMP::Info::CiscoStack
|
||||
SNMP::Info::Layer3::CiscoSwitch
|
||||
Exporter/;
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoPower::MIBS,
|
||||
%SNMP::Info::CiscoPortSecurity::MIBS, %SNMP::Info::CiscoImage::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS, %SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoStack::MIBS, %SNMP::Info::CiscoVTP::MIBS,
|
||||
);
|
||||
@SNMP::Info::Layer3::C3550::EXPORT_OK = qw//;
|
||||
|
||||
$VERSION = '3.33';
|
||||
|
||||
# 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::CiscoSwitch::MIBS, %SNMP::Info::CiscoStack::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::CiscoPower::GLOBALS,
|
||||
%SNMP::Info::CiscoPortSecurity::GLOBALS,
|
||||
%SNMP::Info::CiscoImage::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::Layer3::CiscoSwitch::GLOBALS,
|
||||
%SNMP::Info::CiscoStack::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
'ports2' => 'ifNumber',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::CiscoPower::FUNCS,
|
||||
%SNMP::Info::CiscoPortSecurity::FUNCS, %SNMP::Info::CiscoImage::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS, %SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoStack::FUNCS, %SNMP::Info::CiscoVTP::FUNCS,
|
||||
%SNMP::Info::Layer3::CiscoSwitch::FUNCS,
|
||||
%SNMP::Info::CiscoStack::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::CiscoPower::MUNGE,
|
||||
%SNMP::Info::CiscoPortSecurity::MUNGE,
|
||||
%SNMP::Info::CiscoImage::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::Layer3::CiscoSwitch::MUNGE,
|
||||
%SNMP::Info::CiscoStack::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
@@ -115,14 +95,14 @@ sub model {
|
||||
sub ports {
|
||||
my $c3550 = shift;
|
||||
|
||||
my $ports2 = $c3550->ports2();
|
||||
|
||||
my $id = $c3550->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
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
|
||||
@@ -212,10 +192,6 @@ sub set_i_duplex_admin {
|
||||
}
|
||||
}
|
||||
|
||||
sub cisco_comm_indexing {
|
||||
return 1;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
@@ -261,21 +237,9 @@ after determining a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::CiscoPower
|
||||
|
||||
=item SNMP::Info::CiscoPortSecurity
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CiscoStack
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoImage
|
||||
=item SNMP::Info::Layer3::CiscoSwitch
|
||||
|
||||
=back
|
||||
|
||||
@@ -285,22 +249,10 @@ after determining a more specific class using the method above.
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"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::Layer3::CiscoSwitch/"Required MIBs"> for its own MIB
|
||||
requirements.
|
||||
|
||||
=back
|
||||
|
||||
@@ -325,43 +277,15 @@ Will take the translated model number and try to format it better.
|
||||
|
||||
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 L<SNMP::Info::Layer3/"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
|
||||
=head2 Globals imported from SNMP::Info::CiscoStack
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
=head2 Globals imported from SNMP::Info::Layer3::CiscoSwitch
|
||||
|
||||
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.
|
||||
See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
@@ -408,37 +332,13 @@ Crosses $c3550->p_port() with $c3550->p_duplex() to utilize port C<ifIndex>.
|
||||
|
||||
=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::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
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3::CiscoSwitch
|
||||
|
||||
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.
|
||||
See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"TABLE METHODS"> for
|
||||
details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -31,48 +31,30 @@
|
||||
package SNMP::Info::Layer3::C4000;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
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::Layer3::CiscoSwitch;
|
||||
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::ISA = qw/
|
||||
SNMP::Info::Layer3::CiscoSwitch
|
||||
SNMP::Info::MAU
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer3::C4000::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%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,
|
||||
%SNMP::Info::Layer3::CiscoSwitch::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,
|
||||
%SNMP::Info::Layer3::CiscoSwitch::GLOBALS,
|
||||
'ps1_type' => 'ciscoEnvMonSupplyStatusDescr.1',
|
||||
'ps1_status' => 'ciscoEnvMonSupplyState.1',
|
||||
'ps2_type' => 'ciscoEnvMonSupplyStatusDescr.2',
|
||||
@@ -80,24 +62,14 @@ $VERSION = '2.00';
|
||||
);
|
||||
|
||||
%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,
|
||||
%SNMP::Info::Layer3::CiscoSwitch::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,
|
||||
);
|
||||
%MUNGE
|
||||
= ( %SNMP::Info::MAU::MUNGE, %SNMP::Info::Layer3::CiscoSwitch::MUNGE, );
|
||||
|
||||
# Override Inheritance for these specific methods
|
||||
# use MAU-MIB for admin. duplex and admin. speed
|
||||
@@ -106,6 +78,11 @@ $VERSION = '2.00';
|
||||
*SNMP::Info::Layer3::C4000::i_speed_admin
|
||||
= \&SNMP::Info::MAU::mau_i_speed_admin;
|
||||
|
||||
*SNMP::Info::Layer3::C4000::set_i_duplex_admin
|
||||
= \&SNMP::Info::MAU::mau_set_i_duplex_admin;
|
||||
*SNMP::Info::Layer3::C4000::set_i_speed_admin
|
||||
= \&SNMP::Info::MAU::mau_set_i_speed_admin;
|
||||
|
||||
sub fan {
|
||||
my $c4000 = shift;
|
||||
my $fan_state = $c4000->fan_state();
|
||||
@@ -120,8 +97,6 @@ sub fan {
|
||||
return $ret;
|
||||
}
|
||||
|
||||
sub cisco_comm_indexing { return 1; }
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
@@ -163,22 +138,10 @@ after determining a more specific class using the method above.
|
||||
|
||||
=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::Layer3::CiscoSwitch
|
||||
|
||||
=item SNMP::Info::MAU
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
@@ -187,23 +150,11 @@ after determining a more specific class using the method above.
|
||||
|
||||
=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
|
||||
See L<SNMP::Info::Layer3::CiscoSwitch/"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
|
||||
@@ -214,48 +165,20 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=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
|
||||
=head2 Globals imported from SNMP::Info::Layer3::CiscoSwitch
|
||||
|
||||
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.
|
||||
See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"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
|
||||
@@ -281,39 +204,27 @@ Returns either (auto,full,half).
|
||||
|
||||
Returns administrative speed for interfaces.
|
||||
|
||||
=item $c4000->set_i_speed_admin(speed, ifIndex)
|
||||
|
||||
Sets port speed, must be supplied with speed and port C<ifIndex>.
|
||||
|
||||
Speed choices are '10', '100', '1000', 'auto'.
|
||||
|
||||
=item $c4000->set_i_duplex_admin(duplex, ifIndex)
|
||||
|
||||
Sets port duplex, must be supplied with duplex and port C<ifIndex>.
|
||||
|
||||
Duplex choices are 'auto', 'half', 'full'.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3::CiscoSwitch
|
||||
|
||||
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
|
||||
See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"TABLE METHODS"> for
|
||||
details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# SNMP::Info::Layer3::C6500
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker
|
||||
# Copyright (c) 2008-2009 Max Baker
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
@@ -31,73 +31,79 @@
|
||||
package SNMP::Info::Layer3::C6500;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::CiscoStack;
|
||||
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::Layer3::CiscoSwitch;
|
||||
use SNMP::Info::MAU;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
# NOTE : Top-most items gets precedence for @ISA
|
||||
@SNMP::Info::Layer3::C6500::ISA = qw/
|
||||
SNMP::Info::CiscoStack
|
||||
SNMP::Info::Layer3::CiscoSwitch
|
||||
SNMP::Info::MAU
|
||||
Exporter
|
||||
/;
|
||||
|
||||
@SNMP::Info::Layer3::C6500::ISA
|
||||
= qw/SNMP::Info::CiscoVTP SNMP::Info::CiscoStack
|
||||
SNMP::Info::CDP SNMP::Info::CiscoStats
|
||||
SNMP::Info::CiscoImage
|
||||
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 = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
# 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::CiscoStack::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
%SNMP::Info::MAU::MIBS,
|
||||
%SNMP::Info::Layer3::CiscoSwitch::MIBS,
|
||||
%SNMP::Info::CiscoStack::MIBS,
|
||||
'CISCO-VIRTUAL-SWITCH-MIB' => 'cvsSwitchMode',
|
||||
);
|
||||
|
||||
%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::MAU::GLOBALS,
|
||||
%SNMP::Info::Layer3::CiscoSwitch::GLOBALS,
|
||||
%SNMP::Info::CiscoStack::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::CiscoStack::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
%SNMP::Info::MAU::FUNCS,
|
||||
%SNMP::Info::Layer3::CiscoSwitch::FUNCS,
|
||||
%SNMP::Info::CiscoStack::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::CiscoStack::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
%SNMP::Info::MAU::MUNGE,
|
||||
%SNMP::Info::Layer3::CiscoSwitch::MUNGE,
|
||||
%SNMP::Info::CiscoStack::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub cisco_comm_indexing { return 1; }
|
||||
sub serial {
|
||||
my $c6500 = shift;
|
||||
|
||||
my $serial = $c6500->SUPER::serial();
|
||||
return $serial if defined $serial and $serial;
|
||||
|
||||
# now grab the table only if SUPER cannot find it
|
||||
my $e_serial = $c6500->e_serial();
|
||||
|
||||
# Find entity table entry for this unit
|
||||
foreach my $e ( sort keys %$e_serial ) {
|
||||
if (defined $e_serial->{$e} and $e_serial->{$e} !~ /^\s*$/) {
|
||||
return $e_serial->{$e};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Newer versions use the ETHERLIKE-MIB to report operational duplex.
|
||||
|
||||
@@ -156,6 +162,16 @@ sub i_duplex_admin {
|
||||
}
|
||||
}
|
||||
|
||||
sub is_virtual_switch {
|
||||
my $cvs = shift;
|
||||
my $cvsSwM = $cvs->cvsSwitchMode() || '';
|
||||
|
||||
if ( $cvsSwM eq 'multiNode' ) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
sub set_i_duplex_admin {
|
||||
|
||||
# map a textual duplex to an integer one the switch understands
|
||||
@@ -163,6 +179,20 @@ sub set_i_duplex_admin {
|
||||
|
||||
my $c6500 = shift;
|
||||
my ( $duplex, $iid ) = @_;
|
||||
|
||||
if ( $c6500->is_virtual_switch() ) {
|
||||
|
||||
# VSS -> MAU
|
||||
# Due to VSS bug
|
||||
# 1. Set the ifMauDefaultType
|
||||
# 2. Disable ifMauAutoNegAdminStatus
|
||||
# If the second set is not done, this is not going to be
|
||||
# working... Cisco Bug id CSCty97033.
|
||||
# SXI is not working (up to at least relase SXI9).
|
||||
# SXJ is working at SXJ3 (not before).
|
||||
|
||||
return $c6500->mau_set_i_duplex_admin( $duplex, $iid );
|
||||
}
|
||||
|
||||
my $el_duplex = $c6500->el_duplex($iid);
|
||||
|
||||
@@ -180,7 +210,31 @@ sub set_i_duplex_admin {
|
||||
return $c6500->set_p_duplex( $duplexes{$duplex}, $iid );
|
||||
}
|
||||
else {
|
||||
return $c6500->SUPER::set_i_duplex_admin;
|
||||
return $c6500->SUPER::set_i_duplex_admin( $duplex, $iid );
|
||||
}
|
||||
}
|
||||
|
||||
sub set_i_speed_admin {
|
||||
my $c6500 = shift;
|
||||
my ( $speed, $iid ) = @_;
|
||||
|
||||
if ( $c6500->is_virtual_switch() ) {
|
||||
|
||||
# VSS -> MAU
|
||||
# Due to VSS bug
|
||||
# 1. Set the ifMauDefaultType
|
||||
# 2. Disable ifMauAutoNegAdminStatus
|
||||
# If the second set is not done, this is not going to be working...
|
||||
# Cisco Bug id CSCty97033.
|
||||
# SXI is not working (at least up to relase SXI9).
|
||||
# SXJ is working at SXJ3 (not before).
|
||||
|
||||
return $c6500->mau_set_i_speed_admin( $speed, $iid );
|
||||
}
|
||||
else {
|
||||
|
||||
# normal behavior using the CiscoStack method
|
||||
return $c6500->SUPER::set_i_speed_admin( $speed, $iid );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -229,23 +283,11 @@ after determining a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CiscoStack
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
=item SNMP::Info::Layer3::CiscoSwitch
|
||||
|
||||
=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::MAU
|
||||
|
||||
=back
|
||||
|
||||
@@ -255,24 +297,12 @@ after determining a more specific class using the method above.
|
||||
|
||||
=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
|
||||
See L<SNMP::Info::Layer3::CiscoSwitch/"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::MAU/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
@@ -286,47 +316,31 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=item $c6500->cisco_comm_indexing()
|
||||
=item $c6500->cvsSwitchMode()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
Returns the Switch status: multiNode or standalone.
|
||||
|
||||
=item $c6500->is_virtual_switch()
|
||||
|
||||
Return 1 if the switch (C<cvsSwitchMode>) is in multimode (VSS).
|
||||
|
||||
=item $c6500->serial()
|
||||
|
||||
Returns serial number of unit (falls back to C<entPhysicalSerialNum>).
|
||||
|
||||
=back
|
||||
|
||||
=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
|
||||
=head2 Globals imported from SNMP::Info::CiscoStack
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
=head2 Globals imported from SNMP::Info::Layer3::CiscoSwitch
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
=head2 Globals imported from SNMP::Info::MAU
|
||||
|
||||
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.
|
||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
@@ -371,44 +385,29 @@ Crosses $c6500->p_port() with $c6500->p_duplex() to utilize port C<ifIndex>.
|
||||
$c6500->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't change port duplex. ",$c6500->error(1);
|
||||
|
||||
=item $c6500->set_i_speed_admin(speed, ifIndex)
|
||||
|
||||
Sets port speed, must be supplied with speed and port C<ifIndex>.
|
||||
|
||||
Speed choices are '10', '100', '1000'.
|
||||
|
||||
Crosses $c6500->p_port() with $c6500->p_speed() to utilize port C<ifIndex>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
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::Layer3::CiscoSwitch
|
||||
|
||||
=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
|
||||
See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"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
|
||||
|
||||
=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.
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
@@ -31,59 +31,70 @@
|
||||
package SNMP::Info::Layer3::Cisco;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::LLDP;
|
||||
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::CiscoStpExtensions;
|
||||
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::Cisco::ISA = qw/SNMP::Info::CiscoVTP
|
||||
SNMP::Info::LLDP SNMP::Info::CDP
|
||||
SNMP::Info::CiscoStats SNMP::Info::CiscoRTT
|
||||
SNMP::Info::CiscoQOS SNMP::Info::CiscoConfig
|
||||
SNMP::Info::CiscoPower SNMP::Info::CiscoStpExtensions
|
||||
SNMP::Info::Layer3
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer3::Cisco::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::CiscoStpExtensions::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::LLDP::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',
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::CiscoStpExtensions::GLOBALS,
|
||||
%SNMP::Info::CiscoPower::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoQOS::GLOBALS,
|
||||
%SNMP::Info::CiscoRTT::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
'eigrp_id' => 'cEigrpAsRouterId',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::CiscoStpExtensions::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::LLDP::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
|
||||
# EIGRP
|
||||
@@ -92,33 +103,44 @@ $VERSION = '2.00';
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::CiscoStpExtensions::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::LLDP::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
'eigrp_peers' => \&SNMP::Info::munge_ip,
|
||||
);
|
||||
|
||||
sub i_vlan {
|
||||
my ($cisco) = shift;
|
||||
my ($partial) = shift;
|
||||
my $cisco = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my ($i_type) = $cisco->i_type($partial);
|
||||
my ($i_descr) = $cisco->i_description($partial);
|
||||
my %i_vlan;
|
||||
my $i_type = $cisco->i_type($partial);
|
||||
my $i_descr = $cisco->i_description($partial);
|
||||
my $i_vlan = $cisco->SUPER::i_vlan($partial);
|
||||
|
||||
foreach my $idx ( keys %$i_descr ) {
|
||||
if ( $i_type->{$idx} eq 'l2vlan' || $i_type->{$idx} eq 135 ) {
|
||||
next unless $i_type->{$idx};
|
||||
if ( $i_type->{$idx} eq 'l2vlan'
|
||||
|| $i_type->{$idx} eq '135' && !defined $i_vlan->{$idx} )
|
||||
{
|
||||
if ( $i_descr->{$idx} =~ /\.(\d+)$/ ) {
|
||||
$i_vlan{$idx} = $1;
|
||||
$i_vlan->{$idx} = $1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return \%i_vlan;
|
||||
return $i_vlan;
|
||||
}
|
||||
|
||||
sub cisco_comm_indexing {
|
||||
my $cisco = shift;
|
||||
# If we get a VTP version, it's *extremely* likely that the device needs community based indexing
|
||||
my $vtp = $cisco->vtp_version() || '0';
|
||||
return ($vtp ne '0');
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -127,7 +149,9 @@ __END__
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Cisco - SNMP Interface to L3 and L2+L3 IOS Cisco Device
|
||||
that are not covered in other classes.
|
||||
that are not covered in other classes and the base L3 Cisco class for other
|
||||
device specific L3 Cisco classes.
|
||||
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
@@ -151,7 +175,8 @@ Max Baker
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Generic Cisco Routers running IOS
|
||||
Subclass for Generic Cisco Routers running IOS and the base L3 Cisco class
|
||||
for other device specific L3 Cisco classes.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
@@ -159,12 +184,12 @@ Subclass for Generic Cisco Routers running IOS
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoImage
|
||||
|
||||
=item SNMP::Info::CiscoRTT
|
||||
|
||||
=item SNMP::Info::CiscoQOS
|
||||
@@ -173,6 +198,8 @@ Subclass for Generic Cisco Routers running IOS
|
||||
|
||||
=item SNMP::Info::Power
|
||||
|
||||
=item SNMP::Info::CiscoStpExtensions
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
@@ -187,12 +214,12 @@ Subclass for Generic Cisco Routers running IOS
|
||||
|
||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"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.
|
||||
@@ -201,6 +228,8 @@ 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::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
@@ -211,20 +240,25 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $cisco->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=item $cisco->eigrp_id()
|
||||
|
||||
(C<cEigrpAsRouterId>)
|
||||
|
||||
=item $switch->cisco_comm_indexing()
|
||||
|
||||
Returns 1 when the device is likely to need vlan indexing.
|
||||
Determined by checking C<vtpVersion>.
|
||||
|
||||
=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::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.
|
||||
@@ -233,10 +267,6 @@ See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
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.
|
||||
@@ -253,6 +283,10 @@ See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
|
||||
|
||||
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::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
@@ -280,6 +314,10 @@ Returns a mapping between C<ifIndex> and the PVID or default VLAN.
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"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.
|
||||
@@ -288,10 +326,6 @@ See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
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.
|
||||
@@ -308,6 +342,10 @@ See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPower/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
195
Info/Layer3/CiscoASA.pm
Normal file
195
Info/Layer3/CiscoASA.pm
Normal file
@@ -0,0 +1,195 @@
|
||||
# SNMP::Info::Layer3::CiscoASA
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2013 Moe Kraus
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::CiscoASA;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::CiscoASA::ISA = qw/
|
||||
SNMP::Info::CiscoStats
|
||||
SNMP::Info::Layer3
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer3::CiscoASA::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = ( %SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoStats::MIBS, );
|
||||
|
||||
%GLOBALS
|
||||
= ( %SNMP::Info::Layer3::GLOBALS, %SNMP::Info::CiscoStats::GLOBALS, );
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
'mac_table' => 'ifPhysAddress',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE,
|
||||
'mac_table' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
sub b_mac {
|
||||
my ($asa) = shift;
|
||||
my $macs = $asa->mac_table();
|
||||
my @macs;
|
||||
|
||||
# gather physical addresses
|
||||
foreach my $i ( keys %$macs ) {
|
||||
my $mac = $macs->{$i};
|
||||
|
||||
# don't catch the bad macs with zeroed OUI
|
||||
if ( $mac !~ m/(0{1,2}:){3}/ ) {
|
||||
push( @macs, $mac );
|
||||
}
|
||||
@macs = sort(@macs);
|
||||
}
|
||||
|
||||
# return the least mac
|
||||
return $macs[0];
|
||||
}
|
||||
|
||||
sub i_description {
|
||||
my $self = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_descr = $self->orig_i_description($partial) || {};
|
||||
|
||||
foreach my $ifindex ( keys %$i_descr ) {
|
||||
$i_descr->{$ifindex} =~ /'(.*)'/;
|
||||
$i_descr->{$ifindex} = $1
|
||||
if defined $1;
|
||||
}
|
||||
|
||||
return $i_descr;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::CiscoASA - Cisco Adaptive Security Appliance
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Moe Kraus
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $cisco = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $asa->class();
|
||||
print "SNMP::Info determined this device to fall under subclass: $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Cisco ASA Devices
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"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 $asa->b_mac()
|
||||
|
||||
Returns base mac.
|
||||
Overrides base mac function in L<SNMP::Info::Layer3>.
|
||||
|
||||
=item $asa->i_description()
|
||||
|
||||
Overrides base interface description function in L<SNMP::Info> to return the
|
||||
configured interface name instead of "Adaptive Security Appliance
|
||||
'$configured interface name' interface".
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"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.
|
||||
|
||||
=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::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
232
Info/Layer3/CiscoFWSM.pm
Normal file
232
Info/Layer3/CiscoFWSM.pm
Normal file
@@ -0,0 +1,232 @@
|
||||
# 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 warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::CiscoFWSM::ISA = qw/SNMP::Info::CiscoStats
|
||||
SNMP::Info::Layer3
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer3::CiscoFWSM::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = ( %SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoStats::MIBS, );
|
||||
|
||||
%GLOBALS
|
||||
= ( %SNMP::Info::Layer3::GLOBALS, %SNMP::Info::CiscoStats::GLOBALS, );
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, %SNMP::Info::CiscoStats::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::CiscoStats
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"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
|
||||
|
||||
=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::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
190
Info/Layer3/CiscoSwitch.pm
Normal file
190
Info/Layer3/CiscoSwitch.pm
Normal file
@@ -0,0 +1,190 @@
|
||||
# SNMP::Info::Layer3::CiscoSwitch
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2014 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::CiscoSwitch;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoAgg;
|
||||
use SNMP::Info::CiscoPortSecurity;
|
||||
use SNMP::Info::Layer3::Cisco;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
@SNMP::Info::Layer3::CiscoSwitch::ISA = qw/
|
||||
SNMP::Info::CiscoAgg
|
||||
SNMP::Info::CiscoPortSecurity
|
||||
SNMP::Info::Layer3::Cisco
|
||||
Exporter
|
||||
/;
|
||||
|
||||
@SNMP::Info::Layer3::CiscoSwitch::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::Cisco::MIBS,
|
||||
%SNMP::Info::CiscoPortSecurity::MIBS,
|
||||
%SNMP::Info::CiscoAgg::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::Cisco::GLOBALS,
|
||||
%SNMP::Info::CiscoPortSecurity::GLOBALS,
|
||||
%SNMP::Info::CiscoAgg::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::Cisco::FUNCS,
|
||||
%SNMP::Info::CiscoPortSecurity::FUNCS,
|
||||
%SNMP::Info::CiscoAgg::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::Cisco::MUNGE,
|
||||
%SNMP::Info::CiscoPortSecurity::MUNGE,
|
||||
%SNMP::Info::CiscoAgg::MUNGE,
|
||||
);
|
||||
|
||||
sub cisco_comm_indexing { return 1; }
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::CiscoSwitch - Base class for L3 Cisco switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $switch = 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 = $switch->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Base subclass for Cisco Layer 2/3 Switches.
|
||||
|
||||
These devices have switch specific characteristics beyond those in
|
||||
traditional routers covered by L<SNMP::Info::Layer3::Cisco>. For example,
|
||||
port security interface information from L<SNMP::Info::CiscoPortSecurity>.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $swich = new SNMP::Info::Layer3::CiscoSwitch(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::CiscoAgg
|
||||
|
||||
=item SNMP::Info::CiscoPortSecurity
|
||||
|
||||
=item SNMP::Info::Layer3::Cisco
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::CiscoAgg/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
|
||||
requirements.
|
||||
|
||||
See L<SNMP::Info::Layer3::Cisco/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $switch->cisco_comm_indexing()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoAgg
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoAgg/"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::Layer3::Cisco
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3::Cisco/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoAgg
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoAgg/"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::Layer3::Cisco
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3::Cisco/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
@@ -1,7 +1,7 @@
|
||||
# SNMP::Info::Layer3::Contivity
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# Copyright (c) 2010 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
@@ -42,7 +42,7 @@ use SNMP::Info::Entity;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS, %SNMP::Info::Layer3::MIBS, %SNMP::Info::Entity::MIBS,
|
||||
@@ -68,7 +68,7 @@ sub layers {
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'nortel';
|
||||
return 'avaya';
|
||||
}
|
||||
|
||||
sub model {
|
||||
@@ -77,7 +77,7 @@ sub model {
|
||||
|
||||
my $model = $e_model->{1} || undef;
|
||||
|
||||
return $1 if ( defined $model and $model =~ /(CES\d+)/i );
|
||||
return $1 if ( defined $model and $model =~ /(CES\d+|NVR\d+)/i );
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -162,8 +162,8 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Contivity - SNMP Interface to Nortel VPN Routers
|
||||
(Contivity Extranet Switches).
|
||||
SNMP::Info::Layer3::Contivity - SNMP Interface to Avaya/Nortel VPN Routers
|
||||
(formerly Contivity Extranet Switches).
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
@@ -186,7 +186,8 @@ Eric Miller
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Abstraction subclass for Nortel VPN Routers (Contivity Extranet Switch).
|
||||
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.
|
||||
@@ -227,7 +228,7 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=item $contivity->vendor()
|
||||
|
||||
Returns 'Nortel'
|
||||
Returns 'avaya'
|
||||
|
||||
=item $contivity->model()
|
||||
|
||||
|
||||
@@ -33,16 +33,18 @@ 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::Layer3 Exporter/;
|
||||
@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 = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
'RADLAN-Physicaldescription-MIB' => 'rlPhdStackReorder',
|
||||
'RADLAN-rlInterfaces' => 'rlIfNumOfLoopbackPorts',
|
||||
'RADLAN-HWENVIROMENT' => 'rlEnvPhysicalDescription',
|
||||
@@ -51,12 +53,14 @@ $VERSION = '2.00';
|
||||
|
||||
%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',
|
||||
@@ -102,7 +106,7 @@ $VERSION = '2.00';
|
||||
'dell_fan_desc' => 'rlEnvMonFanStatusDescr',
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE, );
|
||||
|
||||
# Method OverRides
|
||||
|
||||
@@ -149,12 +153,54 @@ sub serial {
|
||||
return $dell->SUPER::serial();
|
||||
}
|
||||
|
||||
# check all fans, and report overall status
|
||||
sub fan {
|
||||
my $dell = shift;
|
||||
|
||||
my $fan = $dell->dell_fan_desc() || {};
|
||||
my $state = $dell->dell_fan_state() || {};
|
||||
my @messages = ();
|
||||
|
||||
foreach my $k (keys %$fan) {
|
||||
next if $state->{$k} and $state->{$k} eq 'normal';
|
||||
push @messages, "$fan->{$k}: $state->{$k}";
|
||||
}
|
||||
|
||||
push @messages, ((scalar keys %$fan). " fans OK")
|
||||
if scalar @messages == 0;
|
||||
|
||||
return (join ", ", @messages);
|
||||
}
|
||||
|
||||
sub _ps_status {
|
||||
my ($dell, $unit) = @_;
|
||||
|
||||
my $status = 'unknown';
|
||||
return $status if !defined $unit;
|
||||
|
||||
my $desc = $dell->dell_pwr_desc() || {};
|
||||
my $state = $dell->dell_pwr_state() || {};
|
||||
|
||||
foreach my $k (keys %$desc) {
|
||||
next unless $desc->{$k} and $desc->{$k} eq "ps1_unit$unit";
|
||||
return ($state->{$k} || $status);
|
||||
}
|
||||
|
||||
return $status;
|
||||
}
|
||||
|
||||
sub ps1_type { return 'internalRedundant' }
|
||||
sub ps2_type { return 'internalRedundant' }
|
||||
|
||||
sub ps1_status { return (shift)->_ps_status(1) }
|
||||
sub ps2_status { return (shift)->_ps_status(2) }
|
||||
|
||||
sub interfaces {
|
||||
my $dell = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_descr = $dell->i_description($partial) || {};
|
||||
my $i_name = $dell->i_name($partial) || {};
|
||||
my $i_name = $dell->orig_i_name($partial) || {};
|
||||
|
||||
# Descriptions are all the same on some Dells, so use name instead if
|
||||
# available
|
||||
@@ -189,25 +235,6 @@ sub i_duplex_admin {
|
||||
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;
|
||||
|
||||
@@ -228,6 +255,10 @@ sub _vendor {
|
||||
}
|
||||
}
|
||||
|
||||
# dot1qTpFdbTable uses dot1qVlanIndex rather than dot1qFdbId as index,
|
||||
# so pretend we don't have the mapping
|
||||
sub qb_fdb_index {return}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
@@ -323,6 +354,26 @@ id(). Defaults to 'dlink'.
|
||||
Returns 'dell', 'dlink', or 'ibm' based upon the IANA enterprise number in
|
||||
id(). Defaults to 'dlink'.
|
||||
|
||||
=item $dell->fan()
|
||||
|
||||
Return the status of all fans from the F<Dell-Vendor-MIB>
|
||||
|
||||
=item $dell->ps1_type()
|
||||
|
||||
Return the type of the first power supply from the F<Dell-Vendor-MIB>
|
||||
|
||||
=item $dell->ps2_type()
|
||||
|
||||
Return the type of the second power supply from the F<Dell-Vendor-MIB>
|
||||
|
||||
=item $dell->ps1_status()
|
||||
|
||||
Return the status of the first power supply from the F<Dell-Vendor-MIB>
|
||||
|
||||
=item $dell->ps2_status()
|
||||
|
||||
Return the status of the second power supply from the F<Dell-Vendor-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
@@ -340,6 +391,10 @@ otherwise uses the Layer3 serial method.
|
||||
|
||||
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
|
||||
@@ -398,22 +453,9 @@ sometimes not unique.
|
||||
Returns reference to hash of iid to current link administrative duplex
|
||||
setting.
|
||||
|
||||
=item $dell->fw_mac()
|
||||
=item $dell->qb_fdb_index()
|
||||
|
||||
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.
|
||||
Returns nothing to work around incorrect indexing of C<dot1qTpFdbTable>
|
||||
|
||||
=back
|
||||
|
||||
@@ -421,4 +463,8 @@ C<Q-BRIDGE-MIB> doesn't return anything.
|
||||
|
||||
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
|
||||
|
||||
@@ -44,7 +44,7 @@ use SNMP::Info::Layer3;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS, %SNMP::Info::CDP::MIBS,
|
||||
@@ -149,154 +149,103 @@ sub i_duplex_admin {
|
||||
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);
|
||||
}
|
||||
|
||||
# Use CDP and/or LLDP
|
||||
#
|
||||
# LLDP table timefilter implementation continuously increments when walked
|
||||
# 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.
|
||||
# which means no time filter for tables with and index containing a
|
||||
# TimeFilter
|
||||
|
||||
sub hasCDP {
|
||||
my $enterasys = shift;
|
||||
sub qb_fdb_index {
|
||||
my $bridge = shift;
|
||||
|
||||
return $enterasys->hasLLDP() || $enterasys->SUPER::hasCDP();
|
||||
my $qb_fdb_ids = $bridge->dot1qVlanFdbId(0) || {};
|
||||
|
||||
# Strip the TimeFilter
|
||||
my $vl_fdb_index = {};
|
||||
for my $fdb_entry (keys(%$qb_fdb_ids)) {
|
||||
(my $vlan = $fdb_entry) =~ s/^\d+\.//;
|
||||
$vl_fdb_index->{$qb_fdb_ids->{$fdb_entry}} = $vlan;
|
||||
}
|
||||
|
||||
return $vl_fdb_index;
|
||||
}
|
||||
|
||||
sub c_ip {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift;
|
||||
sub i_vlan_membership {
|
||||
my $bridge = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $cdp = $enterasys->SUPER::c_ip($partial) || {};
|
||||
my $lldp = $enterasys->lldp_ip(0) || {};
|
||||
# dot1qVlanCurrentTable TimeFilter index
|
||||
my $v_ports = $bridge->qb_cv_egress(0) || $bridge->qb_v_egress();
|
||||
|
||||
my %c_ip;
|
||||
foreach my $iid ( keys %$cdp ) {
|
||||
my $ip = $cdp->{$iid};
|
||||
next unless defined $ip;
|
||||
|
||||
$c_ip{$iid} = $ip;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$lldp ) {
|
||||
my $ip = $lldp->{$iid};
|
||||
next unless defined $ip;
|
||||
|
||||
$c_ip{$iid} = $ip;
|
||||
}
|
||||
return \%c_ip;
|
||||
return $bridge->_vlan_hoa($v_ports, $partial);
|
||||
}
|
||||
|
||||
sub c_if {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift;
|
||||
sub i_vlan_membership_untagged {
|
||||
my $bridge = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $lldp = $enterasys->lldp_if(0) || {};
|
||||
my $cdp = $enterasys->SUPER::c_if($partial) || {};
|
||||
# dot1qVlanCurrentTable TimeFilter index
|
||||
my $v_ports = $bridge->qb_cv_untagged(0) || $bridge->qb_v_untagged();
|
||||
|
||||
my %c_if;
|
||||
foreach my $iid ( keys %$cdp ) {
|
||||
my $if = $cdp->{$iid};
|
||||
next unless defined $if;
|
||||
|
||||
$c_if{$iid} = $if;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$lldp ) {
|
||||
my $if = $lldp->{$iid};
|
||||
next unless defined $if;
|
||||
|
||||
$c_if{$iid} = $if;
|
||||
}
|
||||
return \%c_if;
|
||||
return $bridge->_vlan_hoa($v_ports, $partial);
|
||||
}
|
||||
|
||||
sub c_port {
|
||||
sub lldp_ip {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift;
|
||||
my $partial = shift || 0;
|
||||
|
||||
my $lldp = $enterasys->lldp_port(0) || {};
|
||||
my $cdp = $enterasys->SUPER::c_port($partial) || {};
|
||||
|
||||
my %c_port;
|
||||
foreach my $iid ( keys %$cdp ) {
|
||||
my $port = $cdp->{$iid};
|
||||
next unless defined $port;
|
||||
|
||||
$c_port{$iid} = $port;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$lldp ) {
|
||||
my $port = $lldp->{$iid};
|
||||
next unless defined $port;
|
||||
|
||||
$c_port{$iid} = $port;
|
||||
}
|
||||
return \%c_port;
|
||||
return $enterasys->SUPER::lldp_ip($partial);
|
||||
}
|
||||
|
||||
sub c_id {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift;
|
||||
# [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 $lldp = $enterasys->lldp_id(0) || {};
|
||||
my $cdp = $enterasys->SUPER::c_id($partial) || {};
|
||||
|
||||
my %c_id;
|
||||
foreach my $iid ( keys %$cdp ) {
|
||||
my $id = $cdp->{$iid};
|
||||
next unless defined $id;
|
||||
|
||||
$c_id{$iid} = $id;
|
||||
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;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$lldp ) {
|
||||
my $id = $lldp->{$iid};
|
||||
next unless defined $id;
|
||||
|
||||
$c_id{$iid} = $id;
|
||||
}
|
||||
return \%c_id;
|
||||
return \%lldp_if;
|
||||
}
|
||||
|
||||
sub c_platform {
|
||||
sub lldp_port {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift;
|
||||
my $partial = shift || 0;
|
||||
|
||||
my $lldp = $enterasys->lldp_rem_sysdesc(0) || {};
|
||||
my $cdp = $enterasys->SUPER::c_platform($partial) || {};
|
||||
return $enterasys->SUPER::lldp_port($partial);
|
||||
}
|
||||
|
||||
my %c_platform;
|
||||
foreach my $iid ( keys %$cdp ) {
|
||||
my $platform = $cdp->{$iid};
|
||||
next unless defined $platform;
|
||||
sub lldp_id {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift || 0;
|
||||
|
||||
$c_platform{$iid} = $platform;
|
||||
}
|
||||
return $enterasys->SUPER::lldp_id($partial);
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$lldp ) {
|
||||
my $platform = $lldp->{$iid};
|
||||
next unless defined $platform;
|
||||
sub lldp_platform {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift || 0;
|
||||
|
||||
$c_platform{$iid} = $platform;
|
||||
}
|
||||
return \%c_platform;
|
||||
return $enterasys->SUPER::lldp_rem_sysdesc($partial);
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -399,12 +348,6 @@ Returns base mac
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
|
||||
@@ -450,65 +393,33 @@ See documentation for mau_i_duplex() in L<SNMP::Info::MAU/"TABLE METHODS">.
|
||||
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 Topology information
|
||||
=head2 Time Filter Table Index Overrides
|
||||
|
||||
Based upon the firmware version Enterasys devices may support Cabletron
|
||||
Discovery Protocol (CTRON CDP), Cisco Discovery Protocol (CDP), Link Layer
|
||||
Discovery Protocol (LLDP), or all. This module currently supports CDP and
|
||||
LLDP, but not CTRON CDP. These methods will query both CDP and LLDP and
|
||||
return the combination of all information. As a result, there may be
|
||||
identical topology information returned from the two protocols
|
||||
causing duplicate entries. It is the calling program's responsibility to
|
||||
identify any duplicate entries and remove duplicates if necessary.
|
||||
The time filter C<TimeFilter> 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->hasCDP()
|
||||
=item $enterasys->qb_fdb_index()
|
||||
|
||||
Returns true if the device is running either CDP or LLDP.
|
||||
=item $enterasys->i_vlan_membership()
|
||||
|
||||
=item $enterasys->c_if()
|
||||
=item $enterasys->i_vlan_membership_untagged()
|
||||
|
||||
Returns reference to hash. Key: iid Value: local device port (interfaces)
|
||||
=item $enterasys->lldp_if()
|
||||
|
||||
=item $enterasys->c_ip()
|
||||
=item $enterasys->lldp_ip()
|
||||
|
||||
Returns reference to hash. Key: iid Value: remote IPv4 address
|
||||
=item $enterasys->lldp_port()
|
||||
|
||||
If multiple entries exist with the same local port, c_if(), with the same IPv4
|
||||
address, c_ip(), it may be a duplicate entry.
|
||||
=item $enterasys->lldp_id()
|
||||
|
||||
If multiple entries exist with the same local port, c_if(), with different
|
||||
IPv4 addresses, c_ip(), there is either a non-CDP/LLDP device in between two
|
||||
or more devices or multiple devices which are not directly connected.
|
||||
|
||||
Use the data from the Layer2 Topology Table below to dig deeper.
|
||||
|
||||
=item $enterasys->c_port()
|
||||
|
||||
Returns reference to hash. Key: iid Value: remote port (interfaces)
|
||||
|
||||
=item $enterasys->c_id()
|
||||
|
||||
Returns reference to hash. Key: iid Value: string value used to identify the
|
||||
chassis component associated with the remote system.
|
||||
|
||||
=item $enterasys->c_platform()
|
||||
|
||||
Returns reference to hash. Key: iid Value: Remote Device Type
|
||||
=item $enterasys->lldp_platform()
|
||||
|
||||
=back
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# SNMP::Info::Layer3::Extreme - SNMP Interface to Extreme devices
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# Copyright (c) 2012 Eric Miller
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
@@ -36,27 +36,36 @@ use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::MAU;
|
||||
use SNMP::Info::LLDP;
|
||||
use SNMP::Info::EDP;
|
||||
|
||||
@SNMP::Info::Layer3::Extreme::ISA
|
||||
= qw/SNMP::Info::Layer3 SNMP::Info::MAU Exporter/;
|
||||
= qw/SNMP::Info::Layer3 SNMP::Info::MAU SNMP::Info::LLDP
|
||||
SNMP::Info::EDP Exporter/;
|
||||
@SNMP::Info::Layer3::Extreme::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::MAU::MIBS,
|
||||
'EXTREME-BASE-MIB' => 'extremeAgent',
|
||||
'EXTREME-SYSTEM-MIB' => 'extremeSystem',
|
||||
'EXTREME-FDB-MIB' => 'extremeSystem',
|
||||
'EXTREME-VLAN-MIB' => 'extremeVlan',
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::EDP::MIBS,
|
||||
'EXTREME-BASE-MIB' => 'extremeAgent',
|
||||
'EXTREME-SYSTEM-MIB' => 'extremeSystem',
|
||||
'EXTREME-FDB-MIB' => 'extremeFdbMacFdbMacAddress',
|
||||
'EXTREME-VLAN-MIB' => 'extremeVlan',
|
||||
'EXTREME-POE-MIB' => 'extremePethSystemAdminEnable',
|
||||
'EXTREME-STP-EXTENSIONS-MIB' => 'extremeStpDomainBridgeId',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::MAU::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
%SNMP::Info::EDP::GLOBALS,
|
||||
'serial1' => 'extremeSystemID.0',
|
||||
'temp' => 'extremeCurrentTemperature',
|
||||
'ps1_status_old' => 'extremePrimaryPowerOperational.0',
|
||||
@@ -69,19 +78,40 @@ $VERSION = '2.00';
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::MAU::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
%SNMP::Info::EDP::FUNCS,
|
||||
'fan_state' => 'extremeFanOperational',
|
||||
|
||||
# EXTREME-FDB-MIB:extremeFdbMacFdbTable
|
||||
'ex_fw_mac' => 'extremeFdbMacFdbMacAddress',
|
||||
'ex_fw_port' => 'extremeFdbMacFdbPortIfIndex',
|
||||
'ex_fw_status' => 'extremeFdbMacFdbStatus',
|
||||
|
||||
# EXTREME-VLAN-MIB:extremeVlanIfTable
|
||||
'ex_vlan_descr' => 'extremeVlanIfDescr',
|
||||
'ex_vlan_global_id' => 'extremeVlanIfGlobalIdentifier',
|
||||
|
||||
'ex_vlan_id' => 'extremeVlanIfVlanId',
|
||||
# EXTREME-VLAN-MIB:extremeVlanEncapsIfTable
|
||||
'ex_vlan_encap_tag' => 'extremeVlanEncapsIfTag',
|
||||
# EXTREME-VLAN-MIB:extremeVlanOpaqueTable
|
||||
'ex_vlan_untagged' => 'extremeVlanOpaqueUntaggedPorts',
|
||||
'ex_vlan_tagged' => 'extremeVlanOpaqueTaggedPorts',
|
||||
# EXTREME-POE-MIB::extremePethPseSlotTable
|
||||
'peth_power_watts' => 'extremePethSlotPowerLimit',
|
||||
# EXTREME-POE-MIB::extremePethPsePortTable
|
||||
'peth_port_power' => 'extremePethPortMeasuredPower',
|
||||
# EXTREME-STP-EXTENSIONS-MIB::extremeStpDomainTable
|
||||
'stp_i_time' => 'extremeStpDomainTimeSinceTopologyChange',
|
||||
'stp_i_ntop' => 'extremeStpDomainTopChanges',
|
||||
'stp_i_root' => 'extremeStpDomainDesignatedRoot',
|
||||
'stp_i_root_port' => 'extremeStpDomainRootPortIfIndex',
|
||||
'stp_i_priority' => 'extremeStpDomainBridgePriority',
|
||||
'ex_stp_i_mac' => 'extremeStpDomainBridgeId',
|
||||
# EXTREME-STP-EXTENSIONS-MIB::extremeStpPortTable
|
||||
'stp_p_priority' => 'extremeStpPortPortPriority',
|
||||
'stp_p_state' => 'extremeStpPortPortState',
|
||||
'stp_p_cost' => 'extremeStpPortPathCost',
|
||||
'stp_p_root' => 'extremeStpPortDesignatedRoot',
|
||||
'stp_p_bridge' => 'extremeStpPortDesignatedBridge',
|
||||
'stp_p_port' => 'extremeStpPortDesignatedPort',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
@@ -89,12 +119,21 @@ $VERSION = '2.00';
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::MAU::MUNGE,
|
||||
'ex_fw_mac' => \&SNMP::Info::munge_mac,
|
||||
'ps1_status_old' => \&munge_true_ok,
|
||||
'ps1_status_new' => \&munge_power_stat,
|
||||
'ps2_status_old' => \&munge_power_stat,
|
||||
'ps2_status_new' => \&munge_power_stat,
|
||||
'fan_state' => \&munge_true_ok,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
%SNMP::Info::EDP::MUNGE,
|
||||
'ex_fw_mac' => \&SNMP::Info::munge_mac,
|
||||
'ps1_status_old' => \&munge_true_ok,
|
||||
'ps1_status_new' => \&munge_power_stat,
|
||||
'ps2_status_old' => \&munge_power_stat,
|
||||
'ps2_status_new' => \&munge_power_stat,
|
||||
'fan_state' => \&munge_true_ok,
|
||||
'ex_vlan_untagged' => \&SNMP::Info::munge_port_list,
|
||||
'ex_vlan_tagged' => \&SNMP::Info::munge_port_list,
|
||||
'ex_stp_i_mac' => \&SNMP::Info::munge_prio_mac,
|
||||
'stp_i_root' => \&SNMP::Info::munge_prio_mac,
|
||||
'stp_p_root' => \&SNMP::Info::munge_prio_mac,
|
||||
'stp_p_bridge' => \&SNMP::Info::munge_prio_mac,
|
||||
'stp_p_port' => \&SNMP::Info::munge_prio_port,
|
||||
);
|
||||
|
||||
# Method OverRides
|
||||
@@ -126,15 +165,24 @@ sub vendor {
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'extreme';
|
||||
my $extreme = shift;
|
||||
|
||||
my $desc = $extreme->description();
|
||||
|
||||
if ( $desc =~ /xos/i ) {
|
||||
return 'xos';
|
||||
}
|
||||
|
||||
return 'extremeware';
|
||||
}
|
||||
|
||||
|
||||
sub os_ver {
|
||||
my $extreme = shift;
|
||||
my $descr = $extreme->description();
|
||||
return unless defined $descr;
|
||||
|
||||
if ( $descr =~ m/Version ([\d.]*)/ ) {
|
||||
if ( $descr =~ m/Version\s+([^ ]+)/i ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
@@ -175,7 +223,7 @@ sub i_ignore {
|
||||
my %i_ignore;
|
||||
foreach my $if ( keys %$i_description ) {
|
||||
if ( $i_description->{$if}
|
||||
=~ /^(802.1Q Encapsulation Tag \d+|VLAN \d+|lo\d+)/i )
|
||||
=~ /^(802.1Q Encapsulation Tag \d+|VLAN \d+|lo\d+|VirtualRouter\d+)/i )
|
||||
{
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
@@ -188,6 +236,10 @@ sub i_ignore {
|
||||
# ifIndex.
|
||||
sub bp_index {
|
||||
my $extreme = shift;
|
||||
|
||||
my $bindex = $extreme->SUPER::bp_index();
|
||||
return $bindex if (keys %$bindex);
|
||||
|
||||
my $if_index = $extreme->i_index();
|
||||
|
||||
my %bp_index;
|
||||
@@ -238,28 +290,45 @@ sub fan {
|
||||
return $ret;
|
||||
}
|
||||
|
||||
# Newer versions of the Extreme firmware have vendor-specific tables
|
||||
# for this; those are ex_fw_*(). Older firmware versions don't have
|
||||
# these tables, so we use the BRIDGE-MIB tables.
|
||||
# For xos based VLAN functions we need to know how the ports are indexed
|
||||
# default is slot * 1000, but some older switches start at 1
|
||||
sub _slot_factor {
|
||||
my $extreme = shift;
|
||||
|
||||
my $index = $extreme->i_index();
|
||||
|
||||
return 1 if (exists $index->{1} && $index->{1} == 1);
|
||||
return 1000;
|
||||
}
|
||||
|
||||
# Some versions of the Extreme firmware have vendor-specific tables
|
||||
# for this; those are ex_fw_*(). Some don't have these tables,
|
||||
# we use the BRIDGE-MIB tables if available then the ex_fw_*() methods.
|
||||
sub fw_mac {
|
||||
my $extreme = shift;
|
||||
my $fw_mac = $extreme->ex_fw_mac;
|
||||
return $fw_mac if defined($fw_mac);
|
||||
return $extreme->orig_fw_mac();
|
||||
|
||||
my $b = $extreme->SUPER::fw_mac();
|
||||
return $b if (keys %$b);
|
||||
|
||||
return $extreme->ex_fw_mac();
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $extreme = shift;
|
||||
my $fw_port = $extreme->ex_fw_port;
|
||||
return $fw_port if defined($fw_port);
|
||||
return $extreme->orig_fw_port();
|
||||
|
||||
my $b = $extreme->SUPER::fw_port();
|
||||
return $b if (keys %$b);
|
||||
|
||||
return $extreme->ex_fw_port();
|
||||
}
|
||||
|
||||
sub fw_status {
|
||||
my $extreme = shift;
|
||||
my $fw_status = $extreme->ex_fw_status;
|
||||
return $fw_status if defined($fw_status);
|
||||
return $extreme->orig_fw_status();
|
||||
|
||||
my $b = $extreme->SUPER::fw_status();
|
||||
return $b if (keys %$b);
|
||||
|
||||
return $extreme->ex_fw_status();
|
||||
}
|
||||
|
||||
# Mapping the virtual VLAN interfaces:
|
||||
@@ -300,7 +369,7 @@ sub _if2tag {
|
||||
}
|
||||
}
|
||||
if ($missed) {
|
||||
my $global_id = $extreme->ex_vlan_global_id();
|
||||
my $global_id = $extreme->ex_vlan_id();
|
||||
foreach my $if ( keys %if2tag ) {
|
||||
$if2tag{$if} = -$global_id->{$if}
|
||||
if ( $if2tag{$if} == -1 && defined( $global_id->{$if} ) );
|
||||
@@ -309,7 +378,7 @@ sub _if2tag {
|
||||
return \%if2tag;
|
||||
}
|
||||
|
||||
# No partial support in v_name or v_index, because the obivous partial
|
||||
# No partial support in v_name or v_index, because the obvious partial
|
||||
# is the VLAN ID and the index here is the ifIndex of
|
||||
# the VLAN interface.
|
||||
sub v_name {
|
||||
@@ -319,12 +388,66 @@ sub v_name {
|
||||
|
||||
sub v_index {
|
||||
my $extreme = shift;
|
||||
return $extreme->_if2tag();
|
||||
return $extreme->ex_vlan_id || $extreme->_if2tag();
|
||||
}
|
||||
|
||||
sub i_vlan {
|
||||
my $extreme = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# Some devices support Q-Bridge, if so short circuit and return it
|
||||
my $q_bridge = $extreme->SUPER::i_vlan($partial);
|
||||
return $q_bridge if (keys %$q_bridge);
|
||||
|
||||
# Next we try extremeVlanOpaqueTable
|
||||
my $xos = $extreme->_xos_i_vlan($partial);
|
||||
return $xos if (keys %$xos);
|
||||
|
||||
# Try older ifStack method
|
||||
my $extremeware = $extreme->_extremeware_i_vlan($partial);
|
||||
return $extremeware if (keys %$extremeware);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub _xos_i_vlan {
|
||||
my $extreme = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $index = $extreme->i_index();
|
||||
my $vlans = $extreme->ex_vlan_id() || {};
|
||||
my $slotx = $extreme->_slot_factor() || 1000;
|
||||
my $u_ports = $extreme->ex_vlan_untagged() || {};
|
||||
|
||||
my $i_vlan = {};
|
||||
foreach my $idx ( keys %$u_ports ) {
|
||||
next unless ( defined $u_ports->{$idx} );
|
||||
my $portlist = $u_ports->{$idx};
|
||||
my $ret = [];
|
||||
|
||||
my ( $vlan_if, $slot ) = $idx =~ /^(\d+)\.(\d+)/;
|
||||
my $vlan = $vlans->{$vlan_if} || '';
|
||||
|
||||
# Convert portlist bit array to bp_index array
|
||||
for ( my $i = 0; $i <= $#$portlist; $i++ ) {
|
||||
push( @{$ret}, ( $slotx * $slot + $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$/ );
|
||||
$i_vlan->{$ifindex} = $vlan;
|
||||
}
|
||||
}
|
||||
return $i_vlan;
|
||||
}
|
||||
|
||||
sub _extremeware_i_vlan {
|
||||
my $extreme = shift;
|
||||
my $partial = shift;
|
||||
my $stack = $extreme->ifStackStatus($partial);
|
||||
my $encap_tag = $extreme->ex_vlan_encap_tag();
|
||||
my $vlan_descr = $extreme->ex_vlan_descr();
|
||||
@@ -348,6 +471,65 @@ sub i_vlan {
|
||||
}
|
||||
|
||||
sub i_vlan_membership {
|
||||
my $extreme = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# Some devices support Q-Bridge, if so short circuit and return it
|
||||
my $q_bridge = $extreme->SUPER::i_vlan_membership($partial);
|
||||
return $q_bridge if (ref {} eq ref $q_bridge and scalar keys %$q_bridge);
|
||||
|
||||
# Next we try extremeVlanOpaqueTable
|
||||
my $xos = $extreme->_xos_i_vlan_membership($partial);
|
||||
return $xos if (ref {} eq ref $xos and scalar keys %$xos);
|
||||
|
||||
# Try older ifStack method
|
||||
my $extremeware = $extreme->_extremeware_i_vlan_membership($partial);
|
||||
return $extremeware if (ref {} eq ref $extremeware and scalar keys %$extremeware);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub _xos_i_vlan_membership {
|
||||
my $extreme = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $index = $extreme->i_index();
|
||||
my $vlans = $extreme->ex_vlan_id();
|
||||
my $slotx = $extreme->_slot_factor() || 1000;
|
||||
my $u_ports = $extreme->ex_vlan_untagged() || {};
|
||||
my $t_ports = $extreme->ex_vlan_tagged() || {};
|
||||
|
||||
my $i_vlan_membership = {};
|
||||
foreach my $idx ( keys %$u_ports ) {
|
||||
next unless ( defined $u_ports->{$idx} );
|
||||
my $u_portlist = $u_ports->{$idx};
|
||||
my $t_portlist = $t_ports->{$idx};
|
||||
my $ret = [];
|
||||
|
||||
my ( $vlan_if, $slot ) = $idx =~ /^(\d+)\.(\d+)/;
|
||||
my $vlan = $vlans->{$vlan_if} || '';
|
||||
|
||||
foreach my $portlist ( $u_portlist, $t_portlist ) {
|
||||
|
||||
# Convert portlist bit array to bp_index array
|
||||
for ( my $i = 0; $i <= $#$portlist; $i++ ) {
|
||||
push( @{$ret}, ( $slotx * $slot + $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} }, $vlan );
|
||||
}
|
||||
}
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
sub _extremeware_i_vlan_membership {
|
||||
my $extreme = shift;
|
||||
my $partial = shift;
|
||||
my $stack = $extreme->ifStackStatus($partial);
|
||||
@@ -380,6 +562,78 @@ sub i_vlan_membership {
|
||||
return \%i_vlan_membership;
|
||||
}
|
||||
|
||||
sub i_vlan_membership_untagged {
|
||||
my $extreme = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# Some devices support Q-Bridge, if so short circuit and return it
|
||||
my $q_bridge = $extreme->SUPER::i_vlan_membership_untagged($partial);
|
||||
return $q_bridge if (ref {} eq ref $q_bridge and scalar keys %$q_bridge);
|
||||
|
||||
# Next we try extremeVlanOpaqueTable
|
||||
my $xos = $extreme->_xos_i_vlan_membership_untagged($partial);
|
||||
return $xos if (ref {} eq ref $xos and scalar keys %$xos);
|
||||
|
||||
# Try older ifStack method
|
||||
my $extremeware = $extreme->_extremeware_i_vlan_membership_untagged($partial);
|
||||
return $extremeware if (ref {} eq ref $extremeware and scalar keys %$extremeware);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub _xos_i_vlan_membership_untagged {
|
||||
my $extreme = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $index = $extreme->i_index();
|
||||
my $vlans = $extreme->ex_vlan_id();
|
||||
my $slotx = $extreme->_slot_factor() || 1000;
|
||||
my $u_ports = $extreme->ex_vlan_untagged() || {};
|
||||
|
||||
my $i_vlan_membership = {};
|
||||
foreach my $idx ( keys %$u_ports ) {
|
||||
next unless ( defined $u_ports->{$idx} );
|
||||
my $u_portlist = $u_ports->{$idx};
|
||||
my $ret = [];
|
||||
|
||||
my ( $vlan_if, $slot ) = $idx =~ /^(\d+)\.(\d+)/;
|
||||
my $vlan = $vlans->{$vlan_if} || '';
|
||||
|
||||
foreach my $portlist ( $u_portlist ) {
|
||||
|
||||
# Convert portlist bit array to bp_index array
|
||||
for ( my $i = 0; $i <= $#$portlist; $i++ ) {
|
||||
push( @{$ret}, ( $slotx * $slot + $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} }, $vlan );
|
||||
}
|
||||
}
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
# Assuming Cisco-like trunk behavior that native VLAN is transmitted untagged
|
||||
sub _extremeware_i_vlan_membership_untagged {
|
||||
my $extreme = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $vlans = $extreme->_extremeware_i_vlan($partial);
|
||||
my $i_vlan_membership = {};
|
||||
foreach my $port (keys %$vlans) {
|
||||
my $vlan = $vlans->{$port};
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan );
|
||||
}
|
||||
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
# VLAN management.
|
||||
# See extreme-vlan.mib for a detailed description of
|
||||
# Extreme's use of ifStackTable and EXTREME-VLAN-MIB.
|
||||
@@ -527,6 +781,97 @@ sub set_add_i_vlan_tagged {
|
||||
return $rv;
|
||||
}
|
||||
|
||||
# LLDP uses the bridge index rather than ifIndex
|
||||
sub lldp_if {
|
||||
my $extreme = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $addr = $extreme->lldp_rem_pid($partial) || {};
|
||||
my $b_index = $extreme->bp_index() || {};
|
||||
#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;
|
||||
|
||||
my $idx = $b_index->{$port};
|
||||
|
||||
$lldp_if{$key} = $idx;
|
||||
}
|
||||
return \%lldp_if;
|
||||
}
|
||||
|
||||
# extremeStpDomainStpdInstance not accessible, so we need to extract from iid
|
||||
sub stp_i_id {
|
||||
my $extreme = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $stp_i_roots = $extreme->stp_i_root($partial);
|
||||
|
||||
my %stp_i_id;
|
||||
foreach my $iid ( keys %$stp_i_roots ) {
|
||||
$stp_i_id{$iid} = $iid;
|
||||
}
|
||||
return \%stp_i_id;
|
||||
}
|
||||
|
||||
# extremeStpDomainBridgeId returns priority and mac,
|
||||
# for cross class compatibility we just need mac
|
||||
sub stp_i_mac {
|
||||
my $extreme = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $stp_i_bids = $extreme->ex_stp_i_mac($partial);
|
||||
|
||||
my %stp_i_mac;
|
||||
foreach my $iid ( keys %$stp_i_bids ) {
|
||||
my $mac = $stp_i_bids->{$iid};
|
||||
next unless $mac;
|
||||
|
||||
$mac =~ s/^([0-9A-F][0-9A-F]:){2}//;
|
||||
|
||||
$stp_i_mac{$iid} = $mac;
|
||||
}
|
||||
return \%stp_i_mac;
|
||||
}
|
||||
|
||||
# Break up the extremeStpPortEntry INDEX into Stpd Instance and IfIndex.
|
||||
sub _ex_stpport_index {
|
||||
my $idx = shift;
|
||||
my ( $id, $ifindex ) = split( /\./, $idx);
|
||||
return ($id, $ifindex);
|
||||
}
|
||||
|
||||
# extremeStpPortPortIfIndex not-accessible, extract from iid
|
||||
sub stp_p_id {
|
||||
my $extreme = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $stp_port = $extreme->stp_p_root($partial);
|
||||
my $stp_p_id = {};
|
||||
foreach my $idx ( keys %$stp_port ) {
|
||||
my ( $id, $ifindex ) = _ex_stpport_index($idx);
|
||||
$stp_p_id->{$idx} = $ifindex;
|
||||
}
|
||||
return $stp_p_id;
|
||||
}
|
||||
|
||||
# extremeStpDomainStpdInstance not-accessible, extract from iid
|
||||
sub stp_p_stg_id {
|
||||
my $extreme = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $stp_port = $extreme->stp_p_root($partial);
|
||||
my $stp_p_stg_id = {};
|
||||
foreach my $idx ( keys %$stp_port ) {
|
||||
my ( $id, $ifindex ) = _ex_stpport_index($idx);
|
||||
$stp_p_stg_id->{$idx} = $id;
|
||||
}
|
||||
return $stp_p_stg_id;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
@@ -573,6 +918,10 @@ my $extreme = new SNMP::Info::Layer3::Extreme(...);
|
||||
|
||||
=item SNMP::Info::MAU
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=item SNMP::Info::EDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
@@ -587,6 +936,8 @@ my $extreme = new SNMP::Info::Layer3::Extreme(...);
|
||||
|
||||
=item F<EXTREME-VLAN-MIB>
|
||||
|
||||
=item F<EXTREME-POE-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See classes listed above for their required MIBs.
|
||||
@@ -653,12 +1004,6 @@ Returns base mac
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
@@ -667,6 +1012,14 @@ See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
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::EDP
|
||||
|
||||
See documentation in L<SNMP::Info::EDP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
@@ -711,6 +1064,11 @@ Ignores VLAN meta interfaces and loopback
|
||||
|
||||
(C<extremeFdbMacFdbStatus>)
|
||||
|
||||
=item $extreme->lldp_if()
|
||||
|
||||
Returns the mapping to the SNMP Interface Table. Extreme LLDP uses the
|
||||
bridge index rather than ifIndex.
|
||||
|
||||
=item $extreme->i_vlan()
|
||||
|
||||
Returns a mapping between C<ifIndex> and the VLAN.
|
||||
@@ -730,6 +1088,12 @@ IDs. These are the VLANs which are members of the egress list for the port.
|
||||
print "Port: $port VLAN: $vlan\n";
|
||||
}
|
||||
|
||||
=item $extreme->i_vlan_membership_untagged()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
IDs. These are the VLANs which are members of the untagged egress list for
|
||||
the port.
|
||||
|
||||
=item $extreme->v_index()
|
||||
|
||||
Returns VLAN IDs
|
||||
@@ -748,6 +1112,110 @@ identifier (iid)
|
||||
Returns (C<ifIndex>) for both key and value since we're using
|
||||
F<EXTREME-FDB-MIB> rather than F<BRIDGE-MIB>.
|
||||
|
||||
=item $extreme->peth_port_power()
|
||||
|
||||
Power supplied by PoE ports, in milliwatts
|
||||
|
||||
(C<extremePethPortMeasuredPower>)
|
||||
|
||||
=item $extreme->peth_power_watts()
|
||||
|
||||
The configured maximum amount of in-line power available to the slot.
|
||||
|
||||
(C<extremePethSlotPowerLimit>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Spanning Tree Instance Globals
|
||||
|
||||
=over
|
||||
|
||||
=item $extreme->stp_i_mac()
|
||||
|
||||
Returns the MAC extracted from (C<extremeStpDomainBridgeId>).
|
||||
|
||||
=item $extreme->stp_i_id()
|
||||
|
||||
Returns the unique identifier of the STP domain.
|
||||
|
||||
(C<extremeStpDomainStpdInstance>)
|
||||
|
||||
=item $extreme->stp_i_time()
|
||||
|
||||
Returns time since last topology change detected. (100ths/second)
|
||||
|
||||
(C<extremeStpDomainTimeSinceTopologyChange>)
|
||||
|
||||
=item $extreme->stp_i_time()
|
||||
|
||||
Returns time since last topology change detected. (100ths/second)
|
||||
|
||||
(C<extremeStpDomainTimeSinceTopologyChange>)
|
||||
|
||||
=item $extreme->stp_i_time()
|
||||
|
||||
Returns the total number of topology changes detected.
|
||||
|
||||
(C<extremeStpDomainTopChanges>)
|
||||
|
||||
=item $extreme->stp_i_root()
|
||||
|
||||
Returns root of STP.
|
||||
|
||||
(C<extremeStpDomainDesignatedRoot>)
|
||||
|
||||
=item $extreme->stp_i_root_port()
|
||||
|
||||
Returns the port number of the port that offers the lowest cost path
|
||||
to the root bridge.
|
||||
|
||||
(C<extremeStpDomainRootPortIfIndex>)
|
||||
|
||||
=item $extreme->stp_i_priority()
|
||||
|
||||
Returns the port number of the port that offers the lowest cost path
|
||||
to the root bridge.
|
||||
|
||||
(C<extremeStpDomainBridgePriority>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Spanning Tree Protocol Port Table
|
||||
|
||||
=over
|
||||
|
||||
=item $extreme->stp_p_id()
|
||||
|
||||
(C<extremeStpPortPortIfIndex>)
|
||||
|
||||
=item $extreme->stp_p_stg_id()
|
||||
|
||||
(C<extremeStpDomainStpdInstance>)
|
||||
|
||||
=item $extreme->stp_p_priority()
|
||||
|
||||
(C<extremeStpPortPortPriority>)
|
||||
|
||||
=item $extreme->stp_p_state()
|
||||
|
||||
(C<extremeStpPortPortState>)
|
||||
|
||||
=item $extreme->stp_p_cost()
|
||||
|
||||
(C<extremeStpPortPathCost>)
|
||||
|
||||
=item $extreme->stp_p_root()
|
||||
|
||||
(C<extremeStpPortDesignatedRoot>)
|
||||
|
||||
=item $extreme->stp_p_bridge()
|
||||
|
||||
(C<extremeStpPortDesignatedBridge>)
|
||||
|
||||
=item $extreme->stp_p_port()
|
||||
|
||||
(C<extremeStpPortDesignatedPort>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
@@ -758,6 +1226,14 @@ See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::EDP
|
||||
|
||||
See documentation in L<SNMP::Info::EDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 SET METHODS
|
||||
|
||||
These are methods that provide SNMP set functionality for overridden methods
|
||||
|
||||
457
Info/Layer3/F5.pm
Normal file
457
Info/Layer3/F5.pm
Normal file
@@ -0,0 +1,457 @@
|
||||
# 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.33';
|
||||
|
||||
%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_in64' => 'sysIfxStatHcInOctets',
|
||||
'i_octet_out64' => 'sysIfxStatHcOutOctets',
|
||||
'i_pkts_ucast_in64' => 'sysIfxStatHcInUcastPkts',
|
||||
'i_pkts_ucast_out64' => 'sysIfxStatHcOutUcastPkts',
|
||||
'i_pkts_mutli_in64' => 'sysIfxStatInMulticastPkts',
|
||||
'i_pkts_multi_out64' => 'sysIfxStatOutMulticastPkts',
|
||||
'i_pkts_bcast_in64' => 'sysIfxStatInBroadcastPkts',
|
||||
'i_pkts_bcast_out64' => 'sysIfxStatOutBroadcastPkts',
|
||||
|
||||
# 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;
|
||||
}
|
||||
|
||||
sub i_vlan_membership_untagged {
|
||||
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 ) {
|
||||
|
||||
next unless $tagged->{$iid} eq 'false';
|
||||
# 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->i_vlan_membership_untagged()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
IDs. These are the VLANs which are members of the untagged egress list for
|
||||
the port.
|
||||
|
||||
=item $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
|
||||
298
Info/Layer3/Force10.pm
Normal file
298
Info/Layer3/Force10.pm
Normal file
@@ -0,0 +1,298 @@
|
||||
# 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.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::MAU::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
'F10-PRODUCTS-MIB' => 'f10Products',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::MAU::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::MAU::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::MAU::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
);
|
||||
|
||||
# use MAU-MIB for admin. duplex and admin. speed
|
||||
*SNMP::Info::Layer3::Force10::i_duplex_admin
|
||||
= \&SNMP::Info::MAU::mau_i_duplex_admin;
|
||||
*SNMP::Info::Layer3::Force10::i_speed_admin
|
||||
= \&SNMP::Info::MAU::mau_i_speed_admin;
|
||||
|
||||
sub vendor {
|
||||
return 'force10';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'ftos';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $force10 = shift;
|
||||
my $descr = $force10->description();
|
||||
my $os_ver = undef;
|
||||
|
||||
$os_ver = $1 if ( $descr =~ /Force10\s+Application\s+Software\s+Version:\s+(\S+)/s );
|
||||
|
||||
return $os_ver;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $force10 = shift;
|
||||
my $id = $force10->id();
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub v_name {
|
||||
my $force10 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $force10->qb_v_name($partial);
|
||||
}
|
||||
|
||||
# ------------------- stub for now-----------------
|
||||
sub i_vlan {
|
||||
my $force10 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_vlan = {};
|
||||
|
||||
return $i_vlan;
|
||||
}
|
||||
|
||||
# Apparently index doesn't use VLAN ID, so override the HOA private
|
||||
# method here to correct the mapping
|
||||
sub _vlan_hoa {
|
||||
my $force10 = shift;
|
||||
my ( $v_ports, $partial ) = @_;
|
||||
|
||||
my $index = $force10->bp_index();
|
||||
my $v_index = $force10->v_index();
|
||||
|
||||
my $vlan_hoa = {};
|
||||
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;
|
||||
|
||||
# Strip TimeFilter if we're using VlanCurrentTable
|
||||
( $vlan_ndx = $idx ) =~ s/^\d+\.//;
|
||||
|
||||
# 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 ( @{ $vlan_hoa->{$ifindex} }, ($mod) );
|
||||
}
|
||||
}
|
||||
return $vlan_hoa;
|
||||
}
|
||||
|
||||
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_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
|
||||
200
Info/Layer3/Fortinet.pm
Normal file
200
Info/Layer3/Fortinet.pm
Normal file
@@ -0,0 +1,200 @@
|
||||
# SNMP::Info::Layer3::Fortinet
|
||||
#
|
||||
# Copyright (c) 2014 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::Fortinet;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::Fortinet::ISA
|
||||
= qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Fortinet::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
'FORTINET-CORE-MIB' => 'fnSysSerial',
|
||||
'FORTINET-FORTIGATE-MIB' => 'fgVdMaxVdoms',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'fortinet';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $fortinet = shift;
|
||||
my $id = $fortinet->id() || '';
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^f[grsw][tfw]?//i;
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'fortios';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $fortinet = shift;
|
||||
|
||||
my $ver = $fortinet->fgSysVersion() || '';
|
||||
|
||||
if ( $ver =~ /(\d+[\.\d]+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
return $ver;
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $fortinet = shift;
|
||||
|
||||
return $fortinet->fnSysSerial();
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Fortinet - SNMP Interface to Fortinet network devices.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $fortinet = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $fortinet->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Abstraction subclass for Fortinet 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 $fortinet = new SNMP::Info::Layer3::Fortinet(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<FORTINET-CORE-MIB>
|
||||
|
||||
=item F<FORTINET-FORTIGATE-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 $fortinet->vendor()
|
||||
|
||||
Returns 'fortinet'
|
||||
|
||||
=item $fortinet->model()
|
||||
|
||||
Returns the chassis model.
|
||||
|
||||
=item $fortinet->os()
|
||||
|
||||
Returns 'fortios'
|
||||
|
||||
=item $fortinet->os_ver()
|
||||
|
||||
Returns the software version extracted from (C<systemVersion>).
|
||||
|
||||
=item $fortinet->serial()
|
||||
|
||||
Returns the chassis serial number.
|
||||
|
||||
(C<fnSysSerial>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
File diff suppressed because it is too large
Load Diff
250
Info/Layer3/H3C.pm
Normal file
250
Info/Layer3/H3C.pm
Normal file
@@ -0,0 +1,250 @@
|
||||
# SNMP::Info::Layer3::H3C
|
||||
#
|
||||
# Copyright (c) 2012 Jeroen van Ingen
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::H3C;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::LLDP;
|
||||
use SNMP::Info::IEEE802dot3ad 'agg_ports_lag';
|
||||
|
||||
@SNMP::Info::Layer3::H3C::ISA = qw/
|
||||
SNMP::Info::IEEE802dot3ad
|
||||
SNMP::Info::LLDP
|
||||
SNMP::Info::Layer3
|
||||
Exporter
|
||||
/;
|
||||
@SNMP::Info::Layer3::H3C::EXPORT_OK = qw/
|
||||
agg_ports
|
||||
/;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::IEEE802dot3ad::MIBS,
|
||||
'HH3C-LswDEVM-MIB' => 'hh3cDevMFanStatus',
|
||||
'HH3C-LswINF-MIB' => 'hh3cSlotPortMax',
|
||||
'HH3C-LSW-DEV-ADM-MIB' => 'hh3cLswSysVersion',
|
||||
'HH3C-PRODUCT-ID-MIB' => 'hh3c-s5500-28C-EI',
|
||||
'HH3C-ENTITY-VENDORTYPE-OID-MIB' => 'hh3cevtOther',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
'fan' => 'hh3cDevMFanStatus.1',
|
||||
'ps1_status' => 'hh3cDevMPowerStatus.1',
|
||||
'ps2_status' => 'hh3cDevMPowerStatus.2',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
i_duplex_admin => 'hh3cifEthernetDuplex',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
my $h3c = shift;
|
||||
my $mfg = $h3c->entPhysicalMfgName(1) || {};
|
||||
return $mfg->{1} || "H3C";
|
||||
}
|
||||
|
||||
sub os {
|
||||
my $h3c = shift;
|
||||
my $descr = $h3c->description();
|
||||
|
||||
return $1 if ( $descr =~ /(\S+)\s+Platform Software/ );
|
||||
return "H3C";
|
||||
}
|
||||
|
||||
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 );
|
||||
$os_ver = "$1" if ( $descr =~ /Product Version ([0-9.]+)/i );
|
||||
|
||||
return $ver_release->{2} || $os_ver;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $l3->interfaces($partial) || {};
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
|
||||
# lo0 etc
|
||||
if ( $interfaces->{$if} =~ /\blo\d*\b/i ) {
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
sub agg_ports { return agg_ports_lag(@_) }
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::H3C - SNMP Interface to L3 Devices, H3C & HP A-series
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Jeroen van Ingen
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $h3c = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $h3c->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for H3C & HP A-series devices
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<HH3C-LswDEVM-MIB>
|
||||
|
||||
=item F<HH3C-LswINF-MIB>
|
||||
|
||||
=item F<HH3C-LSW-DEV-ADM-MIB>
|
||||
|
||||
=item F<HH3C-PRODUCT-ID-MIB>
|
||||
|
||||
=item F<HH3C-ENTITY-VENDORTYPE-OID-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $h3c->vendor()
|
||||
|
||||
Returns value for C<entPhysicalMfgName.1>.
|
||||
|
||||
=item $h3c->os()
|
||||
|
||||
Returns the OS extracted from C<sysDescr>.
|
||||
|
||||
=item $h3c->os_ver()
|
||||
|
||||
Returns the software version. Either C<entPhysicalSoftwareRev.2> or extracted from
|
||||
C<sysDescr>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $h3c->i_ignore()
|
||||
|
||||
Returns reference to hash. Increments value of IID if port is to be ignored.
|
||||
|
||||
Ignores loopback
|
||||
|
||||
=item C<agg_ports>
|
||||
|
||||
Returns a HASH reference mapping from slave to master port for each member of
|
||||
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
|
||||
ifIndex of the corresponding master ports.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP> for details.
|
||||
|
||||
=cut
|
||||
@@ -42,7 +42,7 @@ use SNMP::Info::LLDP;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
@@ -196,134 +196,6 @@ sub interfaces {
|
||||
return $i_descr;
|
||||
}
|
||||
|
||||
# Use FDP and/or LLDP
|
||||
|
||||
sub hasCDP {
|
||||
my $hp9300 = shift;
|
||||
|
||||
return $hp9300->hasLLDP() || $hp9300->SUPER::hasCDP();
|
||||
}
|
||||
|
||||
sub c_ip {
|
||||
my $hp9300 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $cdp = $hp9300->SUPER::c_ip($partial) || {};
|
||||
my $lldp = $hp9300->lldp_ip($partial) || {};
|
||||
|
||||
my %c_ip;
|
||||
foreach my $iid ( keys %$cdp ) {
|
||||
my $ip = $cdp->{$iid};
|
||||
next unless defined $ip;
|
||||
|
||||
$c_ip{$iid} = $ip;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$lldp ) {
|
||||
my $ip = $lldp->{$iid};
|
||||
next unless defined $ip;
|
||||
|
||||
$c_ip{$iid} = $ip;
|
||||
}
|
||||
return \%c_ip;
|
||||
}
|
||||
|
||||
sub c_if {
|
||||
my $hp9300 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $lldp = $hp9300->lldp_if($partial) || {};
|
||||
my $cdp = $hp9300->SUPER::c_if($partial) || {};
|
||||
|
||||
my %c_if;
|
||||
foreach my $iid ( keys %$cdp ) {
|
||||
my $if = $cdp->{$iid};
|
||||
next unless defined $if;
|
||||
|
||||
$c_if{$iid} = $if;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$lldp ) {
|
||||
my $if = $lldp->{$iid};
|
||||
next unless defined $if;
|
||||
|
||||
$c_if{$iid} = $if;
|
||||
}
|
||||
return \%c_if;
|
||||
}
|
||||
|
||||
sub c_port {
|
||||
my $hp9300 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $lldp = $hp9300->lldp_port($partial) || {};
|
||||
my $cdp = $hp9300->SUPER::c_port($partial) || {};
|
||||
|
||||
my %c_port;
|
||||
foreach my $iid ( keys %$cdp ) {
|
||||
my $port = $cdp->{$iid};
|
||||
next unless defined $port;
|
||||
|
||||
$c_port{$iid} = $port;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$lldp ) {
|
||||
my $port = $lldp->{$iid};
|
||||
next unless defined $port;
|
||||
|
||||
$c_port{$iid} = $port;
|
||||
}
|
||||
return \%c_port;
|
||||
}
|
||||
|
||||
sub c_id {
|
||||
my $hp9300 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $lldp = $hp9300->lldp_id($partial) || {};
|
||||
my $cdp = $hp9300->SUPER::c_id($partial) || {};
|
||||
|
||||
my %c_id;
|
||||
foreach my $iid ( keys %$cdp ) {
|
||||
my $id = $cdp->{$iid};
|
||||
next unless defined $id;
|
||||
|
||||
$c_id{$iid} = $id;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$lldp ) {
|
||||
my $id = $lldp->{$iid};
|
||||
next unless defined $id;
|
||||
|
||||
$c_id{$iid} = $id;
|
||||
}
|
||||
return \%c_id;
|
||||
}
|
||||
|
||||
sub c_platform {
|
||||
my $hp9300 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $lldp = $hp9300->lldp_rem_sysdesc($partial) || {};
|
||||
my $cdp = $hp9300->SUPER::c_platform($partial) || {};
|
||||
|
||||
my %c_platform;
|
||||
foreach my $iid ( keys %$cdp ) {
|
||||
my $platform = $cdp->{$iid};
|
||||
next unless defined $platform;
|
||||
|
||||
$c_platform{$iid} = $platform;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$lldp ) {
|
||||
my $platform = $lldp->{$iid};
|
||||
next unless defined $platform;
|
||||
|
||||
$c_platform{$iid} = $platform;
|
||||
}
|
||||
return \%c_platform;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
@@ -527,54 +399,6 @@ Returns reference to hash. Current Port Speed.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Topology information
|
||||
|
||||
Based upon the software version devices may support Foundry Discovery
|
||||
Protocol (FDP) and Link Layer Discovery Protocol (LLDP). These
|
||||
methods will query both and return the combination of all information. As a
|
||||
result, there may be identical topology information returned from the two
|
||||
protocols causing duplicate entries. It is the calling program's
|
||||
responsibility to identify any duplicate entries and remove duplicates
|
||||
if necessary.
|
||||
|
||||
=over
|
||||
|
||||
=item $hp9300->hasCDP()
|
||||
|
||||
Returns true if the device is running either FDP or LLDP.
|
||||
|
||||
=item $hp9300->c_if()
|
||||
|
||||
Returns reference to hash. Key: iid Value: local device port (interfaces)
|
||||
|
||||
=item $hp9300->c_ip()
|
||||
|
||||
Returns reference to hash. Key: iid Value: remote IPv4 address
|
||||
|
||||
If multiple entries exist with the same local port, c_if(), with the same IPv4
|
||||
address, c_ip(), it may be a duplicate entry.
|
||||
|
||||
If multiple entries exist with the same local port, c_if(), with different
|
||||
IPv4 addresses, c_ip(), there is either a non-FDP/LLDP device in between two
|
||||
or more devices or multiple devices which are not directly connected.
|
||||
|
||||
Use the data from the Layer2 Topology Table below to dig deeper.
|
||||
|
||||
=item $hp9300->c_port()
|
||||
|
||||
Returns reference to hash. Key: iid Value: remote port (interfaces)
|
||||
|
||||
=item $hp9300->c_id()
|
||||
|
||||
Returns reference to hash. Key: iid Value: string value used to identify the
|
||||
chassis component associated with the remote system.
|
||||
|
||||
=item $hp9300->c_platform()
|
||||
|
||||
Returns reference to hash. Key: iid Value: Remote Device Type
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
232
Info/Layer3/Huawei.pm
Normal file
232
Info/Layer3/Huawei.pm
Normal file
@@ -0,0 +1,232 @@
|
||||
# SNMP::Info::Layer3::Huawei
|
||||
#
|
||||
# Copyright (c) 2015 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::Huawei;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::LLDP;
|
||||
use SNMP::Info::IEEE802dot3ad 'agg_ports_lag';
|
||||
|
||||
@SNMP::Info::Layer3::Huawei::ISA = qw/
|
||||
SNMP::Info::IEEE802dot3ad
|
||||
SNMP::Info::LLDP
|
||||
SNMP::Info::Layer3
|
||||
Exporter
|
||||
/;
|
||||
@SNMP::Info::Layer3::Huawei::EXPORT_OK = qw/
|
||||
agg_ports
|
||||
/;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::IEEE802dot3ad::MIBS,
|
||||
'HUAWEI-MIB' => 'quidway',
|
||||
);
|
||||
|
||||
%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 "Huawei";
|
||||
}
|
||||
|
||||
sub os {
|
||||
my $huawei = shift;
|
||||
my $descr = $huawei->description();
|
||||
|
||||
return $1 if ( $descr =~ /\b(VRP)\b/ );
|
||||
return "huawei";
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $huawei = shift;
|
||||
my $descr = $huawei->description();
|
||||
my $os_ver = undef;
|
||||
|
||||
$os_ver = "$1" if ( $descr =~ /\bVersion ([0-9.]+)/i );
|
||||
|
||||
return $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} =~ /\b(inloopback|console)\d*\b/i ) {
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
sub agg_ports { return agg_ports_lag(@_) }
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Huawei - SNMP Interface to Huawei Layer 3 switches and routers.
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Jeroen van Ingen
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $huawei = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $huawei->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Huawei Quidway switches
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=item SNMP::Info::IEEE802dot3ad
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<HUAWEI-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.
|
||||
|
||||
See L<SNMP::Info::IEEE802dot3ad> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $huawei->vendor()
|
||||
|
||||
Returns 'Huawei'.
|
||||
|
||||
=item $huawei->os()
|
||||
|
||||
Returns 'VRP' if contained in C<sysDescr>, 'huawei' otherwise.
|
||||
|
||||
=item $huawei->os_ver()
|
||||
|
||||
Returns the software version extracted from C<sysDescr>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $huawei->i_ignore()
|
||||
|
||||
Returns reference to hash. Increments value of IID if port is to be ignored.
|
||||
|
||||
Ignores InLoopback and Console interfaces
|
||||
|
||||
=item C<agg_ports>
|
||||
|
||||
Returns a HASH reference mapping from slave to master port for each member of
|
||||
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
|
||||
ifIndex of the corresponding master ports.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP> for details.
|
||||
|
||||
=cut
|
||||
407
Info/Layer3/IBMGbTor.pm
Normal file
407
Info/Layer3/IBMGbTor.pm
Normal file
@@ -0,0 +1,407 @@
|
||||
# SNMP::Info::Layer3::IBMGbTor - SNMP Interface to IBM Rackswitch devices
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2013 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::IBMGbTor;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer3::IBMGbTor::ISA
|
||||
= qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::IBMGbTor::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
|
||||
# LLDP MIBs not loaded to prevent possible unqualified namespace conflict
|
||||
# with IBM definitions
|
||||
'IBM-GbTOR-10G-L2L3-MIB' => 'lldpInfoRemoteDevicesLocalPort',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
'temp' => 'hwTempSensors',
|
||||
'fan' => 'hwFanSpeed',
|
||||
|
||||
# Can't find the equivalent in IBM-GbTOR-10G-L2L3-MIB
|
||||
# use a different strategy for lldp_sys_cap in hasLLDP()
|
||||
#'lldp_sysname' => 'lldpLocSysName',
|
||||
#'lldp_sysdesc' => 'lldpLocSysDesc',
|
||||
#'lldp_sys_cap' => 'lldpLocSysCapEnabled',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
|
||||
# IBM-GbTOR-10G-L2L3-MIB::portInfoTable
|
||||
'sw_duplex' => 'portInfoMode',
|
||||
|
||||
# Can't find the equivalent in IBM-GbTOR-10G-L2L3-MIB
|
||||
# not currently used in LLDP class
|
||||
#'lldp_lman_addr' => 'lldpLocManAddrIfId',
|
||||
|
||||
# IBM-GbTOR-10G-L2L3-MIB::lldpInfoPortTable
|
||||
'lldp_port_status' => 'lldpInfoPortAdminStatus',
|
||||
|
||||
# IBM-GbTOR-10G-L2L3-MIB::lldpInfoRemoteDevicesTable
|
||||
'lldp_rem_id_type' => 'lldpInfoRemoteDevicesChassisSubtype',
|
||||
'lldp_rem_id' => 'lldpInfoRemoteDevicesSystemName',
|
||||
'lldp_rem_pid_type' => 'lldpInfoRemoteDevicesPortSubtype',
|
||||
'lldp_rem_pid' => 'lldpInfoRemoteDevicesPortId',
|
||||
'lldp_rem_desc' => 'lldpInfoRemoteDevicesPortDescription',
|
||||
'lldp_rem_sysname' => 'lldpInfoRemoteDevicesSystemName',
|
||||
'lldp_rem_sysdesc' => 'lldpInfoRemoteDevicesSystemDescription',
|
||||
'lldp_rem_sys_cap' => 'lldpInfoRemoteDevicesSystemCapEnabled',
|
||||
|
||||
# IBM-GbTOR-10G-L2L3-MIB::lldpInfoRemoteDevicesManAddrTable
|
||||
'lldp_rman_type' => 'lldpInfoRemoteDevicesManAddrSubtype',
|
||||
'lldp_rman_addr' => 'lldpInfoRemoteDevicesManAddr',
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE, );
|
||||
|
||||
sub hasLLDP {
|
||||
my $ibm = shift;
|
||||
|
||||
# We may be have LLDP, but nothing in lldpRemoteSystemsData Tables
|
||||
# Look to see if LLDP Rx enabled on any port
|
||||
my $lldp_cap = $ibm->lldp_port_status();
|
||||
|
||||
foreach my $if ( keys %$lldp_cap ) {
|
||||
if ( $lldp_cap->{$if} =~ /enabledRx/i ) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub lldp_ip {
|
||||
my $ibm = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $rman_type = $ibm->lldp_rman_type($partial) || {};
|
||||
my $rman_addr = $ibm->lldp_rman_addr($partial) || {};
|
||||
|
||||
my %lldp_ip;
|
||||
foreach my $key ( keys %$rman_addr ) {
|
||||
my $type = $rman_type->{$key};
|
||||
next unless defined $type;
|
||||
next unless $type eq 'ipV4';
|
||||
if ( $key =~ /^(\d+)\./ ) {
|
||||
$lldp_ip{$1} = $rman_addr->{$key};
|
||||
}
|
||||
}
|
||||
return \%lldp_ip;
|
||||
}
|
||||
|
||||
sub lldp_if {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $lldp_desc = $lldp->lldpInfoRemoteDevicesLocalPort($partial) || {};
|
||||
my $i_descr = $lldp->i_description() || {};
|
||||
my $i_alias = $lldp->i_alias() || {};
|
||||
my %r_i_descr = reverse %$i_descr;
|
||||
my %r_i_alias = reverse %$i_alias;
|
||||
|
||||
my %lldp_if;
|
||||
foreach my $key ( keys %$lldp_desc ) {
|
||||
|
||||
# Cross reference lldpLocPortDesc with ifDescr and ifAlias to get ifIndex,
|
||||
# prefer ifAlias over ifDescr since MIB says 'alias'.
|
||||
my $desc = $lldp_desc->{$key};
|
||||
next unless $desc;
|
||||
my $port = $desc;
|
||||
|
||||
# If cross reference is successful use it, otherwise stick with
|
||||
# lldpRemLocalPortNum
|
||||
if ( exists $r_i_alias{$desc} ) {
|
||||
$port = $r_i_alias{$desc};
|
||||
}
|
||||
elsif ( exists $r_i_descr{$desc} ) {
|
||||
$port = $r_i_descr{$desc};
|
||||
}
|
||||
|
||||
$lldp_if{$key} = $port;
|
||||
}
|
||||
return \%lldp_if;
|
||||
}
|
||||
|
||||
sub lldp_platform {
|
||||
my $ibm = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $ibm->lldpInfoRemoteDevicesSystemDescription($partial);
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $ibm = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $ibm->interfaces($partial) || {};
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
if ( $interfaces->{$if} =~ /(tunnel|loopback|\blo\b|lb|null)/i ) {
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $ibm = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $ibm->sw_duplex($partial);
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $ibm = shift;
|
||||
my $id = $ibm->id();
|
||||
my $descr = $ibm->description();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
if ( $descr =~ /RackSwitch\s(.*)/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
return $model || $id;
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'ibm';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'ibm';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $ibm = shift;
|
||||
|
||||
return $ibm->agSoftwareVersion();
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $ibm = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_descr = $ibm->i_description($partial) || {};
|
||||
my $i_name = $ibm->i_name($partial) || {};
|
||||
|
||||
foreach my $iid ( keys %$i_name ) {
|
||||
my $name = $i_name->{$iid};
|
||||
next unless defined $name;
|
||||
$i_descr->{$iid} = $name
|
||||
if $name =~ /^port\d+/i;
|
||||
}
|
||||
|
||||
return $i_descr;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::IBMGbTor - SNMP Interface to IBM Rackswitch devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $ibm = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $ibm->class();
|
||||
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Abstraction subclass for IBM Rackswitch (formerly Blade Network Technologies)
|
||||
network devices.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $ibm = new SNMP::Info::Layer3::IBMGbTor(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3;
|
||||
|
||||
=item SNMP::Info::LLDP;
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<IBM-GbTOR-10G-L2L3-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $ibm->model()
|
||||
|
||||
Returns model type. Attempts to pull model from device description.
|
||||
Otherwise checks $ibm->id() against the F<IBM-GbTOR-10G-L2L3-MIB>.
|
||||
|
||||
=item $ibm->vendor()
|
||||
|
||||
Returns 'ibm'
|
||||
|
||||
=item $ibm->os()
|
||||
|
||||
Returns 'ibm'
|
||||
|
||||
=item $ibm->os_ver()
|
||||
|
||||
Returns the software version
|
||||
|
||||
(C<agSoftwareVersion>)
|
||||
|
||||
=item $ibm->temp()
|
||||
|
||||
(C<hwTempSensors>)
|
||||
|
||||
=item $ibm->fan()
|
||||
|
||||
(C<hwFanSpeed>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $ibm->hasLLDP()
|
||||
|
||||
Is LLDP is active in this device?
|
||||
|
||||
Note: LLDP may be active, but nothing in C<lldpRemoteSystemsData> Tables so
|
||||
the device would not return any useful topology information.
|
||||
|
||||
Checks to see if at least one interface is enabled to receive LLDP packets.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $ibm->interfaces()
|
||||
|
||||
Returns reference to hash of interface names to iids.
|
||||
|
||||
=item $ibm->i_ignore()
|
||||
|
||||
Returns reference to hash of interfaces to be ignored.
|
||||
|
||||
Ignores interfaces with descriptions of tunnel, loopback, and null.
|
||||
|
||||
=item $ibm->i_duplex()
|
||||
|
||||
Returns reference to hash of interface link duplex status.
|
||||
|
||||
(C<portInfoMode>)
|
||||
|
||||
=item $ibm->lldp_if()
|
||||
|
||||
Returns the mapping to the SNMP Interface Table. Tries to cross reference
|
||||
(C<lldpInfoRemoteDevicesLocalPort>) with (C<ifDescr>) and (C<ifAlias>)
|
||||
to get (C<ifIndex>).
|
||||
|
||||
=item $ibm->lldp_ip()
|
||||
|
||||
Returns remote IPv4 address. Returns for all other address types, use
|
||||
lldp_addr if you want any return address type.
|
||||
|
||||
=item $ibm->lldp_platform()
|
||||
|
||||
Returns remote device system description.
|
||||
|
||||
(C<lldpInfoRemoteDevicesSystemDescription>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
@@ -33,25 +33,53 @@ 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 Exporter/;
|
||||
@SNMP::Info::Layer3::Juniper::ISA = qw/SNMP::Info::Layer3 SNMP::Info::LLDP Exporter/;
|
||||
@SNMP::Info::Layer3::Juniper::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%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, 'serial' => 'jnxBoxSerialNo.0', );
|
||||
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
'serial' => 'jnxBoxSerialNo.0',
|
||||
'mac' => 'dot1dBaseBridgeAddress',
|
||||
'box_descr' => 'jnxBoxDescr'
|
||||
);
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
|
||||
%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, );
|
||||
%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';
|
||||
@@ -61,14 +89,32 @@ sub os {
|
||||
return 'junos';
|
||||
}
|
||||
|
||||
sub layers {
|
||||
my $juniper = shift;
|
||||
|
||||
my $layers = $juniper->SUPER::layers();
|
||||
# Some models don't report L2 properly
|
||||
my $macs = $juniper->fw_mac();
|
||||
|
||||
if (keys %$macs) {
|
||||
my $l = substr $layers, 6, 1, "1";
|
||||
}
|
||||
|
||||
return $layers;
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $juniper = shift;
|
||||
my $descr = $juniper->description();
|
||||
return unless defined $descr;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -97,22 +143,399 @@ sub serial {
|
||||
return $juniper->orig_serial();
|
||||
}
|
||||
|
||||
sub i_vlan {
|
||||
# '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;
|
||||
}
|
||||
|
||||
sub qb_fdb_index {
|
||||
my $juniper = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $juniper->jnxExVlanTag($partial);
|
||||
}
|
||||
|
||||
# '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 ($i_type) = $juniper->i_type($partial);
|
||||
my ($i_descr) = $juniper->i_description($partial);
|
||||
my %i_vlan;
|
||||
my ($v_index) = $juniper->jnxExVlanTag($partial);
|
||||
|
||||
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 $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;
|
||||
}
|
||||
|
||||
# Index doesn't use VLAN ID, so override the HOA private method here to
|
||||
# correct the mapping
|
||||
sub _vlan_hoa {
|
||||
my $juniper = shift;
|
||||
my ( $v_ports, $partial ) = @_;
|
||||
|
||||
my $index = $juniper->bp_index();
|
||||
my $v_index = $juniper->jnxExVlanTag($partial);
|
||||
|
||||
my $vlan_hoa = {};
|
||||
foreach my $idx ( keys %$v_ports ) {
|
||||
next unless ( defined $v_ports->{$idx} );
|
||||
my $portlist = $v_ports->{$idx};
|
||||
my $ret = [];
|
||||
my $vlan_ndx;
|
||||
|
||||
# Strip TimeFilter if we're using VlanCurrentTable
|
||||
( $vlan_ndx = $idx ) =~ s/^\d+\.//;
|
||||
|
||||
# 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( @{ $vlan_hoa->{$ifindex} }, $v_index->{$vlan_ndx} );
|
||||
}
|
||||
}
|
||||
return \%i_vlan;
|
||||
return $vlan_hoa;
|
||||
}
|
||||
|
||||
# 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;
|
||||
@@ -143,7 +566,7 @@ Bill Fenner
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Generic Juniper Routers running JUNOS
|
||||
Subclass for Juniper Devices running JUNOS
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
@@ -151,17 +574,29 @@ Subclass for Generic Juniper Routers running JUNOS
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
=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.
|
||||
|
||||
=back
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
@@ -171,19 +606,25 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=item $juniper->vendor()
|
||||
|
||||
Returns C<'juniper'>
|
||||
Returns 'juniper'
|
||||
|
||||
=item $juniper->os()
|
||||
|
||||
Returns C<'junos'>
|
||||
Returns 'junos'
|
||||
|
||||
=item $juniper->layers()
|
||||
|
||||
Checks forwarding table for Layer 2 support since some routers with switches
|
||||
do not report layers properly.
|
||||
|
||||
=item $juniper->os_ver()
|
||||
|
||||
Returns the software version extracted from C<sysDescr>.
|
||||
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<jnxProductNameremoved> from the
|
||||
Returns the model from C<sysObjectID>, with C<jnxProductName> removed from the
|
||||
beginning.
|
||||
|
||||
=item $juniper->serial()
|
||||
@@ -192,12 +633,29 @@ 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
|
||||
@@ -205,10 +663,86 @@ to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $juniper->qb_fdb_index()
|
||||
|
||||
Returns reference to hash: key = VLAN ID, value = FDB ID.
|
||||
|
||||
=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 the list of interfaces whose C<ifType> is l2vlan(135), and
|
||||
the VLAN ID extracted from the interface description.
|
||||
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
|
||||
|
||||
=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
|
||||
|
||||
@@ -216,4 +750,8 @@ the VLAN ID extracted from the interface description.
|
||||
|
||||
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.33';
|
||||
|
||||
%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
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer3;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = ( %SNMP::Info::Layer3::MIBS, );
|
||||
|
||||
|
||||
217
Info/Layer3/Mikrotik.pm
Normal file
217
Info/Layer3/Mikrotik.pm
Normal file
@@ -0,0 +1,217 @@
|
||||
# SNMP::Info::Layer3::Mikrotik
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2011 Jeroen van Ingen
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Mikrotik;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::Mikrotik::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Mikrotik::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
'HOST-RESOURCES-MIB' => 'hrSystem',
|
||||
'MIKROTIK-MIB' => 'mtxrLicVersion',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
'hrSystemUptime' => 'hrSystemUptime',
|
||||
'os_level' => 'mtxrLicLevel',
|
||||
'os_ver' => 'mtxrLicVersion',
|
||||
'serial1' => 'mtxrSystem.3.0',
|
||||
'firmware' => 'mtxrSystem.4.0',
|
||||
'fan_type' => 'mtxrHlActiveFan',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'mikrotik';
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $mikrotik = shift;
|
||||
return $mikrotik->serial1;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $mikrotik = shift;
|
||||
my $descr = $mikrotik->description() || '';
|
||||
my $model = undef;
|
||||
$model = $1 if ( $descr =~ /^RouterOS\s+(\S+)$/i );
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'routeros';
|
||||
}
|
||||
|
||||
sub board_temp {
|
||||
my $mikrotik = shift;
|
||||
my $temp = $mikrotik->mtxrHlTemperature;
|
||||
return $temp / 10.0;
|
||||
}
|
||||
|
||||
sub cpu_temp {
|
||||
my $mikrotik = shift;
|
||||
my $temp = $mikrotik->mtxrHlProcessorTemperature;
|
||||
return $temp / 10.0;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Mikrotik - SNMP Interface to Mikrotik devices
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Jeroen van Ingen
|
||||
initial version based on SNMP::Info::Layer3::NetSNMP by Bradley Baetz and Bill Fenner
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $mikrotik = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $mikrotik->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Mikrotik devices
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<HOST-RESOURCES-MIB>
|
||||
|
||||
=item F<MIKROTIK-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $mikrotik->vendor()
|
||||
|
||||
Returns C<'mikrotik'>.
|
||||
|
||||
=item $mikrotik->os()
|
||||
|
||||
Returns C<'routeros'>.
|
||||
|
||||
=item $mikrotik->model()
|
||||
|
||||
Tries to extract the device model from C<sysDescr>.
|
||||
|
||||
=item $mikrotik->os_ver()
|
||||
|
||||
Returns the value of C<mtxrLicVersion>.
|
||||
|
||||
=item $mikrotik->os_level()
|
||||
|
||||
Returns the value of RouterOS level C<mtxrLicLevel>
|
||||
|
||||
=item $mikrotik->board_temp()
|
||||
=item $mikrotik->cpu_temp()
|
||||
|
||||
Returns the appropriate temperature values
|
||||
|
||||
=item $mikrotik->serial()
|
||||
|
||||
Returns the device serial.
|
||||
|
||||
=item $mikrotik->firmware()
|
||||
|
||||
Returns the firmware version of hardware.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
None.
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3> for details.
|
||||
|
||||
|
||||
=cut
|
||||
@@ -41,7 +41,7 @@ use SNMP::Info::SONMP;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
@@ -93,7 +93,7 @@ sub model {
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'nortel';
|
||||
return 'avaya';
|
||||
}
|
||||
|
||||
sub os {
|
||||
@@ -174,7 +174,8 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::N1600 - SNMP Interface to Nortel 16XX Network Devices
|
||||
SNMP::Info::Layer3::N1600 - SNMP Interface to Avaya/Nortel 16XX Network
|
||||
Devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
@@ -198,8 +199,8 @@ Eric Miller
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a Nortel
|
||||
N16XX device through SNMP.
|
||||
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.
|
||||
@@ -247,7 +248,7 @@ F<RAPID-CITY-MIB> and then parses out C<rcA>.
|
||||
|
||||
=item $n1600->vendor()
|
||||
|
||||
Returns 'nortel'
|
||||
Returns 'avaya'
|
||||
|
||||
=item $n1600->os()
|
||||
|
||||
|
||||
@@ -33,16 +33,18 @@ 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::Layer3 Exporter/;
|
||||
@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 = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
'UCD-SNMP-MIB' => 'versionTag',
|
||||
'NET-SNMP-TC' => 'netSnmpAgentOIDs',
|
||||
'HOST-RESOURCES-MIB' => 'hrSystem',
|
||||
@@ -50,13 +52,20 @@ $VERSION = '2.00';
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
'netsnmp_vers' => 'versionTag',
|
||||
'hrSystemUptime' => 'hrSystemUptime',
|
||||
);
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'Net-SNMP';
|
||||
@@ -173,6 +182,8 @@ Subclass for Generic Net-SNMP devices
|
||||
|
||||
See L<SNMP::Info::Layer3> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
@@ -210,6 +221,10 @@ Returns ''.
|
||||
|
||||
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
|
||||
@@ -231,6 +246,10 @@ Ignores loopback
|
||||
|
||||
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
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
# SNMP::Info::Layer3::Netscreen
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# Copyright (c) 2012 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
@@ -33,34 +32,62 @@ 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 Exporter/;
|
||||
@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 = '2.00';
|
||||
$VERSION = '3.33';
|
||||
|
||||
%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, 'os_version' => 'nsSetGenSwVer', );
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::IEEE802dot11::GLOBALS,
|
||||
'os_version' => 'nsSetGenSwVer',
|
||||
);
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::IEEE802dot11::FUNCS,
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
|
||||
ns_i_index => 'nsIfIndex',
|
||||
ns_i_name => 'nsIfName',
|
||||
ns_i_description => 'nsIfDescr',
|
||||
ns_i_mac => 'nsIfMAC',
|
||||
ns_i_up => 'nsIfStatus',
|
||||
ns_ip_table => 'nsIfIp',
|
||||
ns_ip_netmask => 'nsIfNetmask',
|
||||
bp_index => 'nsIfInfo',
|
||||
std_at_paddr => 'ipNetToMediaPhysAddress',
|
||||
ns_at_paddr => 'nsIpArpMac',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::IEEE802dot11::MUNGE,
|
||||
'ns_i_mac' => \&SNMP::Info::munge_mac,
|
||||
'ns_at_paddr' => \&SNMP::Info::munge_mac,
|
||||
'std_at_paddr' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
sub layers {
|
||||
return '01001100';
|
||||
return '01001110';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'netscreen';
|
||||
return 'juniper';
|
||||
}
|
||||
|
||||
sub os {
|
||||
@@ -92,6 +119,392 @@ sub serial {
|
||||
return;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $id = $netscreen->id();
|
||||
|
||||
unless ( defined $id ) {
|
||||
print
|
||||
" SNMP::Info::Layer3::model() - Device does not support sysObjectID\n"
|
||||
if $netscreen->debug();
|
||||
return;
|
||||
}
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^netscreen//i;
|
||||
return $model;
|
||||
}
|
||||
|
||||
# provides mapping from IF-MIB to nsIf interfaces - many to 1 (!)
|
||||
# - on WLAN devices wireless0/0(|-[ag]) -> wireless0/0 !!
|
||||
sub _if_nsif_map {
|
||||
my $netscreen = shift;
|
||||
my $i_descr = $netscreen->SUPER::i_description;
|
||||
my $ns_descr = $netscreen->i_description;
|
||||
my %if_nsif_map = ();
|
||||
my @ikeys = sort { $a <=> $b } keys %$i_descr;
|
||||
my @nskeys = sort { $a <=> $b } keys %$ns_descr;
|
||||
my $i = 0;
|
||||
my $n = 0;
|
||||
|
||||
# assumes descriptions are in the same order from both walks
|
||||
while ( $i < @ikeys && $n < @nskeys ) {
|
||||
|
||||
# find matching sub interfaces
|
||||
while (
|
||||
$i < @ikeys
|
||||
&& substr(
|
||||
$i_descr->{ $ikeys[$i] },
|
||||
0,
|
||||
length $ns_descr->{ $nskeys[$n] }
|
||||
) eq $ns_descr->{ $nskeys[$n] }
|
||||
)
|
||||
{
|
||||
|
||||
$if_nsif_map{ $ikeys[$i] } = $nskeys[$n];
|
||||
$i++;
|
||||
}
|
||||
|
||||
$n++;
|
||||
|
||||
# skip non-matching interfaces (e.g. tunnel.N)
|
||||
while (
|
||||
$i < @ikeys
|
||||
&& substr(
|
||||
$i_descr->{ $ikeys[$i] },
|
||||
0,
|
||||
length $ns_descr->{ $nskeys[$n] }
|
||||
) ne $ns_descr->{ $nskeys[$n] }
|
||||
&& $n < @nskeys
|
||||
)
|
||||
{
|
||||
|
||||
$if_nsif_map{ $ikeys[$i] } = 0; # no matching interface
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
|
||||
return \%if_nsif_map;
|
||||
}
|
||||
|
||||
# Provides mapping from nsIf interfaces to IF-MIB interfaces - many to 1
|
||||
# Example, tunnel.# interfaces are not present in IF-MIB. There exist no
|
||||
# mapping of index IID's between the tables so create mapping based on names
|
||||
sub _nsif_if_map {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $i_descr = $netscreen->SUPER::i_description;
|
||||
my $ns_descr = $netscreen->i_description;
|
||||
my %rev_i_descr = reverse %$i_descr;
|
||||
my %rev_ns_descr = reverse %$ns_descr;
|
||||
|
||||
my %nsif_if_map = ();
|
||||
foreach my $value ( values %$ns_descr ) {
|
||||
if ( exists $rev_i_descr{$value} ) {
|
||||
$nsif_if_map{ $rev_ns_descr{$value} } = $rev_i_descr{$value};
|
||||
}
|
||||
else {
|
||||
$nsif_if_map{ $rev_ns_descr{$value} } = 0;
|
||||
}
|
||||
}
|
||||
return \%nsif_if_map;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $netscreen = shift;
|
||||
return $netscreen->i_description();
|
||||
}
|
||||
|
||||
sub i_index {
|
||||
my $netscreen = shift;
|
||||
return $netscreen->ns_i_index();
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $netscreen = shift;
|
||||
return $netscreen->ns_i_name();
|
||||
}
|
||||
|
||||
sub i_description {
|
||||
my $netscreen = shift;
|
||||
|
||||
# Versions prior to 5.4 do not support nsIfDescr but do have nsIfName
|
||||
return $netscreen->ns_i_description() || $netscreen->ns_i_name();
|
||||
}
|
||||
|
||||
sub i_mac {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $ns_mac = $netscreen->ns_i_mac() || {};
|
||||
my $if_i_mac = $netscreen->SUPER::i_mac() || {};
|
||||
my $ns_i_map = $netscreen->_nsif_if_map();
|
||||
|
||||
my %i_mac = ();
|
||||
foreach my $iid ( keys %$ns_i_map ) {
|
||||
$i_mac{$iid} = $ns_mac->{$iid} || $if_i_mac->{ $ns_i_map->{$iid} };
|
||||
}
|
||||
|
||||
return \%i_mac;
|
||||
}
|
||||
|
||||
sub i_lastchange {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $if_i_lastchange = $netscreen->SUPER::i_lastchange() || {};
|
||||
my $ns_i_map = $netscreen->_nsif_if_map();
|
||||
my %i_lastchange;
|
||||
|
||||
foreach my $iid ( keys %$ns_i_map ) {
|
||||
$i_lastchange{$iid} = $if_i_lastchange->{ $ns_i_map->{$iid} };
|
||||
}
|
||||
return \%i_lastchange;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $netscreen = shift;
|
||||
return $netscreen->ns_i_up();
|
||||
}
|
||||
|
||||
sub i_up_admin {
|
||||
my $netscreen = shift;
|
||||
my $i_up = $netscreen->i_up();
|
||||
my $i_up_admin = $netscreen->SUPER::i_up_admin();
|
||||
my $ns_i_map = $netscreen->_nsif_if_map();
|
||||
my %i_up_admin;
|
||||
|
||||
foreach my $iid ( keys %$ns_i_map ) {
|
||||
$i_up_admin{$iid}
|
||||
= $i_up->{$iid} eq "up" && "up"
|
||||
|| $i_up_admin->{ $ns_i_map->{$iid} }
|
||||
|| 0;
|
||||
}
|
||||
return \%i_up_admin;
|
||||
}
|
||||
|
||||
sub i_type {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $if_i_type = $netscreen->SUPER::i_type() || {};
|
||||
my $ns_i_map = $netscreen->_nsif_if_map();
|
||||
my %i_type;
|
||||
|
||||
foreach my $iid ( keys %$ns_i_map ) {
|
||||
$i_type{$iid} = $if_i_type->{ $ns_i_map->{$iid} } || "tunnel";
|
||||
}
|
||||
return \%i_type;
|
||||
}
|
||||
|
||||
sub i_mtu {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $i_type = $netscreen->SUPER::i_mtu() || {};
|
||||
my $ns_i_map = $netscreen->_nsif_if_map();
|
||||
my %i_mtu;
|
||||
|
||||
foreach my $iid ( keys %$ns_i_map ) {
|
||||
$i_mtu{$iid} = $i_type->{ $ns_i_map->{$iid} };
|
||||
}
|
||||
return \%i_mtu;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
return;
|
||||
}
|
||||
|
||||
sub i_speed {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $i_speed = $netscreen->SUPER::i_speed();
|
||||
my $i_name = $netscreen->i_name();
|
||||
my $ns_i_map = $netscreen->_nsif_if_map;
|
||||
my %i_speed;
|
||||
|
||||
foreach my $iid ( keys %$ns_i_map ) {
|
||||
$i_speed{$iid}
|
||||
= $i_speed->{ $ns_i_map->{$iid} }
|
||||
|| $i_name->{$iid} =~ /tunnel/ && "vpn"
|
||||
|| 0;
|
||||
}
|
||||
return \%i_speed;
|
||||
}
|
||||
|
||||
sub _mac_map {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $arp_mac = $netscreen->nsIpArpMac() || {};
|
||||
|
||||
my %mac_map = ();
|
||||
foreach my $iid ( keys %$arp_mac ) {
|
||||
my $oid = join( ".", ( unpack( "C6", $arp_mac->{$iid} ) ) );
|
||||
$mac_map{$oid} = $iid;
|
||||
}
|
||||
return \%mac_map;
|
||||
}
|
||||
|
||||
# Interfaces can have two addresses, we want to capture both the network
|
||||
# address and the management address
|
||||
sub ip_index {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $ns_ip = $netscreen->ns_ip_table() || {};
|
||||
my $if_mng_ip = $netscreen->nsIfMngIp() || {};
|
||||
|
||||
my %ip_index = ();
|
||||
foreach my $iid ( keys %$ns_ip ) {
|
||||
$ip_index{ $ns_ip->{$iid} } = $iid if $ns_ip->{$iid} ne "0.0.0.0";
|
||||
}
|
||||
foreach my $iid ( keys %$if_mng_ip ) {
|
||||
$ip_index{ $if_mng_ip->{$iid} } = $iid
|
||||
if $if_mng_ip->{$iid} ne "0.0.0.0";
|
||||
}
|
||||
return \%ip_index;
|
||||
}
|
||||
|
||||
sub ip_table {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $ip_index = $netscreen->ip_index() || {};
|
||||
my $if_mng_ip = $netscreen->nsIfMngIp() || {};
|
||||
|
||||
my %ip_table = ();
|
||||
foreach my $iid ( keys %$ip_index ) {
|
||||
my $mgmt_ip = $if_mng_ip->{$iid};
|
||||
|
||||
if ( defined $mgmt_ip && $mgmt_ip ne '0.0.0.0' ) {
|
||||
$ip_table{$iid} = $mgmt_ip;
|
||||
}
|
||||
else {
|
||||
$ip_table{$iid} = $iid;
|
||||
}
|
||||
}
|
||||
return \%ip_table;
|
||||
}
|
||||
|
||||
# There is only one netmask for the interface both network and management
|
||||
# addresses should have the same netmask
|
||||
sub ip_netmask {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $ip_index = $netscreen->ip_index() || {};
|
||||
my $ns_netmask = $netscreen->ns_ip_netmask();
|
||||
|
||||
my %ip_netmask = ();
|
||||
foreach my $iid ( keys %$ip_index ) {
|
||||
$ip_netmask{$iid} = $ns_netmask->{ $ip_index->{$iid} };
|
||||
}
|
||||
return \%ip_netmask;
|
||||
}
|
||||
|
||||
sub fw_index {
|
||||
my $netscreen = shift;
|
||||
my %fw_index = ();
|
||||
my $arp_mac = $netscreen->nsIpArpMac() || {};
|
||||
|
||||
foreach my $iid ( keys %$arp_mac ) {
|
||||
my $oid = join( ".", ( unpack( "C6", $arp_mac->{$iid} ) ) );
|
||||
$fw_index{$iid} = $oid;
|
||||
}
|
||||
return \%fw_index;
|
||||
}
|
||||
|
||||
sub fw_mac {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $mac_map = $netscreen->_mac_map() || {};
|
||||
|
||||
my %fw_mac = ();
|
||||
foreach my $oid ( keys %$mac_map ) {
|
||||
my $mac
|
||||
= join( ":", ( map { sprintf "%lx", $_ } split( /\./, $oid ) ) );
|
||||
$fw_mac{$oid} = $mac;
|
||||
}
|
||||
return \%fw_mac;
|
||||
}
|
||||
|
||||
sub bp_index {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $if_info = $netscreen->nsIfInfo() || {};
|
||||
|
||||
my %bp_index = ();
|
||||
foreach my $iid ( keys %$if_info ) {
|
||||
$bp_index{ $if_info->{$iid} } = $iid;
|
||||
}
|
||||
return \%bp_index;
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $fw_index = $netscreen->fw_index();
|
||||
my $arp_if = $netscreen->nsIpArpIfIdx() || {};
|
||||
|
||||
my %fw_port;
|
||||
foreach my $iid ( keys %$arp_if ) {
|
||||
$fw_port{ $fw_index->{$iid} } = $arp_if->{$iid}
|
||||
if defined $fw_index->{$iid};
|
||||
}
|
||||
return \%fw_port;
|
||||
}
|
||||
|
||||
# need to remap from IF-MIB index to nsIf index
|
||||
sub i_ssidlist {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $i_ssidlist = $netscreen->SUPER::i_ssidlist() || {};
|
||||
my $ns_i_map = $netscreen->_if_nsif_map();
|
||||
|
||||
my %i_ssidlist;
|
||||
foreach my $iid ( keys %$i_ssidlist ) {
|
||||
$i_ssidlist{ $ns_i_map->{$iid} } = $i_ssidlist->{$iid};
|
||||
}
|
||||
return \%i_ssidlist;
|
||||
}
|
||||
|
||||
sub i_80211channel {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $i_80211channel = $netscreen->SUPER::i_80211channel() || {};
|
||||
my $ns_i_map = $netscreen->_if_nsif_map();
|
||||
|
||||
my %i_80211channel;
|
||||
foreach my $iid ( keys %$i_80211channel ) {
|
||||
$i_80211channel{ $ns_i_map->{$iid} } = $i_80211channel->{$iid};
|
||||
}
|
||||
return \%i_80211channel;
|
||||
}
|
||||
|
||||
sub at_index {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $std = $netscreen->ipNetToMediaIfIndex();
|
||||
return $std if (ref {} eq ref $std and scalar keys %$std);
|
||||
|
||||
return $netscreen->nsIpArpIfIdx();
|
||||
}
|
||||
|
||||
sub at_paddr {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $std = $netscreen->std_at_paddr();
|
||||
return $std if (ref {} eq ref $std and scalar keys %$std);
|
||||
|
||||
return $netscreen->ns_at_paddr();
|
||||
}
|
||||
|
||||
sub at_netaddr {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $std = $netscreen->ipNetToMediaNetAddress();
|
||||
return $std if (ref {} eq ref $std and scalar keys %$std);
|
||||
|
||||
return $netscreen->nsIpArpIp();
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
@@ -124,8 +537,10 @@ Kent Hamilton
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Netscreen device through SNMP. See inherited classes' documentation for
|
||||
inherited methods.
|
||||
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(...);
|
||||
|
||||
@@ -135,6 +550,8 @@ my $netscreen = new SNMP::Info::Layer3::Netscreen(...);
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::IEEE802dot11
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
@@ -149,9 +566,13 @@ my $netscreen = new SNMP::Info::Layer3::Netscreen(...);
|
||||
|
||||
=item F<NETSCREEN-SET-GEN-MIB>
|
||||
|
||||
=item Inherited Classes
|
||||
=item F<NETSCREEN-IP-ARP-MIB>
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> and its inherited classes.
|
||||
=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
|
||||
|
||||
@@ -161,9 +582,13 @@ 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 'netscreen'
|
||||
Returns C<'juniper'>
|
||||
|
||||
=item $netscreen->os()
|
||||
|
||||
@@ -175,7 +600,7 @@ Extracts the OS version from the description string.
|
||||
|
||||
=item $netscreen->serial()
|
||||
|
||||
Returns serial number..
|
||||
Returns serial number.
|
||||
|
||||
=back
|
||||
|
||||
@@ -185,8 +610,8 @@ Returns serial number..
|
||||
|
||||
=item $netscreen->layers()
|
||||
|
||||
Returns 01001100. Device doesn't report layers properly, modified to reflect
|
||||
Layer3 functionality.
|
||||
Returns 01001110. Device doesn't report layers properly, modified to reflect
|
||||
Layer 2 and 3 functionality.
|
||||
|
||||
=back
|
||||
|
||||
@@ -194,14 +619,193 @@ Layer3 functionality.
|
||||
|
||||
See L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::IEEE802dot11
|
||||
|
||||
See L<SNMP::Info::IEEE802dot11/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=head3 Interface Information
|
||||
|
||||
=over
|
||||
|
||||
=item $netscreen->interfaces()
|
||||
|
||||
Creates a map between the interface identifier (iid) and the physical port
|
||||
name.
|
||||
|
||||
Defaults to C<insIfDescr> if available, uses C<nsIfName> if not.
|
||||
|
||||
=item $netscreen->i_description()
|
||||
|
||||
Description of the interface. Uses C<insIfDescr> if available, C<nsIfName>
|
||||
if not.
|
||||
|
||||
=item $netscreen->i_ignore()
|
||||
|
||||
Returns without defining any interfaces to ignore.
|
||||
|
||||
=item $netscreen->i_index()
|
||||
|
||||
Default SNMP IID to Interface index.
|
||||
|
||||
(C<nsIfIndex>)
|
||||
|
||||
=item $netscreen->i_lastchange()
|
||||
|
||||
The value of C<sysUpTime> when this port last changed states (up,down),
|
||||
maps from C<ifIndex> to C<nsIfIndex>.
|
||||
|
||||
(C<ifLastChange>)
|
||||
|
||||
=item $netscreen->i_mac()
|
||||
|
||||
MAC address of the interface. Note this is just the MAC of the port, not
|
||||
anything connected to it. Uses C<nsIfMAC> if available, C<ifPhysAddress>
|
||||
if not.
|
||||
|
||||
=item $netscreen->i_mtu()
|
||||
|
||||
INTEGER. Interface MTU value, maps from C<ifIndex> to C<nsIfIndex>.
|
||||
|
||||
(C<ifMtu>)
|
||||
|
||||
=item $netscreen->i_name()
|
||||
|
||||
Interface Name field.
|
||||
|
||||
(C<nsIfName>)
|
||||
|
||||
=item $netscreen->i_speed()
|
||||
|
||||
Speed of the link, maps from C<ifIndex> to C<nsIfIndex>.
|
||||
|
||||
=item $netscreen->i_type()
|
||||
|
||||
Interface type. Maps from C<ifIndex> to C<nsIfIndex>.
|
||||
|
||||
(C<ifType>)
|
||||
|
||||
=item $netscreen->i_up()
|
||||
|
||||
Link Status of the interface. Typical values are 'up' and 'down'.
|
||||
|
||||
(C<nsIfStatus>)
|
||||
|
||||
=item $netscreen->i_up_admin()
|
||||
|
||||
Administrative status of the port. Checks both C<ifAdminStatus> and
|
||||
C<nsIfStatus>.
|
||||
|
||||
=back
|
||||
|
||||
=head3 IP Address Table
|
||||
|
||||
Each entry in this table is an IP address in use on this device.
|
||||
|
||||
=over
|
||||
|
||||
=item $netscreen->ip_index()
|
||||
|
||||
Maps the IP Table to the IID
|
||||
|
||||
=item $netscreen->ip_table()
|
||||
|
||||
Maps the Table to the IP address
|
||||
|
||||
(C<nsIfIp>)
|
||||
|
||||
=item $netscreen->ip_netmask()
|
||||
|
||||
Gives netmask setting for IP table entry.
|
||||
|
||||
(C<nsIfNetmask>)
|
||||
|
||||
=back
|
||||
|
||||
=head3 Forwarding Table
|
||||
|
||||
Uses C<nsIpArpTable> to emulate the forwarding table.
|
||||
|
||||
=over
|
||||
|
||||
=item $netscreen->fw_index()
|
||||
|
||||
Maps the Forwarding Table to the IID
|
||||
|
||||
=item $netscreen->fw_mac()
|
||||
|
||||
Returns reference to hash of forwarding table MAC Addresses.
|
||||
|
||||
=item $netscreen->fw_port()
|
||||
|
||||
Returns reference to hash of forwarding table entries port interface
|
||||
identifier (IID).
|
||||
|
||||
=item $netscreen->bp_index()
|
||||
|
||||
Returns reference to hash of bridge port table entries map back to interface
|
||||
identifier (IID).
|
||||
|
||||
=back
|
||||
|
||||
=head2 Arp Cache Table
|
||||
|
||||
=over
|
||||
|
||||
=item $netscreen->at_index()
|
||||
|
||||
Returns reference to hash. Maps ARP table entries to Interface IIDs
|
||||
|
||||
If the device doesn't support C<ipNetToMediaIfIndex>, this will try
|
||||
the proprietary C<nsIpArpIfIdx>.
|
||||
|
||||
=item $netscreen->at_paddr()
|
||||
|
||||
Returns reference to hash. Maps ARP table entries to MAC addresses.
|
||||
|
||||
If the device doesn't support C<ipNetToMediaPhysAddress>, this will try
|
||||
the proprietary C<nsIpArpMac>.
|
||||
|
||||
=item $netscreen->at_netaddr()
|
||||
|
||||
Returns reference to hash. Maps ARP table entries to IP addresses.
|
||||
|
||||
If the device doesn't support C<ipNetToMediaNetAddress>, this will try
|
||||
the proprietary C<nsIpArpIp>.
|
||||
|
||||
=back
|
||||
|
||||
=head3 Wireless Information
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->i_ssidlist()
|
||||
|
||||
Returns reference to hash. SSID's recognized by the radio interface.
|
||||
Remaps from C<ifIndex> to C<nsIfIndex>.
|
||||
|
||||
(C<dot11DesiredSSID>)
|
||||
|
||||
=item $dot11->i_80211channel()
|
||||
|
||||
Returns reference to hash. Current operating frequency channel of the radio
|
||||
interface. Remaps from C<ifIndex> to C<nsIfIndex>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::IEEE802dot11
|
||||
|
||||
See L<SNMP::Info::IEEE802dot11/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
404
Info/Layer3/Nexus.pm
Normal file
404
Info/Layer3/Nexus.pm
Normal file
@@ -0,0 +1,404 @@
|
||||
# SNMP::Info::Layer3::Nexus
|
||||
#
|
||||
# Copyright (c) 2014 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 warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3::CiscoSwitch;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
# NOTE : Top-most items gets precedence for @ISA
|
||||
@SNMP::Info::Layer3::Nexus::ISA = qw/
|
||||
SNMP::Info::Layer3::CiscoSwitch
|
||||
Exporter
|
||||
/;
|
||||
|
||||
@SNMP::Info::Layer3::Nexus::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.33';
|
||||
|
||||
# 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::CiscoSwitch::MIBS,
|
||||
'CISCO-ENTITY-VENDORTYPE-OID-MIB' => 'cevMIBObjects',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::CiscoSwitch::GLOBALS,
|
||||
'mac' => 'dot1dBaseBridgeAddress',
|
||||
);
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer3::CiscoSwitch::FUNCS, );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::CiscoSwitch::MUNGE, );
|
||||
|
||||
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 _get_snmpid_chassis {
|
||||
my $self = shift;
|
||||
|
||||
my $snmpid_chassis;
|
||||
my $position;
|
||||
|
||||
my $entity_entry = $self->e_class;
|
||||
for ( keys %$entity_entry ) {
|
||||
# filter by class, chassis is 3
|
||||
if ( $entity_entry->{$_} == 3 ) {
|
||||
print " SNMP::Info::Layer3::Nexus::_get_snmpid_chassis() - ",
|
||||
"chassis with id $_ found, position ",
|
||||
$self->snmpinfo->e_pos->{$_}
|
||||
if $self->debug();
|
||||
|
||||
# and if it's the topmost one
|
||||
if ( !defined $position
|
||||
|| $self->e_pos->{$_} < $position ) {
|
||||
$snmpid_chassis = $_;
|
||||
$position = $self->e_pos->{$_};
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( defined $snmpid_chassis && defined $position ) {
|
||||
print " SNMP::Info::Layer3::Nexus::_get_snmpid_chassis() - ",
|
||||
"chassis with id $snmpid_chassis, position $position selected";
|
||||
}
|
||||
else {
|
||||
print " SNMP::Info::Layer3::Nexus::_get_snmpid_chassis() - ",
|
||||
"no chassis found";
|
||||
}
|
||||
|
||||
return $snmpid_chassis;
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $nexus = shift;
|
||||
|
||||
my $snmpid_chassis = $nexus->_get_snmpid_chassis;
|
||||
|
||||
return $nexus->e_serial($snmpid_chassis)->{$snmpid_chassis}
|
||||
if defined $snmpid_chassis;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
# sysObjectID returns an IID to an entry in the CISCO-ENTITY-VENDORTYPE-OID-MIB.
|
||||
# Look it up and return it.
|
||||
sub model {
|
||||
my $nexus = shift;
|
||||
my $id = $nexus->id();
|
||||
|
||||
unless ( defined $id ) {
|
||||
print
|
||||
" SNMP::Info::Layer3::Nexus::model() - Device does not support sysObjectID\n"
|
||||
if $nexus->debug();
|
||||
return;
|
||||
}
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^cevChassis//i;
|
||||
return $model;
|
||||
}
|
||||
|
||||
# Reported version 6.x of NX-OS doesn't use the IPv4 address as index
|
||||
# override methods in ipAddrTable
|
||||
sub ip_table {
|
||||
my $nexus = shift;
|
||||
my $orig_ip_table = $nexus->orig_ip_table();
|
||||
|
||||
my %ip_table;
|
||||
foreach my $iid ( keys %$orig_ip_table ) {
|
||||
my $ip = $orig_ip_table->{$iid};
|
||||
next unless defined $ip;
|
||||
|
||||
$ip_table{$ip} = $ip;
|
||||
}
|
||||
|
||||
my $local_addrs = $nexus->_local_addr();
|
||||
foreach my $addr (keys %$local_addrs) {
|
||||
$ip_table{$addr} = $addr unless exists $ip_table{$addr};
|
||||
}
|
||||
|
||||
return \%ip_table;
|
||||
}
|
||||
|
||||
sub ip_index {
|
||||
my $nexus = shift;
|
||||
my $orig_ip_table = $nexus->orig_ip_table();
|
||||
my $orig_ip_index = $nexus->orig_ip_index();
|
||||
|
||||
my %ip_index;
|
||||
foreach my $iid ( keys %$orig_ip_table ) {
|
||||
my $ip = $orig_ip_table->{$iid};
|
||||
my $index = $orig_ip_index->{$iid};
|
||||
|
||||
next unless ( defined $ip && defined $index );
|
||||
|
||||
$ip_index{$ip} = $index;
|
||||
}
|
||||
|
||||
my $local_addrs = $nexus->_local_addr();
|
||||
foreach my $addr (keys %$local_addrs) {
|
||||
$ip_index{$addr} = 0 unless exists $ip_index{$addr};
|
||||
}
|
||||
|
||||
return \%ip_index;
|
||||
}
|
||||
|
||||
sub ip_netmask {
|
||||
my $nexus = shift;
|
||||
my $orig_ip_table = $nexus->orig_ip_table();
|
||||
my $orig_ip_netmask = $nexus->orig_ip_netmask();
|
||||
|
||||
my %ip_netmask;
|
||||
foreach my $iid ( keys %$orig_ip_table ) {
|
||||
my $ip = $orig_ip_table->{$iid};
|
||||
my $netmask = $orig_ip_netmask->{$iid};
|
||||
|
||||
next unless ( defined $ip && defined $netmask );
|
||||
|
||||
$ip_netmask{$ip} = $netmask;
|
||||
}
|
||||
|
||||
my $local_addrs = $nexus->_local_addr();
|
||||
foreach my $addr (keys %$local_addrs) {
|
||||
$ip_netmask{$addr} = $local_addrs->{$addr} unless exists $ip_netmask{$addr};
|
||||
}
|
||||
|
||||
return \%ip_netmask;
|
||||
}
|
||||
|
||||
sub ip_broadcast {
|
||||
my $nexus = shift;
|
||||
my $orig_ip_table = $nexus->orig_ip_table();
|
||||
my $orig_ip_broadcast = $nexus->orig_ip_broadcast();
|
||||
|
||||
my %ip_broadcast;
|
||||
foreach my $iid ( keys %$orig_ip_table ) {
|
||||
my $ip = $orig_ip_table->{$iid};
|
||||
my $broadcast = $orig_ip_broadcast->{$iid};
|
||||
|
||||
next unless ( defined $ip && defined $broadcast );
|
||||
|
||||
$ip_broadcast{$ip} = $broadcast;
|
||||
}
|
||||
|
||||
my $local_addrs = $nexus->_local_addr();
|
||||
foreach my $addr (keys %$local_addrs) {
|
||||
$ip_broadcast{$addr} = $addr unless exists $ip_broadcast{$addr};
|
||||
}
|
||||
|
||||
return \%ip_broadcast;
|
||||
}
|
||||
|
||||
sub _local_addr {
|
||||
my $nexus = shift;
|
||||
my $listen_addr = $nexus->udpLocalAddress() || {};
|
||||
my %local_addr;
|
||||
foreach my $sock (keys %$listen_addr) {
|
||||
my $addr = $listen_addr->{$sock};
|
||||
next if ($addr =~ /^127\./); # localhost
|
||||
next if ($addr eq '0.0.0.0'); # "any"
|
||||
next if ($addr =~ /^(\d+)\./ and $1 ge 224); # Class D or E space: Multicast or Experimental
|
||||
$local_addr{$addr} = '255.255.255.255'; # Fictional netmask
|
||||
}
|
||||
return \%local_addr;
|
||||
}
|
||||
|
||||
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::CiscoSwitch
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-ENTITY-VENDORTYPE-OID-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3::CiscoSwitch/"Required MIBs"> for its own MIB
|
||||
requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return a scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=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>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=head3 IP Address Table
|
||||
|
||||
Each entry in this table is an IP address in use on this device. Some
|
||||
versions do not index the table with the IPv4 address in accordance with
|
||||
the MIB definition, these overrides correct that behavior.
|
||||
|
||||
Also, the table is augmented with IP addresses in use by UDP sockets on the
|
||||
device, as determined by checking F<RFC1213-MIB::udpLocalAddress>. Valid
|
||||
addresses from this table (any IPv4 that is not localhost, 0.0.0.0, Class D
|
||||
(multicast) or Class E (experimental) are added as a /32 on interface ID 0.
|
||||
This is a workaround to determine possible VPC Keepalive IP addresses on the
|
||||
device, which are probably advertised by CDP/LLDP to neighbors.
|
||||
|
||||
=over
|
||||
|
||||
=item $nexus->ip_index()
|
||||
|
||||
Maps the IP Table to the IID
|
||||
|
||||
(C<ipAdEntIfIndex>)
|
||||
|
||||
=item $nexus->ip_table()
|
||||
|
||||
Maps the Table to the IP address
|
||||
|
||||
(C<ipAdEntAddr>)
|
||||
|
||||
=item $nexus->ip_netmask()
|
||||
|
||||
Gives netmask setting for IP table entry.
|
||||
|
||||
(C<ipAdEntNetMask>)
|
||||
|
||||
=item $nexus->ip_broadcast()
|
||||
|
||||
Gives broadcast address for IP table entry.
|
||||
|
||||
(C<ipAdEntBcastAddr>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3::CiscoSwitch
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"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::CiscoSwitch
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"TABLE METHODS"> for
|
||||
details.
|
||||
|
||||
=cut
|
||||
240
Info/Layer3/PacketFront.pm
Normal file
240
Info/Layer3/PacketFront.pm
Normal file
@@ -0,0 +1,240 @@
|
||||
# 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.33';
|
||||
|
||||
%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;
|
||||
}
|
||||
|
||||
sub layers {
|
||||
my $pfront = shift;
|
||||
|
||||
my $layers = $pfront->SUPER::layers();
|
||||
# Some models or softwware versions don't report L2 properly
|
||||
# so add L2 capability to the output if the device has bridge ports.
|
||||
my $bports = $pfront->b_ports();
|
||||
|
||||
if ($bports) {
|
||||
my $l = substr $layers, 6, 1, "1";
|
||||
}
|
||||
|
||||
return $layers;
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
=item $pfront->layers()
|
||||
|
||||
L2 capability isn't always reported correctly by the device itself; what the
|
||||
device reports is augmented with L2 capability if the device has bridge ports.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3> for details.
|
||||
|
||||
|
||||
=cut
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user