author | Tero Marttila <terom@paivola.fi> |
Tue, 10 Mar 2015 00:11:43 +0200 | |
changeset 739 | 5149c39f3dfc |
parent 396 | dea2635763e6 |
permissions | -rw-r--r-- |
390
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
1 |
""" |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
2 |
Requirements: |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
3 |
memoized-property |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
4 |
|
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
5 |
Setup: |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
6 |
./opt/bin/build-pysnmp-mib -o usr/mibs/Q-BRIDGE-MIB.py etc/mibs/rfc2674_q.mib |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
7 |
|
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
8 |
Run: |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
9 |
PYSNMP_MIB_DIRS=usr/mibs/ ./opt/bin/python ... |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
10 |
|
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
11 |
SNMP: |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
12 |
Q-BRIDGE-MIB::dot1qVlanCurrentTable |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
13 |
|
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
14 |
""" |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
15 |
|
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
16 |
from pvl.snmp import snmp |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
17 |
from pvl.snmp.snmp import pysnmp |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
18 |
|
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
19 |
from memoized_property import memoized_property |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
20 |
|
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
21 |
import logging; log = logging.getLogger('pvl.snmp.vlan') |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
22 |
|
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
23 |
DOT1Q_NUM_VLANS = pysnmp.MibVariable('Q-BRIDGE-MIB', 'dot1qNumVlans') |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
24 |
DOT1Q_VLAN_CURRENT_EGRESS_PORTS = pysnmp.MibVariable('Q-BRIDGE-MIB', 'dot1qVlanCurrentEgressPorts') |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
25 |
DOT1Q_VLAN_CURRENT_UNTAGGED_PORTS = pysnmp.MibVariable('Q-BRIDGE-MIB', 'dot1qVlanCurrentUntaggedPorts') |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
26 |
DOT1Q_VLAN_STATIC_NAME = pysnmp.MibVariable('Q-BRIDGE-MIB', 'dot1qVlanStaticName') |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
27 |
|
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
28 |
def portlist (value) : |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
29 |
r""" |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
30 |
Unpack a OctetString bitmask into bit offsets. |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
31 |
|
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
32 |
>>> list(portlist('\x80')) |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
33 |
[1] |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
34 |
>>> list(portlist('\x01')) |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
35 |
[8] |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
36 |
""" |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
37 |
|
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
38 |
for octet_idx, byte in enumerate(value) : |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
39 |
octet = ord(byte) |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
40 |
|
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
41 |
for bit_idx in xrange(0, 8) : |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
42 |
if octet & (1 << (7 - bit_idx)) : |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
43 |
yield octet_idx * 8 + bit_idx + 1 |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
44 |
|
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
45 |
class VLANAgent (snmp.SNMPAgent) : |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
46 |
""" |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
47 |
Query VLAN configuration. |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
48 |
""" |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
49 |
|
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
50 |
@memoized_property |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
51 |
def count (self) : |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
52 |
for name, value in self.get(DOT1Q_NUM_VLANS) : |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
53 |
# XXX: ???? |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
54 |
if value.tagSet == pysnmp.rfc1905.NoSuchInstance.tagSet : |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
55 |
continue |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
56 |
|
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
57 |
return int(value) |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
58 |
|
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
59 |
def names (self) : |
396
dea2635763e6
pvl.snmp.vlan: fixup names() and vlan_ports()
Tero Marttila <terom@paivola.fi>
parents:
390
diff
changeset
|
60 |
""" |
dea2635763e6
pvl.snmp.vlan: fixup names() and vlan_ports()
Tero Marttila <terom@paivola.fi>
parents:
390
diff
changeset
|
61 |
(vlan, name) |
dea2635763e6
pvl.snmp.vlan: fixup names() and vlan_ports()
Tero Marttila <terom@paivola.fi>
parents:
390
diff
changeset
|
62 |
""" |
dea2635763e6
pvl.snmp.vlan: fixup names() and vlan_ports()
Tero Marttila <terom@paivola.fi>
parents:
390
diff
changeset
|
63 |
|
390
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
64 |
for idx, data in self.table(DOT1Q_VLAN_STATIC_NAME) : |
396
dea2635763e6
pvl.snmp.vlan: fixup names() and vlan_ports()
Tero Marttila <terom@paivola.fi>
parents:
390
diff
changeset
|
65 |
vlan, = idx |
390
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
66 |
|
396
dea2635763e6
pvl.snmp.vlan: fixup names() and vlan_ports()
Tero Marttila <terom@paivola.fi>
parents:
390
diff
changeset
|
67 |
yield int(vlan), str(data[DOT1Q_VLAN_STATIC_NAME]) |
dea2635763e6
pvl.snmp.vlan: fixup names() and vlan_ports()
Tero Marttila <terom@paivola.fi>
parents:
390
diff
changeset
|
68 |
|
dea2635763e6
pvl.snmp.vlan: fixup names() and vlan_ports()
Tero Marttila <terom@paivola.fi>
parents:
390
diff
changeset
|
69 |
def vlan_ports (self) : |
dea2635763e6
pvl.snmp.vlan: fixup names() and vlan_ports()
Tero Marttila <terom@paivola.fi>
parents:
390
diff
changeset
|
70 |
""" |
dea2635763e6
pvl.snmp.vlan: fixup names() and vlan_ports()
Tero Marttila <terom@paivola.fi>
parents:
390
diff
changeset
|
71 |
Get per-vlan port configs. |
dea2635763e6
pvl.snmp.vlan: fixup names() and vlan_ports()
Tero Marttila <terom@paivola.fi>
parents:
390
diff
changeset
|
72 |
|
dea2635763e6
pvl.snmp.vlan: fixup names() and vlan_ports()
Tero Marttila <terom@paivola.fi>
parents:
390
diff
changeset
|
73 |
(vlan, (tagged, untagged)) |
dea2635763e6
pvl.snmp.vlan: fixup names() and vlan_ports()
Tero Marttila <terom@paivola.fi>
parents:
390
diff
changeset
|
74 |
""" |
dea2635763e6
pvl.snmp.vlan: fixup names() and vlan_ports()
Tero Marttila <terom@paivola.fi>
parents:
390
diff
changeset
|
75 |
|
390
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
76 |
for idx, data in self.table(DOT1Q_VLAN_CURRENT_EGRESS_PORTS, DOT1Q_VLAN_CURRENT_UNTAGGED_PORTS) : |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
77 |
time, vlan = idx |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
78 |
|
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
79 |
egress = set(portlist(data[DOT1Q_VLAN_CURRENT_EGRESS_PORTS])) |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
80 |
untagged = set(portlist(data[DOT1Q_VLAN_CURRENT_UNTAGGED_PORTS])) |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
81 |
|
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
82 |
tagged = egress - untagged |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
83 |
|
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
84 |
yield int(vlan), (tagged, untagged) |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
85 |
|
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
86 |
if __name__ == '__main__': |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
87 |
import doctest |
e72f78b8bce4
pvl.snmp.vlan: read switch VLAN configuration over SNMP
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
88 |
doctest.testmod() |