author | Tero Marttila <terom@paivola.fi> |
Sun, 07 Sep 2014 14:21:56 +0300 | |
changeset 424 | e77e967d59b0 |
parent 397 | 8455f42d8926 |
permissions | -rw-r--r-- |
395
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
1 |
""" |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
2 |
Requirements: |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
3 |
memoized-property |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
4 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
5 |
Setup: |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
6 |
./opt/bin/build-pysnmp-mib -o usr/mibs/BRIDGE-MIB.py etc/mibs/rfc1493.mib |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
7 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
8 |
Run: |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
9 |
PYSNMP_MIB_DIRS=usr/mibs/ ./opt/bin/python ... |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
10 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
11 |
SNMP: |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
12 |
BRIDGE-MIB::dot1dTpFdbTable |
397
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
13 |
Q-BRIDGE-MIB::dot1qTpFdbTable |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
14 |
Q-BRIDGE-MIB::dot1qVlanCurrentTable |
395
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
15 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
16 |
""" |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
17 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
18 |
from pvl.snmp import snmp |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
19 |
from pvl.snmp.snmp import pysnmp |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
20 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
21 |
from memoized_property import memoized_property |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
22 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
23 |
import logging; log = logging.getLogger('pvl.snmp.vlan') |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
24 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
25 |
DOT1D_TP_AGING_TIME = pysnmp.MibVariable('BRIDGE-MIB', 'dot1dTpAgingTime', 0) |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
26 |
DOT1D_TP_FDB_PORT = pysnmp.MibVariable('BRIDGE-MIB', 'dot1dTpFdbPort') |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
27 |
|
397
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
28 |
DOT1Q_VLAN_FDB_ID = pysnmp.MibVariable('Q-BRIDGE-MIB', 'dot1qVlanFdbId') # [dot1qVlanIndex] |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
29 |
|
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
30 |
DOT1Q_TP_FDB_PORT = pysnmp.MibVariable('Q-BRIDGE-MIB', 'dot1qTpFdbPort') # [dot1qFdbId, dot1qTpFdbAddress] |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
31 |
|
395
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
32 |
def macaddr (value) : |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
33 |
""" |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
34 |
Excepts a MAC address from an SNMP OctetString. |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
35 |
""" |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
36 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
37 |
return ':'.join('{octet:02x}'.format(octet=c) for c in value.asNumbers()) |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
38 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
39 |
class BridgeAgent (snmp.SNMPAgent) : |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
40 |
""" |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
41 |
Query Bridge configuration. |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
42 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
43 |
XXX: this is not VLAN-aware! |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
44 |
""" |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
45 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
46 |
def ping (self) : |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
47 |
for name, value in self.get(DOT1D_TP_AGING_TIME) : |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
48 |
# XXX: ???? |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
49 |
if value.tagSet == pysnmp.rfc1905.NoSuchInstance.tagSet : |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
50 |
continue |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
51 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
52 |
return True |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
53 |
|
397
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
54 |
def fdb_ports (self) : |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
55 |
""" |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
56 |
Map hosts in the brige FDB to specific ports. |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
57 |
""" |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
58 |
|
395
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
59 |
for idx, data in self.table(DOT1D_TP_FDB_PORT) : |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
60 |
addr, = idx |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
61 |
port = data[DOT1D_TP_FDB_PORT] |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
62 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
63 |
yield macaddr(addr), int(port) |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
64 |
|
397
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
65 |
def vlan_fdb (self) : |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
66 |
""" |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
67 |
Get FDB id -> vlan mappings. |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
68 |
|
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
69 |
(fdb, vlan) |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
70 |
""" |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
71 |
|
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
72 |
for idx, data in self.table(DOT1Q_VLAN_FDB_ID) : |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
73 |
time, vlan = idx |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
74 |
fdb = int(data[DOT1Q_VLAN_FDB_ID]) |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
75 |
|
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
76 |
yield fdb, vlan |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
77 |
|
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
78 |
def vlan_fdb_ports (self) : |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
79 |
""" |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
80 |
Get per-vlan host -> port mappings. |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
81 |
|
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
82 |
(macaddr, port, vlan) |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
83 |
""" |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
84 |
|
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
85 |
fdb_to_vlan = dict(self.vlan_fdb()) |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
86 |
|
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
87 |
for idx, data in self.table(DOT1Q_TP_FDB_PORT) : |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
88 |
fdb, addr = idx |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
89 |
port = data[DOT1Q_TP_FDB_PORT] |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
90 |
|
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
91 |
vlan = fdb_to_vlan.get(fdb) |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
92 |
|
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
93 |
yield macaddr(addr), int(port), vlan |
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
94 |
|
8455f42d8926
pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
95 |
|
395
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
96 |
if __name__ == '__main__': |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
97 |
import doctest |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
98 |
doctest.testmod() |