# Agent side

## Implementing MIB objects

This script explains how SNMP Agent application could model real-world data as Managed Objects defined in MIB.

    from pysnmp.smi import builder

    # MIB Builder is normally pre-created by SNMP engine
    mibBuilder = builder.MibBuilder()

    #
    # This may be done in a stand-alone file and then loaded up
    # by SNMP Agent
    #

    # A base class for a custom Managed Object
    MibScalarInstance, = mibBuilder.importSymbols(
        'SNMPv2-SMI', 'MibScalarInstance'
    )

    # Managed object specification
    sysLocation, = mibBuilder.importSymbols('SNMPv2-MIB', 'sysLocation')

    # Custom Managed Object
    class MySysLocationInstance(MibScalarInstance):
        # noinspection PyUnusedLocal
        def readGet(self, name, *args):
            # Just return a custom value
            return name, self.syntax.clone('The Leaky Cauldron')

    sysLocationInstance = MySysLocationInstance(
        sysLocation.name, (0,), sysLocation.syntax
    )

    # Register Managed Object with a MIB tree
    mibBuilder.exportSymbols(
        # '__' prefixed MIB modules take precedence on indexing
        '__MY-LOCATION-MIB', sysLocationInstance=sysLocationInstance
    )

    if __name__ == '__main__':
        #
        # This is what is done internally by Agent.
        #
        from pysnmp.smi import instrum, exval

        mibInstrum = instrum.MibInstrumController(mibBuilder)

        print('Remote manager read access to MIB instrumentation (table walk)')
        oid, val = (), None
        while 1:
            oid, val = mibInstrum.readNextVars(((oid, val),))[0]
            if exval.endOfMib.isSameTypeWith(val):
                break
            print(oid, val.prettyPrint())

`Download` script.

## Agent operations on MIB

This script explains how SNMP Agent application manipulates its MIB possibly triggered by SNMP Manager’s commands.

    # SNMP agent backend e.g. Agent access to Managed Objects
    from pysnmp.smi import builder, instrum, exval

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

    print('Building MIB tree...'),
    mibInstrum = instrum.MibInstrumController(mibBuilder)
    print('done')

    print('Building table entry index from human-friendly representation...'),
    snmpCommunityEntry, = mibBuilder.importSymbols(
        'SNMP-COMMUNITY-MIB', 'snmpCommunityEntry'
    )
    instanceId = snmpCommunityEntry.getInstIdFromIndices('my-router')
    print('done')

    print('Create/update SNMP-COMMUNITY-MIB::snmpCommunityEntry table row: ')
    varBinds = mibInstrum.writeVars(
        ((snmpCommunityEntry.name + (2,) + instanceId, 'mycomm'),
         (snmpCommunityEntry.name + (3,) + instanceId, 'mynmsname'),
         (snmpCommunityEntry.name + (7,) + instanceId, 'volatile'))
    )
    for oid, val in varBinds:
        print('%s = %s' % ('.'.join([str(x) for x in oid]), not val.isValue and 'N/A' or val.prettyPrint()))
    print('done')

    print('Read whole MIB (table walk)')
    oid, val = (), None
    while True:
        oid, val = mibInstrum.readNextVars(((oid, val),))[0]
        if exval.endOfMib.isSameTypeWith(val):
            break
        print('%s = %s' % ('.'.join([str(x) for x in oid]), not val.isValue and 'N/A' or val.prettyPrint()))
    print('done')

    print('Unloading MIB modules...'),
    mibBuilder.unloadModules()
    print('done')

`Download` script.

See also: library reference.