pvl/snmp/bridge.py
author Tero Marttila <terom@paivola.fi>
Sun, 07 Sep 2014 14:21:56 +0300
changeset 424 e77e967d59b0
parent 397 8455f42d8926
permissions -rw-r--r--
hgignore: use glob; ignore snmp mibs
395
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
"""
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
    Requirements:
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
        memoized-property
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
    Setup:
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
        ./opt/bin/build-pysnmp-mib -o usr/mibs/BRIDGE-MIB.py etc/mibs/rfc1493.mib
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
    Run:
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
        PYSNMP_MIB_DIRS=usr/mibs/ ./opt/bin/python ...
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
    SNMP:
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
        BRIDGE-MIB::dot1dTpFdbTable
397
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    13
        Q-BRIDGE-MIB::dot1qTpFdbTable
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    14
        Q-BRIDGE-MIB::dot1qVlanCurrentTable
395
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
"""
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
from pvl.snmp import snmp
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
from pvl.snmp.snmp import pysnmp
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
from memoized_property import memoized_property
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
import logging; log = logging.getLogger('pvl.snmp.vlan')
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
DOT1D_TP_AGING_TIME = pysnmp.MibVariable('BRIDGE-MIB', 'dot1dTpAgingTime', 0)
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
DOT1D_TP_FDB_PORT = pysnmp.MibVariable('BRIDGE-MIB', 'dot1dTpFdbPort')
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
397
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    28
DOT1Q_VLAN_FDB_ID = pysnmp.MibVariable('Q-BRIDGE-MIB', 'dot1qVlanFdbId') # [dot1qVlanIndex]
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    29
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    30
DOT1Q_TP_FDB_PORT = pysnmp.MibVariable('Q-BRIDGE-MIB', 'dot1qTpFdbPort') # [dot1qFdbId, dot1qTpFdbAddress]
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    31
395
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
def macaddr (value) :
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
    """
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
        Excepts a MAC address from an SNMP OctetString.
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
    """
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
    return ':'.join('{octet:02x}'.format(octet=c) for c in value.asNumbers())
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
class BridgeAgent (snmp.SNMPAgent) :
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
    """
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
        Query Bridge configuration.
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
        XXX: this is not VLAN-aware!
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
    """
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
    def ping (self) :
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
        for name, value in self.get(DOT1D_TP_AGING_TIME) :
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
            # XXX: ????
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
            if value.tagSet == pysnmp.rfc1905.NoSuchInstance.tagSet :
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
                continue
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
            return True
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
397
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    54
    def fdb_ports (self) :
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    55
        """
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    56
            Map hosts in the brige FDB to specific ports.
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    57
        """
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    58
395
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
        for idx, data in self.table(DOT1D_TP_FDB_PORT) :
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
            addr, = idx
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
            port = data[DOT1D_TP_FDB_PORT]
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
            
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
            yield macaddr(addr), int(port)
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
397
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    65
    def vlan_fdb (self) :
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    66
        """
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    67
            Get FDB id -> vlan mappings.
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    68
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    69
                (fdb, vlan)
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    70
        """
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    71
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    72
        for idx, data in self.table(DOT1Q_VLAN_FDB_ID) :
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    73
            time, vlan = idx
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    74
            fdb = int(data[DOT1Q_VLAN_FDB_ID])
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    75
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    76
            yield fdb, vlan
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    77
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    78
    def vlan_fdb_ports (self) :
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    79
        """
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    80
            Get per-vlan host -> port mappings.
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    81
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    82
                (macaddr, port, vlan)
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    83
        """
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    84
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    85
        fdb_to_vlan = dict(self.vlan_fdb())
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    86
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    87
        for idx, data in self.table(DOT1Q_TP_FDB_PORT) :
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    88
            fdb, addr = idx
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    89
            port = data[DOT1Q_TP_FDB_PORT]
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    90
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    91
            vlan = fdb_to_vlan.get(fdb)
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    92
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    93
            yield macaddr(addr), int(port), vlan
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    94
8455f42d8926 pvl.snmp.bridge: dot1q support for per-vlan fdb's
Tero Marttila <terom@paivola.fi>
parents: 395
diff changeset
    95
395
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
if __name__ == '__main__':
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
    import doctest
9de553b50128 pvl.snmp.bridge: query bridge FDB for hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
    doctest.testmod()