author | Tero Marttila <terom@paivola.fi> |
Mon, 17 Mar 2014 15:51:08 +0200 | |
changeset 381 | 6fe465ce6d52 |
parent 380 | 78f192fe9e2c |
child 382 | ba47a64f61f9 |
permissions | -rw-r--r-- |
380
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
1 |
#!/usr/bin/env python |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
2 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
3 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
4 |
Requirements: |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
5 |
pysnmp |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
6 |
pysnmp-mibs |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
7 |
memoized-property |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
8 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
9 |
Setup: |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
10 |
./opt/bin/build-pysnmp-mib -o usr/mibs/LLDP-MIB.py etc/mibs/LLDP-MIB |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
11 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
12 |
Run: |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
13 |
PYSNMP_MIB_DIRS=usr/mibs/ ./opt/bin/python ... |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
14 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
15 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
16 |
import pvl.args |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
17 |
import pvl.hosts |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
18 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
19 |
import logging; log = logging.getLogger('pvl.hosts-snmp') |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
20 |
import optparse |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
21 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
22 |
from pysnmp.entity.rfc3413.oneliner import cmdgen as pysnmp |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
23 |
import collections |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
24 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
25 |
class SNMPError (Exception) : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
26 |
pass |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
27 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
28 |
class SNMPEngineError (SNMPError) : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
29 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
30 |
Internal SNMP Engine error (?) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
31 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
32 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
33 |
class SNMPAgent (object) : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
34 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
35 |
GET SNMP shit from a remote host. |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
36 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
37 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
38 |
SNMP_PORT = 161 |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
39 |
snmp_cmdgen = pysnmp.CommandGenerator() |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
40 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
41 |
@classmethod |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
42 |
def apply (cls, options, host) : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
43 |
community = options.snmp_community |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
44 |
port = cls.SNMP_PORT |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
45 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
46 |
if '@' in host : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
47 |
community, host = host.split('@', 1) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
48 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
49 |
if ':' in host : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
50 |
host, port = host.rsplit(':', 1) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
51 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
52 |
return cls( |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
53 |
pysnmp.CommunityData(community), |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
54 |
pysnmp.UdpTransportTarget((host, port)) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
55 |
) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
56 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
57 |
def __init__ (self, security, transport) : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
58 |
self.security = security |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
59 |
self.transport = transport |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
60 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
61 |
def get (self, *request) : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
62 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
63 |
request = ( |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
64 |
pysnmp.MibVariable('IF-MIB', 'ifInOctets', 1), |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
65 |
) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
66 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
67 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
68 |
opts = dict( |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
69 |
lookupNames = True, |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
70 |
lookupValues = True, |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
71 |
) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
72 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
73 |
try : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
74 |
error, error_status, error_index, response = self.snmp_cmdgen.getCmd(self.security, self.transport, *request, **opts) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
75 |
except pysnmp.error.PySnmpError as ex : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
76 |
raise SNMPEngineError(ex) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
77 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
78 |
if error : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
79 |
raise SNMPEngineError(error) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
80 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
81 |
if error_status : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
82 |
raise SNMPError(errorStatus.prettyPrint()) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
83 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
84 |
return response |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
85 |
#for name, value in response : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
86 |
# yield name.getMibSymbol(), value.prettyPrint() |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
87 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
88 |
def walk (self, *request) : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
89 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
90 |
request = ( |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
91 |
pysnmp.MibVariable('IF-MIB', 'ifInOctets'), |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
92 |
) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
93 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
94 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
95 |
opts = dict( |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
96 |
lookupNames = True, |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
97 |
lookupValues = True, |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
98 |
) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
99 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
100 |
try : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
101 |
error, error_status, error_index, responses = self.snmp_cmdgen.nextCmd(self.security, self.transport, *request, **opts) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
102 |
except pysnmp.error.PySnmpError as ex : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
103 |
raise SNMPEngineError(ex) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
104 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
105 |
if error : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
106 |
raise SNMPEngineError(error) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
107 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
108 |
if error_status : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
109 |
raise SNMPError(errorStatus.prettyPrint()) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
110 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
111 |
return responses |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
112 |
#for response in responses: |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
113 |
# for name, value in response : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
114 |
# yield name.getMibSymbol(), value.prettyPrint() |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
115 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
116 |
def table (self, table) : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
117 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
118 |
Load a simple table with a running index. |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
119 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
120 |
Given [(attr, oid, type)] yields { attr: type(value) } |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
121 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
122 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
123 |
data = collections.defaultdict(dict) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
124 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
125 |
for row in self.walk(*[oid for attr, oid, type in table]) : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
126 |
log.debug("%s", row) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
127 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
128 |
for (attr, type), (field, value) in zip([(attr, type) for attr, oid, type in table], row) : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
129 |
mib, sym, idx = field.getMibSymbol() |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
130 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
131 |
# convert |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
132 |
if type : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
133 |
value = type(value) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
134 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
135 |
log.debug("%s::%s.%s: %s: %s", mib, sym, idx, attr, value) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
136 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
137 |
data[idx][attr] = value |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
138 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
139 |
return data.items() |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
140 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
141 |
from memoized_property import memoized_property |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
142 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
143 |
def macaddr (value) : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
144 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
145 |
Excepts a MAC address from an SNMP OctetString. |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
146 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
147 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
148 |
return ':'.join('{octet:02x}'.format(octet=c) for c in value.asNumbers()) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
149 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
150 |
class LLDPAgent (SNMPAgent) : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
151 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
152 |
Query LLDP info from a remote agent. |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
153 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
154 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
155 |
LOCAL = ( |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
156 |
( 'chassis_id', pysnmp.MibVariable('LLDP-MIB', 'lldpLocChassisId'), macaddr ), |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
157 |
( 'sys_name', pysnmp.MibVariable('LLDP-MIB', 'lldpLocSysName'), str ), |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
158 |
) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
159 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
160 |
@memoized_property |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
161 |
def local (self) : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
162 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
163 |
Describe the local system. |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
164 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
165 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
166 |
for idx, data in self.table(self.LOCAL) : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
167 |
return data |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
168 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
169 |
PORTS = ( |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
170 |
( 'port_id', pysnmp.MibVariable('LLDP-MIB', 'lldpLocPortId'), str ), |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
171 |
) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
172 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
173 |
@memoized_property |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
174 |
def ports (self) : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
175 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
176 |
Describe the local ports. |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
177 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
178 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
179 |
ports = { } |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
180 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
181 |
for idx, data in self.table(self.PORTS) : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
182 |
port, = idx |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
183 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
184 |
ports[int(port)] = data |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
185 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
186 |
return ports |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
187 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
188 |
def port (self, port) : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
189 |
return self.ports[port] |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
190 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
191 |
REMOTE_DATA = ( |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
192 |
( 'chassis_id', pysnmp.MibVariable('LLDP-MIB', 'lldpRemChassisId'), macaddr ), |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
193 |
( 'sys_name', pysnmp.MibVariable('LLDP-MIB', 'lldpRemSysName'), str ), |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
194 |
( 'remote_port', pysnmp.MibVariable('LLDP-MIB', 'lldpRemPortId'), str ), |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
195 |
) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
196 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
197 |
def remotes (self) : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
198 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
199 |
Describe remote systems, indexed by local port. |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
200 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
201 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
202 |
for idx, data in self.table(self.REMOTE_DATA) : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
203 |
time, port, idx = idx |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
204 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
205 |
yield int(port), data |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
206 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
207 |
def main (argv) : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
208 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
209 |
SNMP polling. |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
210 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
211 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
212 |
parser = optparse.OptionParser(main.__doc__) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
213 |
parser.add_option_group(pvl.args.parser(parser)) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
214 |
#parser.add_option_group(pvl.hosts.optparser(parser)) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
215 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
216 |
parser.add_option('--snmp-community', |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
217 |
help="SNMPv2 read community") |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
218 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
219 |
options, args = parser.parse_args(argv[1:]) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
220 |
pvl.args.apply(options) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
221 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
222 |
# input |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
223 |
#hosts = pvl.hosts.apply(options, args) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
224 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
225 |
for arg in args : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
226 |
lldp = LLDPAgent.apply(options, arg) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
227 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
228 |
print arg, "{chassis_id}({sys_name})".format(**lldp.local) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
229 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
230 |
for port, remote in lldp.remotes() : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
231 |
print '\t', lldp.port(port), remote |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
232 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
233 |
if __name__ == '__main__': |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
234 |
pvl.args.main(main) |