带有PySnmp的异步snmp表遍历

问题描述 投票:1回答:1

我尝试与PySnmp异步收集表,但示例仅返回第一条记录。

有人可以建议出什么问题吗?

import asyncio
from pysnmp.hlapi.asyncio import *

@asyncio.coroutine
def run():
    snmp_engine=SnmpEngine()
    count=0
    while True:
        errorIndication, errorStatus, errorIndex, varBinds = yield from nextCmd(
            snmp_engine,
            CommunityData('public'),
            UdpTransportTarget(('demo.snmplabs.com', 161)),
            ContextData(),
            ObjectType(ObjectIdentity('SNMPv2-MIB', 'system')),
        )

        for next_var in varBinds:
            print(next_var[0])

        count+=1
        #break
        if count > 10:
            break

asyncio.get_event_loop().run_until_complete(run())  
python-3.5 python-asyncio pysnmp
1个回答
0
投票

我最近遇到了同样的问题。我认为异步nextCmd不能像同步nextCmd一样工作。您必须在每次迭代中更新oid。此代码可能有帮助:

import asyncio
from pysnmp.hlapi.asyncio import *


def inc_oid(oid):
    _oid = oid.split(".")
    lastint = int(_oid[-1])
    _oid[-1] = str(lastint + 1)
    return ".".join(_oid)

snmp_engine=SnmpEngine()

@asyncio.coroutine
def snmp_walk_async(oid):
    endoid = inc_oid(oid)
    while True:
        errorIndication, errorStatus, errorIndex, varBinds = yield from nextCmd(
            snmp_engine,
            CommunityData("public"),
            UdpTransportTarget(("demo.snmplabs.com", 161)),
            ContextData(),
            ObjectType(ObjectIdentity(oid)),
            lexicographicMode=False,
        )

        #Some Error Checkings

        varBind = varBinds[0][0]
        oid, value = varBind
        oid = str(oid)

        if oid >= endoid:
            break

        for varBind in varBinds:
            print(' = '.join([x.prettyPrint() for x in varBind]))


asyncio.get_event_loop().run_until_complete(snmp_walk_async("1.3.6.1.2.1.1"))  
© www.soinside.com 2019 - 2024. All rights reserved.