author | Tero Marttila <terom@paivola.fi> |
Mon, 09 Mar 2015 23:31:13 +0200 | |
changeset 738 | 3104fdf7ea26 |
parent 407 | 3197d049f345 |
permissions | -rwxr-xr-x |
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 |
import pvl.args |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
4 |
import pvl.hosts |
395
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
5 |
from pvl.snmp import snmp, lldp, vlan, bridge |
380
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
6 |
|
399
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
7 |
import collections |
384
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
8 |
import logging; log = logging.getLogger('pvl.hosts-lldp') |
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
9 |
import optparse |
382
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
10 |
|
391
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
11 |
def hosts_snmp (options, hosts) : |
382
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
12 |
""" |
391
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
13 |
Discover SNMP-supporting hosts. |
382
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
14 |
|
391
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
15 |
Yields Host, snmpdata |
382
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
16 |
""" |
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
17 |
|
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
18 |
for host in hosts : |
384
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
19 |
host_snmp = host.extensions.get('snmp') |
382
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
20 |
|
384
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
21 |
if not host_snmp : |
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
22 |
log.debug("%s: skip non-snmp host", host) |
382
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
23 |
continue |
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
24 |
|
384
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
25 |
elif host.down : |
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
26 |
log.debug("%s: skip down host", host) |
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
27 |
continue |
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
28 |
|
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
29 |
else : |
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
30 |
log.debug("%s: %s", host, host_snmp) |
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
31 |
|
391
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
32 |
yield host, host_snmp |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
33 |
|
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
34 |
def hosts_lldp (options, hosts) : |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
35 |
""" |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
36 |
Discover LLDP-supporting hosts. |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
37 |
|
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
38 |
Yields Host, LLDPAgent |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
39 |
""" |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
40 |
|
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
41 |
for host, host_snmp in hosts_snmp(options, hosts) : |
384
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
42 |
agent = lldp.LLDPAgent.apply(options, host.fqdn(), community=host_snmp.get('community')) |
382
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
43 |
|
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
44 |
try : |
384
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
45 |
local = agent.local |
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
46 |
except snmp.SNMPError as ex : |
382
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
47 |
log.warning("%s: %s", host, ex) |
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
48 |
continue |
398
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
49 |
|
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
50 |
if not local : |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
51 |
log.info("%s: no lldp support", host) |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
52 |
continue |
382
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
53 |
|
384
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
54 |
log.info("%s: %s", host, local) |
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
55 |
|
382
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
56 |
if local['sys_name'] != host.host : |
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
57 |
log.warning("%s: SNMP sys_name mismatch: %s", host, local['sys_name']) |
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
58 |
|
384
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
59 |
yield host, agent |
382
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
60 |
|
391
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
61 |
def hosts_vlan (options, hosts) : |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
62 |
""" |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
63 |
Discover VLAN-supporting hosts. |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
64 |
|
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
65 |
Yields Host, VLANAgent |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
66 |
""" |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
67 |
|
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
68 |
for host, host_snmp in hosts_snmp(options, hosts) : |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
69 |
agent = vlan.VLANAgent.apply(options, host.fqdn(), community=host_snmp.get('community')) |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
70 |
|
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
71 |
try : |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
72 |
count = agent.count |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
73 |
except snmp.SNMPError as ex : |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
74 |
log.warning("%s: %s", host, ex) |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
75 |
continue |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
76 |
|
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
77 |
log.info("%s: %s", host, count) |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
78 |
|
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
79 |
yield host, agent |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
80 |
|
395
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
81 |
def hosts_bridge (options, hosts) : |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
82 |
""" |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
83 |
Discover Bridge-supporting hosts. |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
84 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
85 |
Yields Host, BridgeAgent |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
86 |
""" |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
87 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
88 |
for host, host_snmp in hosts_snmp(options, hosts) : |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
89 |
agent = bridge.BridgeAgent.apply(options, host.fqdn(), community=host_snmp.get('community')) |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
90 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
91 |
try : |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
92 |
agent.ping() |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
93 |
except snmp.SNMPError as ex : |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
94 |
log.warning("%s: %s", host, ex) |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
95 |
continue |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
96 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
97 |
log.info("%s", host) |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
98 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
99 |
yield host, agent |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
100 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
101 |
|
382
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
102 |
def apply_hosts_lldp (options, hosts) : |
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
103 |
""" |
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
104 |
Query host LLDP info. |
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
105 |
""" |
384
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
106 |
|
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
107 |
# second pass to discver links |
399
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
108 |
for host, agent in hosts_lldp(options, hosts) : |
398
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
109 |
try : |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
110 |
remotes = list(agent.remotes()) |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
111 |
except snmp.SNMPError as ex : |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
112 |
log.warn("%s: broken lldp remotes: %s", host, ex) |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
113 |
continue |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
114 |
|
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
115 |
for port, remote in remotes : |
384
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
116 |
port = agent.port(port) |
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
117 |
|
399
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
118 |
log.info("%s: %s: %s", host, port, remote) |
382
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
119 |
|
399
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
120 |
yield host, agent.local, port, remote |
391
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
121 |
|
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
122 |
def apply_hosts_vlan (options, hosts) : |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
123 |
""" |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
124 |
Query host VLAN ports. |
395
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
125 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
126 |
Yields host, { port: (untagged, [tagged]) } |
391
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
127 |
""" |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
128 |
|
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
129 |
_hosts_vlan = list(hosts_vlan(options, hosts)) |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
130 |
|
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
131 |
for host, agent in _hosts_vlan : |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
132 |
# only one untagged vlan / port |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
133 |
vlan_untagged = { } |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
134 |
|
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
135 |
# multiple taggd vlans / port |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
136 |
vlan_tagged = collections.defaultdict(set) |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
137 |
|
398
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
138 |
for vlan, (tagged, untagged) in agent.vlan_ports() : |
391
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
139 |
log.info("%s: %s: %s + %s", host, vlan, tagged, untagged) |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
140 |
|
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
141 |
for port in tagged : |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
142 |
vlan_tagged[port].add(vlan) |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
143 |
|
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
144 |
for port in untagged : |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
145 |
if port in vlan_untagged : |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
146 |
log.warning("%s: duplicate untagged vlan %s for port %s on vlan %s", host, vlan, port, vlan_untagged[port]) |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
147 |
|
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
148 |
vlan_untagged[port] = vlan |
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
149 |
|
399
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
150 |
for port in set(vlan_untagged) | set(vlan_tagged) : |
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
151 |
yield host, port, vlan_untagged.get(port), tuple(vlan_tagged[port]) |
391
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
152 |
|
395
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
153 |
def apply_hosts_bridge (options, hosts) : |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
154 |
""" |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
155 |
Query host bridge tables. |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
156 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
157 |
Yields host, { port: (macs) } |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
158 |
""" |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
159 |
|
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
160 |
for host, agent in hosts_bridge(options, hosts) : |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
161 |
ports = collections.defaultdict(list) |
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
162 |
|
398
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
163 |
try : |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
164 |
vlan_fdb_ports = list(agent.vlan_fdb_ports()) |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
165 |
except snmp.SNMPError as ex : |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
166 |
log.warn("%s: broken dot1q fdb: %s", host, ex) |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
167 |
continue |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
168 |
|
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
169 |
if vlan_fdb_ports : |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
170 |
log.info("%s: have dot1q ports", host) |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
171 |
|
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
172 |
for ether, port, vlan in agent.vlan_fdb_ports() : |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
173 |
if not port : |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
174 |
# XXX: unknown? |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
175 |
continue |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
176 |
|
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
177 |
ports[(port, vlan)].append(ether) |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
178 |
else : |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
179 |
try : |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
180 |
fdb_ports = list(agent.fdb_ports()) |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
181 |
except snmp.SNMPError as ex : |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
182 |
log.warn("%s: broken dot1q fdb: %s", host, ex) |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
183 |
continue |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
184 |
|
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
185 |
# fallback to dot1d fdb |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
186 |
log.info("%s: fallback to dot1d", host) |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
187 |
|
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
188 |
for ether, port in agent.fdb_ports() : |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
189 |
if not port : |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
190 |
# XXX: unknown? |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
191 |
continue |
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
192 |
|
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
193 |
ports[(port, None)].append(ether) |
387
75158fd28784
pvl.hosts-lldp: --graph-dot support
Tero Marttila <terom@paivola.fi>
parents:
386
diff
changeset
|
194 |
|
399
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
195 |
for (port, vlan), ethers in ports.iteritems() : |
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
196 |
yield host, vlan, port, ethers |
387
75158fd28784
pvl.hosts-lldp: --graph-dot support
Tero Marttila <terom@paivola.fi>
parents:
386
diff
changeset
|
197 |
|
399
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
198 |
def apply_hosts (options, hosts) : |
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
199 |
""" |
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
200 |
Gather data on given hosts... |
391
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
201 |
|
399
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
202 |
(host, key, value) |
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
203 |
""" |
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
204 |
|
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
205 |
if options.scan or options.scan_lldp : |
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
206 |
# discover node/port graph |
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
207 |
for host, local, port, remote in apply_hosts_lldp(options, hosts) : |
401
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
208 |
# XXX: duplicates galore |
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
209 |
yield host, ('lldp', 'local'), { |
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
210 |
'chassis': local['chassis'], |
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
211 |
'sys_name': local['sys_name'], |
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
212 |
} |
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
213 |
|
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
214 |
# XXX: duplicates galore |
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
215 |
yield host, ('lldp', 'port', port['port_id'], 'local'), { |
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
216 |
'port': port['port'], |
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
217 |
} |
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
218 |
|
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
219 |
yield host, ('lldp', 'port', port['port_id'], 'remote', remote['chassis']), { |
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
220 |
'sys_name': remote['sys_name'], |
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
221 |
'port': remote['port'], |
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
222 |
} |
399
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
223 |
|
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
224 |
if options.scan or options.scan_vlan : |
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
225 |
# discover vlan ports |
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
226 |
for host, port, untag, tagged in apply_hosts_vlan(options, hosts) : |
391
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
227 |
if untag : |
401
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
228 |
yield host, ('vlan', untag, 'untagged'), set((port, )) |
387
75158fd28784
pvl.hosts-lldp: --graph-dot support
Tero Marttila <terom@paivola.fi>
parents:
386
diff
changeset
|
229 |
|
401
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
230 |
for tag in tagged : |
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
231 |
yield host, ('vlan', tag, 'tagged'), set((port, )) |
399
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
232 |
|
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
233 |
if options.scan or options.scan_bridge : |
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
234 |
# discover edge nodes |
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
235 |
for host, vlan, port, ethers in apply_hosts_bridge(options, hosts) : |
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
236 |
if vlan : |
401
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
237 |
yield host, ('vlan', vlan, 'bridge', port), set(ethers) |
399
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
238 |
else : |
401
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
239 |
yield host, ('bridge', port), set(ethers) |
387
75158fd28784
pvl.hosts-lldp: --graph-dot support
Tero Marttila <terom@paivola.fi>
parents:
386
diff
changeset
|
240 |
|
380
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
241 |
def main (argv) : |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
242 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
243 |
SNMP polling. |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
244 |
""" |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
245 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
246 |
parser = optparse.OptionParser(main.__doc__) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
247 |
parser.add_option_group(pvl.args.parser(parser)) |
382
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
248 |
parser.add_option_group(pvl.hosts.optparser(parser)) |
384
caa3dbbdbe83
split upt pvl.hosts-lldp into pvl.snmp.snmp and pvl.snmp.lldp, match remote hosts, better formatting
Tero Marttila <terom@paivola.fi>
parents:
382
diff
changeset
|
249 |
parser.add_option_group(pvl.snmp.snmp.options(parser)) |
380
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
250 |
|
399
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
251 |
parser.add_option('--scan', action='store_true') |
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
252 |
parser.add_option('--scan-lldp', action='store_true') |
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
253 |
parser.add_option('--scan-vlan', action='store_true') |
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
254 |
parser.add_option('--scan-bridge', action='store_true') |
393
8321a569d5c0
pvl.hosts-lldp: --no-vlans, bump font size, tweak vlan color logics again
Tero Marttila <terom@paivola.fi>
parents:
392
diff
changeset
|
255 |
|
391
e2c367b1556f
pvl.hosts-lldp: add VLAN support
Tero Marttila <terom@paivola.fi>
parents:
388
diff
changeset
|
256 |
# input |
380
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
257 |
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
|
258 |
pvl.args.apply(options) |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
259 |
|
399
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
260 |
# gather SNMP data from hosts |
382
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
261 |
hosts = pvl.hosts.apply(options, args) |
ba47a64f61f9
pvl.hosts-lldp: refactor lldp collection schema
Tero Marttila <terom@paivola.fi>
parents:
380
diff
changeset
|
262 |
|
399
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
263 |
data = collections.defaultdict(dict) |
395
9de553b50128
pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
393
diff
changeset
|
264 |
|
399
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
265 |
for host, attr, values in apply_hosts(options, hosts) : |
401
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
266 |
if isinstance(values, set) : |
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
267 |
log.info("[%s] %s + %s", host, attr, values) |
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
268 |
|
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
269 |
data[host].setdefault(attr, set()).update(values) |
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
270 |
|
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
271 |
elif isinstance(values, dict) : |
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
272 |
log.info("[%s] %s = %s", host, attr, values) |
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
273 |
|
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
274 |
data[host][attr] = values |
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
275 |
|
399
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
276 |
else : |
401
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
277 |
raise Exception("No value for [%s] %s" % (host, attr)) |
398
de275bf6db70
pvl.hosts-lldp: handle non-lldp-supporting switches, use dot1q per default for (port, vlan) leaf node mappings, with fallback to dot1d
Tero Marttila <terom@paivola.fi>
parents:
395
diff
changeset
|
278 |
|
399
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
279 |
# output |
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
280 |
for host, attrs in sorted(data.items()) : |
407
3197d049f345
pvl.hosts-snmp: output unambiguous host@domain
Tero Marttila <terom@paivola.fi>
parents:
403
diff
changeset
|
281 |
print "{host}@{domain}".format(host=host, domain=host.domain) |
399
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
282 |
|
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
283 |
for attr, value in sorted(attrs.items()) : |
403
9bae04e1780c
pvl.hosts-snmp: use new field syntax for dict attributes, each on their own line, with \t separator
Tero Marttila <terom@paivola.fi>
parents:
401
diff
changeset
|
284 |
print "\t{attr}".format(attr=' '.join(str(a) for a in attr)) |
399
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
285 |
|
401
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
286 |
if isinstance(value, set) : |
399
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
287 |
for v in sorted(value) : |
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
288 |
print "\t\t{value}".format(value=v) |
401
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
289 |
elif isinstance(value, dict) : |
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
290 |
for k, v in sorted(value.items()) : |
403
9bae04e1780c
pvl.hosts-snmp: use new field syntax for dict attributes, each on their own line, with \t separator
Tero Marttila <terom@paivola.fi>
parents:
401
diff
changeset
|
291 |
print "\t\t{key}\t{value}".format(key=k, value=v) |
401
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
292 |
else : |
e57c200f3e26
pvl.hosts-snmp: really commit new output syntax with attrs, change semantic structure
Tero Marttila <terom@paivola.fi>
parents:
399
diff
changeset
|
293 |
raise Exception("[%s] %s: invalid value: %s" % (host, attr, value)) |
399
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
294 |
|
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
295 |
return 0 |
380
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
296 |
|
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
297 |
if __name__ == '__main__': |
78f192fe9e2c
pvl.hosts-lldp: snmp-based lldp discovery of connected switches
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
298 |
pvl.args.main(main) |
399
aadf76a05ec1
:pvl.hosts-lldp: split into pvl.hosts-snmp to gather data, and pvl.hosts-graph to process/graph it
Tero Marttila <terom@paivola.fi>
parents:
398
diff
changeset
|
299 |