bin/pvl.hosts-snmp
author Tero Marttila <terom@paivola.fi>
Sat, 26 Jul 2014 13:52:51 +0300
changeset 422 56ba4bef5016
parent 407 3197d049f345
permissions -rwxr-xr-x
version: 0.7.0

* pvl.hosts: location = ... field
* pvl.hosts: support extension:foo = ... fields
* pvl.hosts: down = ...
* pvl.hosts-snmp: gather host links from snmp using lldp/fdb/vlan info
* pvl.hosts-graph: graph host links
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