# Manager side

## PDU var-binds to MIB objects

This script explains how Python application could turn SNMP PDU variable-bindings into MIB objects or the other way around.

The code that configures MIB compiler is similar to what happens inside the pysnmp.hlapi API.

    from pysnmp.smi import builder, view, compiler, rfc1902

    # Assemble MIB browser
    mibBuilder = builder.MibBuilder()
    mibViewController = view.MibViewController(mibBuilder)
    compiler.addMibCompiler(mibBuilder, sources=['file:///usr/share/snmp/mibs',
                                                 'http://mibs.snmplabs.com/asn1/@mib@'])

    # Pre-load MIB modules we expect to work with
    mibBuilder.loadModules('SNMPv2-MIB', 'SNMP-COMMUNITY-MIB')

    # This is what we can get in TRAP PDU
    varBinds = [
        ('1.3.6.1.2.1.1.3.0', 12345),
        ('1.3.6.1.6.3.1.1.4.1.0', '1.3.6.1.6.3.1.1.5.2'),
        ('1.3.6.1.6.3.18.1.3.0', '0.0.0.0'),
        ('1.3.6.1.6.3.18.1.4.0', ''),
        ('1.3.6.1.6.3.1.1.4.3.0', '1.3.6.1.4.1.20408.4.1.1.2'),
        ('1.3.6.1.2.1.1.1.0', 'my system')
    ]

    # Run var-binds through MIB resolver
    # You may want to catch and ignore resolution errors here
    varBinds = [rfc1902.ObjectType(rfc1902.ObjectIdentity(x[0]), x[1]).resolveWithMib(mibViewController) for x in varBinds]

    for varBind in varBinds:
        print(varBind.prettyPrint())

`Download` script.

## MIB objects to PDU var-binds

This script explains how Python application (typically pysnmp-based SNMP Manager) could turn SNMP PDU variable-bindings into MIB objects or the other way around.

The code below does not explicitly add MIB compiler - that happens behind the scenes. Examples below try to demo different kinds of MIB objects to work with.

    from pysnmp.smi import builder, view, rfc1902, error

    # MIB Builder manages pysnmp MIBs
    mibBuilder = builder.MibBuilder()

    # MIB View Controller implements various queries to loaded MIBs
    mibView = view.MibViewController(mibBuilder)

    # Obtain MIB object information by MIB object name
    mibVar = rfc1902.ObjectIdentity('IF-MIB', 'ifInOctets', 1)

    # Optionally attach PySMI MIB compiler to MIB Builder that would
    # create pysnmp MIBs on demand from ASN.1 sources downloaded from
    # a web site.
    try:
        mibVar.addAsn1MibSource('http://mibs.snmplabs.com/asn1/@mib@')
    except error.SmiError:
        print('WARNING: not using MIB compiler (PySMI not installed)')

    mibVar.resolveWithMib(mibView)

    print(mibVar.prettyPrint(), tuple(mibVar), str(mibVar))

    # Obtain MIB object information by its [sequence] OID
    mibVar = rfc1902.ObjectIdentity(tuple(mibVar)).resolveWithMib(mibView)

    print(mibVar.prettyPrint(), tuple(mibVar), str(mibVar))

    # Obtain MIB object information by its [string] OID
    mibVar = rfc1902.ObjectIdentity(str(mibVar)).resolveWithMib(mibView)

    print(mibVar.prettyPrint(), tuple(mibVar), str(mibVar))

    # Obtain MIB object information by a mix of OID/label parts
    mibVar = rfc1902.ObjectIdentity((1, 3, 6, 1, 2, 'mib-2', 1, 'sysDescr')).resolveWithMib(mibView)

    print(mibVar.prettyPrint(), tuple(mibVar), str(mibVar))

    # Obtain MIB object information by a label
    mibVar = rfc1902.ObjectIdentity('iso.org.dod.internet.mgmt.mib-2.system.sysDescr').resolveWithMib(mibView)

    print(mibVar.prettyPrint(), tuple(mibVar), str(mibVar))

    # Obtain the first MIB object in given MIB module
    mibVar = rfc1902.ObjectIdentity('SNMPv2-MIB').resolveWithMib(mibView)

    print(mibVar.prettyPrint(), tuple(mibVar), str(mibVar))

    # Obtain the last MIB object in given MIB module
    mibVar = rfc1902.ObjectIdentity('SNMPv2-MIB', last=True).resolveWithMib(mibView)

    print(mibVar.prettyPrint(), tuple(mibVar), str(mibVar))

    # Another way to obtain the first (or last) symbol in MIB module
    mibVar = rfc1902.ObjectIdentity('SNMPv2-MIB', '').resolveWithMib(mibView)

    print(mibVar.prettyPrint(), tuple(mibVar), str(mibVar))

    # Obtain MIB symbol from whatever MIB it is defined at (MIB should be loaded)
    mibVar = rfc1902.ObjectIdentity('', 'sysDescr', 0).resolveWithMib(mibView)

    print(mibVar.prettyPrint(), tuple(mibVar), str(mibVar))

    # Create an OID-value pair (called variable-binding in SNMP)
    varBind = rfc1902.ObjectType(
        rfc1902.ObjectIdentity('SNMPv2-MIB', 'sysObjectID', 0), '1.3.6.1'
    ).resolveWithMib(mibView)

    print(varBind[0].prettyPrint(), varBind[1].__class__.__name__, varBind[1].prettyPrint())

    # Create just OID
    varBind = rfc1902.ObjectType(
        rfc1902.ObjectIdentity('SNMPv2-MIB', 'sysObjectID', 0)
    ).resolveWithMib(mibView)

    print(varBind[0].prettyPrint(), varBind[1].__class__.__name__, varBind[1].prettyPrint())

    # Create var-binds from MIB notification object (without OBJECTS clause)
    varBinds = rfc1902.NotificationType(
        rfc1902.ObjectIdentity('SNMPv2-MIB', 'coldStart')
    ).resolveWithMib(mibView)

    print(['%s = %s(%s)' % (x[0].prettyPrint(), x[1].__class__.__name__, x[1].prettyPrint()) for x in varBinds])

    # Create var-binds from MIB notification object (with OBJECTS clause)
    varBinds = rfc1902.NotificationType(
        rfc1902.ObjectIdentity('IF-MIB', 'linkUp'),
        instanceIndex=(1,),
        objects={('IF-MIB', 'ifOperStatus'): 'down'}
    ).resolveWithMib(mibView)

    print(varBinds.prettyPrint())

