PySNMP Project Logo

Project diary
Documentation
Examples
License
Download
Mailing lists

Projects using PySNMP
TwistedSNMP
Zenoss


Relevant projects
SNMPy
YAPSNMP
LibSMI
Scotty software

SourceForge Logo

"""Command Responder Application (GETNEXT PDU)"""
from pysnmp.mapping.udp.role import Agent
from pysnmp.proto.api import alpha

mibInstVer = alpha.protoVersions[alpha.protoVersionId1]
mibInstr = [ (mibInstVer.ObjectName('1.3.6.1'), 'Integer', 26011971),
             (mibInstVer.ObjectName('1.3.6.2'), 'OctetString', __doc__) ]

def cbFun(tsp, metaReq, (wholeMsg, transportAddr)):
    metaReq.berDecode(wholeMsg)
    req = metaReq.apiAlphaGetCurrentComponent()

    # Build response from request object
    rsp = req.apiAlphaReply()

    # Support only a single PDU type (but any proto version)
    if req.apiAlphaGetPdu().apiAlphaGetPduType() == \
           alpha.getNextRequestPduType:
        # Produce response var-binds
        varBinds = []; errorIndex = -1
        for oid, val in map(lambda x: x.apiAlphaGetOidVal(),
                            req.apiAlphaGetPdu().apiAlphaGetVarBindList()):
            mibIdx = -1; errorIndex = errorIndex + 1
            # Search next OID to report
            for idx in range(len(mibInstr)):
                if idx == 0:
                    if oid < mibInstr[idx][0]:
                        mibIdx = idx
                        break
                else:
                    if oid >= mibInstr[idx-1][0] and oid < mibInstr[idx][0]:
                        mibIdx = idx
                        break
            else:
                # Out of MIB
                rsp.apiAlphaGetPdu().apiAlphaSetEndOfMibIndices(errorIndex)

            # Report value if OID is found
            if mibIdx != -1:
                mibOid, mibVar, mibVal = mibInstr[mibIdx]                
                ver = alpha.protoVersions[rsp.apiAlphaGetProtoVersionId()]
                if hasattr(ver, mibVar):
                    varBinds.append((ver.ObjectName(mibOid), \
                                     getattr(ver, mibVar)(mibVal)))
                    continue
                else:
                    # Variable not available over this proto version
                    rsp.apiAlphaGetPdu().apiAlphaSetErrorIndex(errorIndex)
                    rsp.apiAlphaGetPdu().apiAlphaSetErrorStatus(5)

            varBinds.append((oid, val))

        apply(rsp.apiAlphaGetPdu().apiAlphaSetVarBindList, varBinds)
    else:
        # Report unsupported request type
        rsp.apiAlphaGetPdu().apiAlphaSetErrorStatus(5)
        print '%s (version ID %s) from %s: unsupported request type' % \
              (req.apiAlphaGetPdu().apiAlphaGetPduType(), \
               req.apiAlphaGetProtoVersionId(), transportAddr)
    
    # Return response object & manager's address
    return (rsp.berEncode(), transportAddr)

metaReq = alpha.MetaMessage()

tsp = Agent((cbFun, metaReq), [('localhost', 1161)])
tsp.receiveAndSend()

Need help? Try PySNMP mailing lists.