pvl/snmp/traps.py
author Tero Marttila <terom@paivola.fi>
Tue, 10 Mar 2015 00:11:43 +0200
changeset 739 5149c39f3dfc
parent 435 d10e9db3fb24
permissions -rw-r--r--
pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
"""
    Trap handling
"""

TRAP_TYPE = {
    # Link Down
    2: 'IF-MIB::linkDown',
    
    # Link Up
    3: 'IF-MIB::linkUp',
}

# use subtype
TRAP_TYPE_ENTERPRISE = 6

VALUE_TYPE = {

}

def parse_snmptrapd_log (line):
    """
        Parse a line of data logged by snmptrapd using the following formats:

            format1     %B %N %w %q %W\t%v\n
            format2     %B\t%v\n
    """

    values = { }

    items = line.split('\t')

    header = items.pop(0)
    
    if ' ' in header:
        # XXX: some kind of compat wrapping of SNMPv1 TRAPs to fit the SNMPv2-TRAP model
        host, enterprise, trap_type, trap_subtype, trap_descr = header.split(' ', 4)

        trap_type = int(trap_type)

        values['SNMPv2-MIB::snmpTrapEnterprise.0'] = enterprise

        if trap_type == TRAP_TYPE_ENTERPRISE:
            # XXX: no idea why
            if trap_subtype.startswith('.'):
                trap_oid = enterprise + '.0' + trap_subtype
            else:
                trap_oid = trap_subtype
        else:
            trap_oid = TRAP_TYPE.get(trap_type, trap_type)

        values['SNMPv2-MIB::snmpTrapOID.0'] = trap_oid
    else:
        host = header

    for item in items:
        key, value = item.split(' = ', 1)
        value_type, value = value.split(': ', 1)

        func = VALUE_TYPE.get(value_type)

        if func:
            value = func(value)
        
        values[key] = value
    
    return host, values