`Download` script.

## SNMP MIB browser

This script explains how Python application (typically SNMP Manager) could load SNMP MIB modules into memory and introspect Managed Objects defined in MIB.

    from pysnmp.smi import builder, view, compiler, error

    # Create MIB loader/builder
    mibBuilder = builder.MibBuilder()

    # Optionally attach PySMI MIB compiler (if installed)
    #print('Attaching MIB compiler...'),
    #compiler.addMibCompiler(mibBuilder, sources=['/usr/share/snmp/mibs'])
    #print('done')

    # Optionally set an alternative path to compiled MIBs
    print('Setting MIB sources...')
    mibBuilder.addMibSources(builder.DirMibSource('/opt/pysnmp_mibs'))
    print(mibBuilder.getMibSources())
    print('done')

    print('Loading MIB modules...'),
    mibBuilder.loadModules(
        'SNMPv2-MIB', 'SNMP-FRAMEWORK-MIB', 'SNMP-COMMUNITY-MIB', 'IP-MIB'
        )
    print('done')

    print('Indexing MIB objects...'),
    mibView = view.MibViewController(mibBuilder)
    print('done')

    print('MIB symbol name lookup by OID: '),
    oid, label, suffix = mibView.getNodeName((1,3,6,1,2,1,1,1))
    print(oid, label, suffix)

    print('MIB symbol name lookup by label: '),
    oid, label, suffix = mibView.getNodeName((1,3,6,1,2,'mib-2',1,'sysDescr'))
    print(oid, label, suffix)

    print('MIB symbol name lookup by symbol description: '),
    oid, label, suffix = mibView.getNodeName(('sysDescr',))
    oid, label, suffix = mibView.getNodeName(('snmpEngineID',), 'SNMP-FRAMEWORK-MIB')
    print(oid, label, suffix)

    print('MIB object value pretty print: '),
    mibNode, = mibBuilder.importSymbols('SNMP-FRAMEWORK-MIB', 'snmpEngineID')
    print(mibNode.syntax.prettyPrint())

    print('MIB symbol location lookup by name: '),
    modName, symName, suffix = mibView.getNodeLocation(('snmpCommunityEntry',))
    print(symName, modName)

    print('MIB node lookup by location: '),
    rowNode, = mibBuilder.importSymbols(modName, symName)
    print(rowNode)

    print('Conceptual table index value to oid conversion: '),
    oid = rowNode.getInstIdFromIndices('router')
    print(oid)
    print('Conceptual table index oid to value conversion: '),
    print(rowNode.getIndicesFromInstId(oid))

    print('MIB tree traversal')
    oid, label, suffix = mibView.getFirstNodeName()
    while 1:
        try:
            modName, nodeDesc, suffix = mibView.getNodeLocation(oid)
            print('%s::%s == %s' % (modName, nodeDesc, oid))
            oid, label, suffix = mibView.getNextNodeName(oid)
        except error.NoSuchObjectError:
            break

    print('Modules traversal')
    modName = mibView.getFirstModuleName()
    while 1:
        if modName: print(modName)
        try:
            modName = mibView.getNextModuleName(modName)
        except error.SmiError:
            break

`Download` script.

See also: library reference.