bin/pvl.hosts-graph
author Tero Marttila <terom@paivola.fi>
Mon, 09 Mar 2015 23:31:13 +0200
changeset 738 3104fdf7ea26
parent 421 585eadaed270
permissions -rwxr-xr-x
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
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:
diff changeset
     1
#!/usr/bin/env python
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:
diff changeset
     2
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:
diff changeset
     3
"""
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:
diff changeset
     4
    Requirements:
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:
diff changeset
     5
        pydot
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:
diff changeset
     6
"""
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:
diff changeset
     7
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:
diff changeset
     8
import pvl.args
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:
diff changeset
     9
import pvl.hosts
402
3b6fb4ae56fb pvl.hosts-graph: value-less attr handling, compat for apply_graph()
Tero Marttila <terom@paivola.fi>
parents: 400
diff changeset
    10
from pvl.invoke import merge
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:
diff changeset
    11
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:
diff changeset
    12
import collections
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:
diff changeset
    13
import logging; log = logging.getLogger('pvl.hosts-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:
diff changeset
    14
import optparse
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:
diff changeset
    15
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:
diff changeset
    16
class ParseError (Exception) :
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:
diff changeset
    17
    def __init__ (self, file, line, msg) :
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:
diff changeset
    18
        self.file = file
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:
diff changeset
    19
        self.line = line
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:
diff changeset
    20
        self.msg = msg
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:
diff changeset
    21
  
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:
diff changeset
    22
    def __str__ (self) :
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:
diff changeset
    23
        return "{self.file}:{self.line}: {self.msg}".format(self=self)
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:
diff changeset
    24
400
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
    25
def _parse_snmp_part (part) :
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
    26
    if part.isdigit() :
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
    27
        return int(part)
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
    28
    else :
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
    29
        return part
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
    30
404
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
    31
def _parse_snmp_attr (line) :
400
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
    32
    for part in line.split() :
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
    33
        yield _parse_snmp_part(part)
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
    34
404
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
    35
def _parse_snmp_value (line) :
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
    36
    if '\t' in line :
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
    37
        key, value = line.split('\t', 1)
402
3b6fb4ae56fb pvl.hosts-graph: value-less attr handling, compat for apply_graph()
Tero Marttila <terom@paivola.fi>
parents: 400
diff changeset
    38
404
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
    39
        return { _parse_snmp_part(key): _parse_snmp_part(value) }
402
3b6fb4ae56fb pvl.hosts-graph: value-less attr handling, compat for apply_graph()
Tero Marttila <terom@paivola.fi>
parents: 400
diff changeset
    40
3b6fb4ae56fb pvl.hosts-graph: value-less attr handling, compat for apply_graph()
Tero Marttila <terom@paivola.fi>
parents: 400
diff changeset
    41
    else :
404
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
    42
        return set((_parse_snmp_part(line), ))
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
    43
    
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:
diff changeset
    44
def _load_snmp_data (options, file) :
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:
diff changeset
    45
    """
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:
diff changeset
    46
        Load a data dict generated by pvl.hosts-snmp from a file.
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:
diff changeset
    47
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:
diff changeset
    48
        Yields (host, attr, 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:
diff changeset
    49
    """
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:
diff changeset
    50
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:
diff changeset
    51
    host = None
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:
diff changeset
    52
    attr = None
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:
diff changeset
    53
    value = None
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:
diff changeset
    54
    
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:
diff changeset
    55
    for idx, line in enumerate(file, 1) :
400
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
    56
        indent = 0
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
    57
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
    58
        while line.startswith('\t') :
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
    59
            indent += 1
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
    60
            line = line[1:]
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
    61
404
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
    62
        line = line.lstrip('\t').rstrip('\n')
400
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
    63
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:
diff changeset
    64
        if indent == 0 :
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:
diff changeset
    65
            host = line
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:
diff changeset
    66
            attr = None
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:
diff changeset
    67
            value = None
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:
diff changeset
    68
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:
diff changeset
    69
        elif indent == 1 :
404
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
    70
            attr = tuple(_parse_snmp_attr(line))
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
    71
            value = None
400
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
    72
404
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
    73
            yield host, attr, None
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:
diff changeset
    74
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:
diff changeset
    75
        elif indent == 2 :
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:
diff changeset
    76
            if not attr :
400
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
    77
                raise ParseError(file, line, "[%s] %s: value outside of attr" % (host, attr))
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
    78
            
404
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
    79
            value = _parse_snmp_value(line)
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:
diff changeset
    80
404
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
    81
            yield 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:
diff changeset
    82
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:
diff changeset
    83
def load_snmp_data (options, file, 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:
diff changeset
    84
    """
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:
diff changeset
    85
        Load snmp data as dict, from given file path, or stdin.
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:
diff changeset
    86
    """
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:
diff changeset
    87
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:
diff changeset
    88
    if file :
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:
diff changeset
    89
        file = open(file)
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:
diff changeset
    90
    else :
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:
diff changeset
    91
        file = sys.stdin
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:
diff changeset
    92
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:
diff changeset
    93
    root = { }
408
32b7a0f2e7dc pvl.hosts-graph: update for new hostname format, map non-snmp lldp hosts by Host.ethernet
Tero Marttila <terom@paivola.fi>
parents: 406
diff changeset
    94
    
32b7a0f2e7dc pvl.hosts-graph: update for new hostname format, map non-snmp lldp hosts by Host.ethernet
Tero Marttila <terom@paivola.fi>
parents: 406
diff changeset
    95
    hosts_by_namedomain = dict(
32b7a0f2e7dc pvl.hosts-graph: update for new hostname format, map non-snmp lldp hosts by Host.ethernet
Tero Marttila <terom@paivola.fi>
parents: 406
diff changeset
    96
        (
32b7a0f2e7dc pvl.hosts-graph: update for new hostname format, map non-snmp lldp hosts by Host.ethernet
Tero Marttila <terom@paivola.fi>
parents: 406
diff changeset
    97
            '{host}@{domain}'.format(host=host, domain=host.domain), host
32b7a0f2e7dc pvl.hosts-graph: update for new hostname format, map non-snmp lldp hosts by Host.ethernet
Tero Marttila <terom@paivola.fi>
parents: 406
diff changeset
    98
        ) for host in hosts
32b7a0f2e7dc pvl.hosts-graph: update for new hostname format, map non-snmp lldp hosts by Host.ethernet
Tero Marttila <terom@paivola.fi>
parents: 406
diff changeset
    99
    )
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:
diff changeset
   100
408
32b7a0f2e7dc pvl.hosts-graph: update for new hostname format, map non-snmp lldp hosts by Host.ethernet
Tero Marttila <terom@paivola.fi>
parents: 406
diff changeset
   101
    for host_domain, attr, value in _load_snmp_data(options, file) :
32b7a0f2e7dc pvl.hosts-graph: update for new hostname format, map non-snmp lldp hosts by Host.ethernet
Tero Marttila <terom@paivola.fi>
parents: 406
diff changeset
   102
        host = hosts_by_namedomain.get(host_domain)
404
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
   103
        
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
   104
        if value :
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   105
            log.debug("[%s] %s: %s", host, ' '.join(str(a) for a in attr), value)
404
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
   106
        else :
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   107
            log.debug("[%s] %s", host, ' '.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:
diff changeset
   108
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:
diff changeset
   109
        item = root.setdefault(host, { })
400
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
   110
        
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:
diff changeset
   111
        for a in attr[:-1] :
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:
diff changeset
   112
            item = item.setdefault(a, {})
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:
diff changeset
   113
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:
diff changeset
   114
        a = attr[-1]
400
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
   115
        
404
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
   116
        if value is None :
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
   117
            pass
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
   118
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
   119
        elif isinstance(value, set) :
400
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
   120
            item.setdefault(a, set()).update(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:
diff changeset
   121
404
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
   122
        elif isinstance(value, dict) :
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
   123
            item.setdefault(a, dict()).update(value)
78e3d83135ab pvl.hosts-graph: support new syntax, with dict updates
Tero Marttila <terom@paivola.fi>
parents: 402
diff changeset
   124
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:
diff changeset
   125
        else :
402
3b6fb4ae56fb pvl.hosts-graph: value-less attr handling, compat for apply_graph()
Tero Marttila <terom@paivola.fi>
parents: 400
diff changeset
   126
            item[a] = value
400
41dd2a867e0a pvl.hosts-graph: parse new attribute-values format
Tero Marttila <terom@paivola.fi>
parents: 399
diff changeset
   127
            
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:
diff changeset
   128
    return root
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:
diff changeset
   129
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   130
def host_vlans (host, host_vlans) :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   131
    """
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   132
        {vlan: { tagged/untagged: [port] } } -> (port, (untag, [tag])).
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   133
    """
402
3b6fb4ae56fb pvl.hosts-graph: value-less attr handling, compat for apply_graph()
Tero Marttila <terom@paivola.fi>
parents: 400
diff changeset
   134
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   135
    ports = set()
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   136
    vlans_untagged = { }
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   137
    vlans_tagged = collections.defaultdict(set)
402
3b6fb4ae56fb pvl.hosts-graph: value-less attr handling, compat for apply_graph()
Tero Marttila <terom@paivola.fi>
parents: 400
diff changeset
   138
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   139
    for vlan, vlan_attrs in host_vlans.iteritems() :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   140
        for port in vlan_attrs.get('tagged', ()) :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   141
            ports.add(port)
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   142
            vlans_tagged[port].add(vlan)
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   143
        
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   144
        for port in vlan_attrs.get('untagged', ()) :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   145
            ports.add(port)
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   146
            vlans_untagged[port] = vlan
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   147
    
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   148
    for port in ports :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   149
        untag = vlans_untagged.get(port)
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   150
        tagged = vlans_tagged.get(port, ())
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   151
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   152
        log.debug("%s: %s: untag=%s tag=%s", host, port, untag, tagged)
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   153
        
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   154
        yield port, (untag, tagged)
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   155
409
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   156
def build_graph (options, snmp, hosts) :
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   157
    """
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   158
        Combine given snmp data and { host: Host } into
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   159
            { node: label }
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   160
            { (remote, remote_port, local_port, local): (local_untag, tagged, remote_untag) }
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   161
    """
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   162
406
92a4de88b86f pvl.verkko-graph: name nodes by host
Tero Marttila <terom@paivola.fi>
parents: 405
diff changeset
   163
    nodes = { } # host: label
410
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   164
    links = { } # (local, local_port, remote_port, remote_host): (local_untag, tagged, remote_untag)
406
92a4de88b86f pvl.verkko-graph: name nodes by host
Tero Marttila <terom@paivola.fi>
parents: 405
diff changeset
   165
408
32b7a0f2e7dc pvl.hosts-graph: update for new hostname format, map non-snmp lldp hosts by Host.ethernet
Tero Marttila <terom@paivola.fi>
parents: 406
diff changeset
   166
    hosts_by_lldp = { } # chassis: host
32b7a0f2e7dc pvl.hosts-graph: update for new hostname format, map non-snmp lldp hosts by Host.ethernet
Tero Marttila <terom@paivola.fi>
parents: 406
diff changeset
   167
    hosts_by_ethernet = { } # ethernet: host
410
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   168
    hosts_by_location = { } # (domain, location): host
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   169
416
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   170
    nodes_port = { } # (local, int(local_port)): {remote}
411
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   171
    nodes_out = { } # local: {remote}
414
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   172
    nodes_in = { } # remote: {local}
410
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   173
    links_out = { } # (local, remote): local_port
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   174
    links_in = { } # (remote, local): remote_port
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   175
    
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   176
    # first scan: lldp hosts
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   177
    for host, host_attrs in snmp.iteritems() :
409
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   178
        nodes[host] = host.location or str(host)
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   179
409
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   180
        if 'lldp' in host_attrs :
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   181
            lldp_local = host_attrs['lldp']['local']
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   182
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   183
            hosts_by_lldp[lldp_local['chassis']] = host
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   184
    
408
32b7a0f2e7dc pvl.hosts-graph: update for new hostname format, map non-snmp lldp hosts by Host.ethernet
Tero Marttila <terom@paivola.fi>
parents: 406
diff changeset
   185
    # second scan: nodes by ethernet
32b7a0f2e7dc pvl.hosts-graph: update for new hostname format, map non-snmp lldp hosts by Host.ethernet
Tero Marttila <terom@paivola.fi>
parents: 406
diff changeset
   186
    for host in hosts :
32b7a0f2e7dc pvl.hosts-graph: update for new hostname format, map non-snmp lldp hosts by Host.ethernet
Tero Marttila <terom@paivola.fi>
parents: 406
diff changeset
   187
        for ethernet in host.ethernet.itervalues() :
32b7a0f2e7dc pvl.hosts-graph: update for new hostname format, map non-snmp lldp hosts by Host.ethernet
Tero Marttila <terom@paivola.fi>
parents: 406
diff changeset
   188
            hosts_by_ethernet[ethernet] = host
32b7a0f2e7dc pvl.hosts-graph: update for new hostname format, map non-snmp lldp hosts by Host.ethernet
Tero Marttila <terom@paivola.fi>
parents: 406
diff changeset
   189
421
585eadaed270 pvl.hosts-dns/graph: support a separate location = name@domain format, with an optional separate Host.location_domain
Tero Marttila <terom@paivola.fi>
parents: 419
diff changeset
   190
        if host.location and host.location_domain:
585eadaed270 pvl.hosts-dns/graph: support a separate location = name@domain format, with an optional separate Host.location_domain
Tero Marttila <terom@paivola.fi>
parents: 419
diff changeset
   191
            hosts_by_location[(host.location_domain, host.location)] = host
585eadaed270 pvl.hosts-dns/graph: support a separate location = name@domain format, with an optional separate Host.location_domain
Tero Marttila <terom@paivola.fi>
parents: 419
diff changeset
   192
        elif host.location:
410
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   193
            hosts_by_location[(host.domain, host.location)] = host
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   194
409
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   195
    # first graph: lldp remotes
402
3b6fb4ae56fb pvl.hosts-graph: value-less attr handling, compat for apply_graph()
Tero Marttila <terom@paivola.fi>
parents: 400
diff changeset
   196
    for host, host_attrs in snmp.iteritems() :
406
92a4de88b86f pvl.verkko-graph: name nodes by host
Tero Marttila <terom@paivola.fi>
parents: 405
diff changeset
   197
        local_node = host
402
3b6fb4ae56fb pvl.hosts-graph: value-less attr handling, compat for apply_graph()
Tero Marttila <terom@paivola.fi>
parents: 400
diff changeset
   198
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   199
        if 'vlan' in host_attrs :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   200
            vlans = dict(host_vlans(host, host_attrs['vlan']))
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   201
        else :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   202
            vlans = None
408
32b7a0f2e7dc pvl.hosts-graph: update for new hostname format, map non-snmp lldp hosts by Host.ethernet
Tero Marttila <terom@paivola.fi>
parents: 406
diff changeset
   203
409
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   204
        if 'lldp' in host_attrs :
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   205
            lldp = host_attrs['lldp']
408
32b7a0f2e7dc pvl.hosts-graph: update for new hostname format, map non-snmp lldp hosts by Host.ethernet
Tero Marttila <terom@paivola.fi>
parents: 406
diff changeset
   206
409
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   207
            local_lldp = lldp['local']['chassis']
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   208
            
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   209
            for port, port_attrs in lldp.get('port', { }).iteritems() :
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   210
                local_port = port_attrs['local']['port']
408
32b7a0f2e7dc pvl.hosts-graph: update for new hostname format, map non-snmp lldp hosts by Host.ethernet
Tero Marttila <terom@paivola.fi>
parents: 406
diff changeset
   211
409
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   212
                for remote_lldp, remote_attrs in port_attrs['remote'].iteritems() :
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   213
                    # determine remote node
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   214
                    remote_label = remote_attrs['sys_name']
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   215
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   216
                    if remote_lldp in hosts_by_lldp :
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   217
                        remote_node = remote_host = hosts_by_lldp[remote_lldp]
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   218
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   219
                    elif remote_lldp in hosts_by_ethernet :
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   220
                        remote_node = remote_host = hosts_by_ethernet[remote_lldp]
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   221
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   222
                        if remote_host.location :
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   223
                            remote_label = remote_host.location
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   224
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   225
                        log.info("%s:%s: guessing lldp host %s -> %s (%s)", host, port, remote_lldp, remote_host, remote_label)
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   226
417
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   227
                    elif options.graph_lldp_unknown :
413
cb7782e5a2fd pvl.hosts-graph: do not graph unknown lldp remotes per default, lower warn on unconfirmed manual links
Tero Marttila <terom@paivola.fi>
parents: 411
diff changeset
   228
                        log.warning("%s:%s: unknown lldp remote %s (%s)", host, port, remote_lldp, remote_label)
cb7782e5a2fd pvl.hosts-graph: do not graph unknown lldp remotes per default, lower warn on unconfirmed manual links
Tero Marttila <terom@paivola.fi>
parents: 411
diff changeset
   229
                        
417
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   230
                        # by chassis id
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   231
                        remote_node = remote_lldp
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   232
                        remote_host = None
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   233
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   234
                    else :
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   235
                        log.info("%s:%s: unknown lldp remote %s (%s)", host, port, remote_lldp, remote_label)
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   236
                        
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   237
                        remote_node = remote_host = None
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   238
413
cb7782e5a2fd pvl.hosts-graph: do not graph unknown lldp remotes per default, lower warn on unconfirmed manual links
Tero Marttila <terom@paivola.fi>
parents: 411
diff changeset
   239
                    
cb7782e5a2fd pvl.hosts-graph: do not graph unknown lldp remotes per default, lower warn on unconfirmed manual links
Tero Marttila <terom@paivola.fi>
parents: 411
diff changeset
   240
                    if not remote_node :
cb7782e5a2fd pvl.hosts-graph: do not graph unknown lldp remotes per default, lower warn on unconfirmed manual links
Tero Marttila <terom@paivola.fi>
parents: 411
diff changeset
   241
                        continue
409
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   242
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   243
                    # ensure remote node
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   244
                    if remote_node not in nodes :
410
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   245
                        log.debug("%s:%s: lazy-add remote %s (%s)", host, port, remote_node, remote_label)
409
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   246
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   247
                        nodes[remote_node] = remote_label
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   248
                    
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   249
                    # local vlans
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   250
                    if vlans :
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   251
                        port_vlans = vlans.get(port)
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   252
                    else :
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   253
                        port_vlans = None
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   254
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   255
                    if port_vlans :
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   256
                        local_untag, local_tagged = port_vlans
410
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   257
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   258
                    # directional mapping
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   259
                    links_out[(local_node, remote_node)] = local_port
416
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   260
                    nodes_port.setdefault((local_node, port), set()).add(remote_node)
411
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   261
                    nodes_out.setdefault(local_node, set()).add(remote_node)
414
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   262
                    nodes_in.setdefault(remote_node, set()).add(local_node)
409
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   263
                    
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   264
                    # bidirectional mappings
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   265
                    remote_port = remote_attrs['port']
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   266
410
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   267
                    links_in[(remote_node, local_node)] = remote_port
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   268
409
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   269
                    forward = (local_node, local_port, remote_port, remote_node)
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   270
                    reverse = (remote_node, remote_port, local_port, local_node)
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   271
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   272
                    if reverse not in links :
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   273
                        links[forward] = (local_untag, local_tagged, None)
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   274
                    else :
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   275
                        remote_untag, remote_tagged, _ = links[reverse]
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   276
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   277
                        # merge
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   278
                        if remote_untag != local_untag :
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   279
                            log.warning("%s:%s untag %s <=> %s untag %s:%s",
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   280
                                    host, local_port, local_untag,
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   281
                                    remote_untag, remote_node, remote_port
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   282
                            )
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   283
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   284
                        if remote_tagged != local_tagged :
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   285
                            log.warning("%s:%s tagged %s <-> %s tagged %s:%s",
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   286
                                    host, local_port, ':'.join(str(x) for x in sorted(local_tagged)),
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   287
                                    ':'.join(str(x) for x in sorted(remote_tagged)), remote_node, remote_port
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   288
                            )
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   289
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   290
                        links[reverse] = (remote_untag, remote_tagged, local_untag)
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   291
410
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   292
    # second graph: manual ports
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   293
    for host in hosts :
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   294
        local_node = host
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   295
        host_links = host.extensions.get('link')
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   296
418
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   297
        # XXX: copy-pasta
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   298
        if host in snmp and 'vlan' in snmp[host] :
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   299
            vlans = dict(host_vlans(host, snmp[host]['vlan']))
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   300
        else :
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   301
            vlans = None
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   302
410
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   303
        if host_links :
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   304
            if local_node not in nodes :
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   305
                # XXX: copypasta
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   306
                nodes[local_node] = host.location or str(host)
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   307
411
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   308
            for link_port, remote in host_links.iteritems() :
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   309
                if link_port.isdigit() :
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   310
                    port = int(link_port)
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   311
                else :
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   312
                    port = str(link_port)
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   313
410
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   314
                # map remote -> remote_host
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   315
                if '@' in remote :
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   316
                    remote_location, remote_domain = remote.split('@', 1)
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   317
                else :
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   318
                    remote_location = remote
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   319
                    remote_domain = host.domain
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   320
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   321
                remote_node = remote_host = hosts_by_location.get((remote_domain, remote_location))
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   322
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   323
                if not remote_host :
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   324
                    log.warning("%s:%s: unknown remote location: %s@%s", host, port, remote_location, remote_domain)
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   325
                    continue
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   326
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   327
                remote_label = remote_host.location or str(remote_host)
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   328
                
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   329
                log.info("%s:%s: link -> %s@%s (%s)", host, port, remote_host, remote_host.domain, remote_label)
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   330
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   331
                if remote_node not in nodes :
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   332
                    # XXX: copypasta
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   333
                    nodes[remote_node] = remote_label
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   334
            
418
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   335
                # local vlans
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   336
                if vlans and port in vlans :
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   337
                    local_untag, local_tagged = vlans[port]
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   338
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   339
                    log.info("%s:%s link vlans (%s) <%s>", host, port, local_untag, ':'.join(str(tag) for tag in local_tagged))
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   340
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   341
                    link_vlans = (local_untag, local_tagged, None)
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   342
                else :
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   343
                    # unknown
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   344
                    link_vlans = None
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   345
                    
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   346
                    log.warning("%s:%s unknown vlans", host, port)
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   347
410
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   348
                # directional links
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   349
                local_port = links_out.get((local_node, remote_node))
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   350
                
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   351
                if not local_port :
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   352
                    log.info("%s:%s: unconfirmed -> %s", host, port, remote_host)
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   353
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   354
                elif local_port != port :
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   355
                    log.warn("%s:%s: port mismatch %s -> %s", host, port, local_port, remote_host)
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   356
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   357
                else :
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   358
                    log.debug("%s:%s: confirm -> %s", host, port, remote_host)
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   359
                
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   360
                links_out[(local_node, remote_node)] = port
416
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   361
                nodes_port.setdefault((local_node, port), set()).add(remote_node)
411
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   362
                nodes_out.setdefault(local_node, set()).add(remote_node)
414
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   363
                nodes_in.setdefault(remote_node, set()).add(local_node)
410
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   364
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   365
                # update directional or missing links
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   366
                remote_port = links_out.get((remote_node, local_node))
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   367
                reverse_port = links_in.get((local_node, remote_node))
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   368
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   369
                if reverse_port and reverse_port != port :
411
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   370
                    # XXX: this can be caused by str vs int >_>
410
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   371
                    log.warn("%s:%s: reverse port mismatch %s <- %s", host, port, reverse_port, remote_node)
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   372
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   373
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   374
                if local_port and remote_port :
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   375
                    log.debug("%s:%s link <-> %s:%s", local_node, local_port, remote_port, remote_node)
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   376
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   377
                elif local_port :
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   378
                    # we have the forward mapping already, so this doesn't add any new info
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   379
                    log.debug("%s:%s link -> %s:%s", local_node, local_port, remote_port, remote_node)
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   380
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   381
                elif remote_port and reverse_port :
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   382
                    # we have the bidirectional mapping already, so this doesn't add any new info
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   383
                    log.debug("%s:%s link <-> %s:%s", local_node, local_port, remote_port, remote_node)
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   384
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   385
                elif remote_port :
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   386
                    # we had the reverse mapping already, make it bidirectional
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   387
                    local_port = port
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   388
                    log.info("%s:%s link <- %s:%s", local_node, local_port, remote_port, remote_node)
418
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   389
                    
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   390
                    # TODO: update vlan info
410
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   391
                    links[(remote_node, remote_port, local_port, local_node)] = links.pop((remote_node, remote_port, None, local_node))
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   392
                
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   393
                else :
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   394
                    local_port = port
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   395
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   396
                    # mapping was completely missing
413
cb7782e5a2fd pvl.hosts-graph: do not graph unknown lldp remotes per default, lower warn on unconfirmed manual links
Tero Marttila <terom@paivola.fi>
parents: 411
diff changeset
   397
                    log.info("%s:%s link -> %s", local_node, local_port, remote_node)
410
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   398
418
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   399
                    links[(local_node, local_port, None, remote_node)] = link_vlans
410
afe9cc8032ec pvl.hosts-graph: keep track of partial links, update reverse bridge links, implement directional/bidirectional manually configured links
Tero Marttila <terom@paivola.fi>
parents: 409
diff changeset
   400
416
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   401
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   402
    # verify non-p2p links
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   403
    for (node, port), remotes in nodes_port.iteritems() :
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   404
        if len(remotes) > 1 :
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   405
            log.warning("%s:%s: multiple remotes: %s", node, port, ' '.join(str(host) for host in remotes))
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   406
411
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   407
    if options.graph_bridge :
414
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   408
        # scan hosts with bridges
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   409
        bridge_hosts = set()
416
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   410
        bridge_ports = { }
414
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   411
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   412
        for host, host_attrs in snmp.iteritems() :
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   413
            if 'bridge' in host_attrs or any('bridge' in vlan_attrs for vlan_attrs in host_attrs.get('vlan', { }).itervalues()) :
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   414
                bridge_hosts.add(host)
418
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   415
        
411
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   416
        # third graph: bridge
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   417
        for host, host_attrs in snmp.iteritems() :
414
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   418
            local_out = nodes_out.get(host)
411
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   419
414
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   420
            if not local_out :
411
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   421
                log.warning("%s: no outgoing links, skipping bridge", host)
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   422
                continue
414
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   423
            
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   424
            # scan vlan/port bridge ethers
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   425
            bridge = { } # (port, vlan): {ethernet}
411
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   426
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   427
            for port, ethernets in host_attrs.get('bridge', { }).iteritems() :
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   428
                bridge[(port, None)] = ethernets
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   429
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   430
            for vlan, vlan_attrs in host_attrs.get('vlan', { }).iteritems() :
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   431
                for port, ethernets in vlan_attrs.get('bridge', { }).iteritems()  :
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   432
                    bridge[(port, vlan)] = ethernets
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   433
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   434
            for (port, vlan), ethernets in bridge.iteritems() :
414
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   435
                local_node = host
411
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   436
                local_port = port
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   437
                
416
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   438
                remote_nodes = nodes_port.get((local_node, local_port))
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   439
                
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   440
                if not remote_nodes :
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   441
                    remote_node = None
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   442
                elif len(remote_nodes) == 1 :
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   443
                    remote_node, = remote_nodes
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   444
                else :
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   445
                    log.warning("%s:%s: ignore port with multiple remotes: %s", host, port, ' '.join(str(host) for host in remotes))
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   446
                    continue
414
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   447
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   448
                if remote_node :
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   449
                    remote_in = nodes_in.get(remote_node, set())
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   450
                else :
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   451
                    remote_in = set()
411
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   452
                
414
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   453
                remote_leaf = (remote_in == set((host, )))
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   454
                
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   455
                # TODO: add ether node and link if remote node also has this ether on this link
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   456
                #       also do this if all remote_in's agree that the ether is on the remote_node
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   457
                if not remote_node :
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   458
                    log.debug("%s:%s: no remote node", host, port)
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   459
                
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   460
                elif remote_leaf and (remote_node not in bridge_hosts) and len(ethernets) > 1 :
415
658bc929cf77 pvl.hosts-graph: docdoc
Tero Marttila <terom@paivola.fi>
parents: 414
diff changeset
   461
                    # map onto non-bridge leaf node
658bc929cf77 pvl.hosts-graph: docdoc
Tero Marttila <terom@paivola.fi>
parents: 414
diff changeset
   462
                    log.info("%s: <== %s:%s ", remote_node, host, port)
414
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   463
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   464
                    # map links out of the assumed remote bridge
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   465
                    local_node = remote_node
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   466
                    local_port = None
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   467
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   468
                else :
411
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   469
                    log.debug("%s:%s/%s bridge skip -> %s", host, port, vlan, remote_node)
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   470
                    continue
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   471
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   472
                for ethernet in ethernets :
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   473
                    # remote host
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   474
                    if ethernet in hosts_by_ethernet :
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   475
                        remote_node = remote_host = hosts_by_ethernet[ethernet]
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   476
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   477
                        remote_label = remote_host.location or str(remote_host)
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   478
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   479
                        log.debug("%s:%s/%s bridge %s = %s (%s)", host, port, vlan, ethernet, remote_host, remote_label)
414
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   480
417
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   481
                    elif options.graph_bridge_unknown :
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   482
                        log.warning("%s:%s/%s bridge unknown host %s", host, port, vlan, ethernet)
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   483
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   484
                        remote_label = remote_node = ethernet
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   485
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   486
                        nodes[remote_node] = remote_label
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   487
                        
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   488
                        remote_host = None
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   489
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   490
                    else :
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   491
                        log.info("%s:%s/%s bridge unknown host %s", host, port, vlan, ethernet)
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   492
411
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   493
                        continue
415
658bc929cf77 pvl.hosts-graph: docdoc
Tero Marttila <terom@paivola.fi>
parents: 414
diff changeset
   494
                
658bc929cf77 pvl.hosts-graph: docdoc
Tero Marttila <terom@paivola.fi>
parents: 414
diff changeset
   495
                    # TODO: also handled multiple IP/ethers for the same host
417
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   496
                    if remote_host == host and local_node != host :
414
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   497
                        log.debug("%s:%s: skip remote-mapped self", host, port)
417
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   498
                        continue
414
b9aa8c35741f pvl.hosts-graph: map bridge ethers from bridge nodes onto non-bridge leaf nodes
Tero Marttila <terom@paivola.fi>
parents: 413
diff changeset
   499
411
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   500
                    if remote_node not in nodes :
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   501
                        log.debug("%s:%s: lazy-add remote %s (%s)", host, port, remote_node, remote_label)
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   502
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   503
                        nodes[remote_node] = remote_label
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   504
                    
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   505
                    # unknown vlans
418
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   506
                    if vlan :
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   507
                        link_vlans = (vlan, (), None)
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   508
                    else :
9d243809532d pvl.hosts-graph: color host links vlans
Tero Marttila <terom@paivola.fi>
parents: 417
diff changeset
   509
                        link_vlans = None
411
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   510
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   511
                    # directional link
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   512
                    links_out[(local_node, remote_node)] = local_port
416
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   513
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   514
                    if local_port :
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   515
                        bridge_ports.setdefault((local_node, local_port), set()).add(remote_node)
411
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   516
                    
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   517
                    # bidirectional link
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   518
                    forward = (local_node, local_port, None, remote_node)
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   519
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   520
                    # scan for reverse
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   521
                    remote_port = links_out.get((remote_node, local_node))
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   522
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   523
                    if remote_port :
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   524
                        reverse = (remote_node, remote_port, None, local_node)
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   525
417
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   526
                        log.info("%s:%s bridge <-> %s:%s", local_node, local_port, remote_port, remote_node)
411
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   527
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   528
                        # fill in remote_port for bidirectional link
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   529
                        del links[reverse]
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   530
                        reverse = local_node, local_port, remote_port, remote_node
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   531
                        links[reverse] = link_vlans
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   532
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   533
                    else :
417
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   534
                        log.info("%s:%s bridge -> %s", local_node, local_port, remote_node)
411
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   535
9ac5dae42adb pvl.hosts-graph: --graph-bridge: trivial elimination of linked ports
Tero Marttila <terom@paivola.fi>
parents: 410
diff changeset
   536
                        links[forward] = link_vlans
416
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   537
        
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   538
        # verify unmanaged bridges
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   539
        for (node, port), remotes in bridge_ports.iteritems() :
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   540
            if len(remotes) > 1 :
fb0fd4ac0168 pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
Tero Marttila <terom@paivola.fi>
parents: 415
diff changeset
   541
                log.warning("%s:%s: multiple bridge remotes: %s", node, port, ' '.join(str(host) for host in remotes))
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   542
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   543
    return nodes, links
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   544
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   545
class GraphVlans (object) :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   546
    """
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   547
        Maintain vlan -> dot style/color mappings
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   548
    """
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   549
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   550
    SERIES = 'paired12'
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   551
    NONE = 'black'
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   552
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   553
    def __init__ (self, vlans=None) :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   554
        if vlans :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   555
            self.vlans = dict(vlans)
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   556
        else :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   557
            self.vlans = { }
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   558
    
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   559
    def color (self, vlan) :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   560
        if vlan in self.vlans :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   561
            return self.vlans[vlan]
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   562
        
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   563
        # alloc
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   564
        color = '/{series}/{index}'.format(series=self.SERIES, index=len(self.vlans) + 1)
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   565
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   566
        self.vlans[vlan] = color
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   567
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   568
        return color
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   569
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   570
def dot_quote (value) :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   571
    """
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   572
        Quote a dot value.
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   573
    """
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   574
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   575
    return '"{value}"'.format(value=value)
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   576
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   577
def dot (*line, **attrs) :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   578
    """
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   579
        Build dot-syntax:
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   580
            *line {
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   581
                *line [**attrs];
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   582
            }
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   583
    """
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   584
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   585
    if line and attrs :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   586
        return ''.join(('\t', ' '.join(str(x) for x in line), ' [',
409
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   587
            ', '.join('{name}="{value}"'.format(name=name, value=value) for name, value in attrs.iteritems() if value is not None),
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   588
        ']', ';'))
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   589
    elif line :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   590
        return ' '.join(line) + ' {'
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   591
    else :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   592
        return '}'
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   593
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   594
def build_dot (options, nodes, links, type='digraph', vlans=None) :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   595
    """
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   596
        Construct a dot description of the given node/links graph.
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   597
    """
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   598
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   599
    if vlans is True :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   600
        vlans = { }
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   601
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   602
    yield dot(type, 'verkko')
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   603
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   604
    # defaults
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   605
    yield dot('graph',
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:
diff changeset
   606
            # XXX: breaks multi-edges?
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:
diff changeset
   607
            #splines     = '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:
diff changeset
   608
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:
diff changeset
   609
            sep             = '+25,25',
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:
diff changeset
   610
            overlap         = 'scalexy',
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:
diff changeset
   611
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:
diff changeset
   612
            # only applies to loops
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:
diff changeset
   613
            nodesep     = 0.5,
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:
diff changeset
   614
    )
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   615
    yield dot('edge',
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   616
        labeldistance   = 3.0,
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   617
        penwidth        = 2.0,
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:
diff changeset
   618
    )
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   619
    yield dot('node',
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   620
        fontsize        = 18,
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   621
    )
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   622
    
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   623
    # nodes
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   624
    for node, node_label in nodes.iteritems() :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   625
        yield dot(dot_quote(node), label=node_label)
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:
diff changeset
   626
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   627
    # links
409
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   628
    for (local, local_port, remote_port, remote), link_vlans in links.iteritems() :
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   629
        if link_vlans :
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   630
            local_untag, tagged, remote_untag = link_vlans
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   631
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   632
            if vlans :
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   633
                head_color = vlans.color(local_untag) if local_untag else None
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   634
                tail_color = vlans.color(remote_untag) if remote_untag else None
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   635
                line_colors = [vlans.color(tag) for tag in sorted(tagged)]
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   636
            else :
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   637
                head_color = GraphVlans.NONE if local_untag else None
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   638
                tail_color = GraphVlans.NONE if remote_untag else None
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   639
                line_colors = []
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   640
        else :
409
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   641
            # unknown
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   642
            head_color = tail_color = None
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   643
            line_colors = []
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:
diff changeset
   644
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   645
        if head_color and tail_color :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   646
            dir = 'both'
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   647
            colors = [head_color, tail_color] + line_colors
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   648
        elif head_color :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   649
            dir = 'forward'
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   650
            colors = [head_color] + line_colors
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   651
        elif tail_color :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   652
            dir = 'back'
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   653
            colors = [vlans.NONE, tail_color] + line_colors
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   654
        else :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   655
            dir = 'none'
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   656
            colors = line_colors
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:
diff changeset
   657
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   658
        yield dot(dot_quote(local), '->', dot_quote(remote),
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   659
            taillabel   = local_port,
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   660
            headlabel   = remote_port,
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   661
            dir         = dir,
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:
diff changeset
   662
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   663
            fillcolor   = 'black',
409
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   664
            color       = ':'.join(colors) if colors else None,
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   665
        )
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:
diff changeset
   666
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   667
    yield dot()
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:
diff changeset
   668
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   669
def apply_dot (options, file, dot) :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   670
    """
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   671
        Output dot file for given graphbits
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   672
    """
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   673
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   674
    for line in dot :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   675
        file.write(line + '\n')
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:
diff changeset
   676
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:
diff changeset
   677
def main (argv) :
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:
diff changeset
   678
    """
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:
diff changeset
   679
        Graph network
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:
diff changeset
   680
    """
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:
diff changeset
   681
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:
diff changeset
   682
    parser = optparse.OptionParser(main.__doc__)
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:
diff changeset
   683
    parser.add_option_group(pvl.args.parser(parser))
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:
diff changeset
   684
    parser.add_option_group(pvl.hosts.optparser(parser))
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:
diff changeset
   685
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:
diff changeset
   686
    parser.add_option('--snmp-data', metavar='FILE', default=None,
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:
diff changeset
   687
            help="Load snmp data from FILE")
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:
diff changeset
   688
413
cb7782e5a2fd pvl.hosts-graph: do not graph unknown lldp remotes per default, lower warn on unconfirmed manual links
Tero Marttila <terom@paivola.fi>
parents: 411
diff changeset
   689
cb7782e5a2fd pvl.hosts-graph: do not graph unknown lldp remotes per default, lower warn on unconfirmed manual links
Tero Marttila <terom@paivola.fi>
parents: 411
diff changeset
   690
    parser.add_option('--graph-lldp-unknown', action='store_true',
cb7782e5a2fd pvl.hosts-graph: do not graph unknown lldp remotes per default, lower warn on unconfirmed manual links
Tero Marttila <terom@paivola.fi>
parents: 411
diff changeset
   691
            help="Graph unknown LLDP nodes")
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:
diff changeset
   692
409
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   693
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   694
    parser.add_option('--graph-vlans', action='store_true', dest='graph_vlans', 
409
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   695
            help="Graph links with VLAN information")
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:
diff changeset
   696
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   697
    parser.add_option('--no-vlans', action='store_false', dest='graph_vlans',
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:
diff changeset
   698
            help="Do not color VLANs")
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:
diff changeset
   699
413
cb7782e5a2fd pvl.hosts-graph: do not graph unknown lldp remotes per default, lower warn on unconfirmed manual links
Tero Marttila <terom@paivola.fi>
parents: 411
diff changeset
   700
409
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   701
    parser.add_option('--graph-bridge', action='store_true',
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   702
            help="Graph bridge forwarding database links")
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   703
417
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   704
    parser.add_option('--graph-bridge-unknown', action='store_true',
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   705
            help="Graph unknown bridge forwarding databse hosts")
75bbfb05fbf3 pvl.hosts-graph: --graph-brige-unknown and fixup --graph-lldp-unknown logging
Tero Marttila <terom@paivola.fi>
parents: 416
diff changeset
   706
409
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   707
413
cb7782e5a2fd pvl.hosts-graph: do not graph unknown lldp remotes per default, lower warn on unconfirmed manual links
Tero Marttila <terom@paivola.fi>
parents: 411
diff changeset
   708
    parser.add_option('--graph-dot', metavar='FILE',
cb7782e5a2fd pvl.hosts-graph: do not graph unknown lldp remotes per default, lower warn on unconfirmed manual links
Tero Marttila <terom@paivola.fi>
parents: 411
diff changeset
   709
            help="Output .dot graph data to file")
cb7782e5a2fd pvl.hosts-graph: do not graph unknown lldp remotes per default, lower warn on unconfirmed manual links
Tero Marttila <terom@paivola.fi>
parents: 411
diff changeset
   710
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:
diff changeset
   711
    # input
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:
diff changeset
   712
    options, args = parser.parse_args(argv[1:])
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:
diff changeset
   713
    pvl.args.apply(options)
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:
diff changeset
   714
    
408
32b7a0f2e7dc pvl.hosts-graph: update for new hostname format, map non-snmp lldp hosts by Host.ethernet
Tero Marttila <terom@paivola.fi>
parents: 406
diff changeset
   715
    # load hosts
32b7a0f2e7dc pvl.hosts-graph: update for new hostname format, map non-snmp lldp hosts by Host.ethernet
Tero Marttila <terom@paivola.fi>
parents: 406
diff changeset
   716
    hosts = list(pvl.hosts.apply(options, args))
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:
diff changeset
   717
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:
diff changeset
   718
    # load raw snmp data
402
3b6fb4ae56fb pvl.hosts-graph: value-less attr handling, compat for apply_graph()
Tero Marttila <terom@paivola.fi>
parents: 400
diff changeset
   719
    snmp = load_snmp_data(options, options.snmp_data, hosts)
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:
diff changeset
   720
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   721
    # process data into graph
409
b2b1bc488195 pvl.hosts-graph: --graph-bridge for very crude fdb ethernet nodes/links
Tero Marttila <terom@paivola.fi>
parents: 408
diff changeset
   722
    nodes, links = build_graph(options, snmp, hosts)
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   723
    
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   724
    # process graph into dot
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   725
    if options.graph_vlans is False :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   726
        graph_vlans = None
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   727
    else :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   728
        graph_vlans = GraphVlans()
402
3b6fb4ae56fb pvl.hosts-graph: value-less attr handling, compat for apply_graph()
Tero Marttila <terom@paivola.fi>
parents: 400
diff changeset
   729
405
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   730
    if options.graph_dot :
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   731
        # process to dot
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   732
        dot = build_dot(options, nodes, links, vlans=graph_vlans)
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   733
        
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   734
        # write out
97b436f9363a pvl.hosts-graph: split out graph-building for dot-building
Tero Marttila <terom@paivola.fi>
parents: 404
diff changeset
   735
        apply_dot(options, open(options.graph_dot, 'w'), dot)
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:
diff changeset
   736
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:
diff changeset
   737
    return 0
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:
diff changeset
   738
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:
diff changeset
   739
if __name__ == '__main__':
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:
diff changeset
   740
    pvl.args.main(main)