Запрос SNMP SET с использованием Python

Мне нужно управлять простым устройством через SNMP с использованием Python 3.7, чтобы включить его (1) и выключить (0). В руководстве по устройству, в информации MIB, есть список OID для каждой команды (например: GET выходной статус: 1.3.6........).

Мне удается заставить запрос GET работать так, как мне нравится (источник: http://snmplabs.com/pysnmp/examples/hlapi/asyncore/sync/manager/cmdgen/snmp-versions.html):

from pysnmp.hlapi import *

    g = getCmd(SnmpEngine()
              , CommunityData('public', mpModel=1)
              , hlapi.UdpTransportTarget(('DEVICE IP', 161))
              , ContextData()
              , ObjectType(ObjectIdentity('GET OID given by the device manual')))

    errorIndication, errorStatus, errorIndex, varBinds = next(g)

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

Однако, когда я пытаюсь использовать SET таким же образом: (источник: http://snmplabs.com/pysnmp/examples/hlapi/asyncore/sync/manager/cmdgen/modifying-variables.html)

from pysnmp.hlapi import *
g = setCmd(SnmpEngine()
           , CommunityData('public', mpModel=1)
           , hlapi.UdpTransportTarget(('DEVICE IP', 161))
           , ContextData()
           , ObjectType(ObjectIdentity('SET OID given by the device manual, which is the same as the GET'), '1') #1 = new value
           )

errorIndication, errorStatus, errorIndex, varBinds = next(g)

print(errorIndication, varBinds)

Я получаю следующую ошибку:

MibNotFoundError: SET OID compilation error(s): missingcaused by <class 'pysnmp.smi.error.MibNotFoundError'>: MIB file "SET OID.py[co]" not found in search path (DirMibSource('/home/username/anaconda3/lib/python3.7/site-packages/pysnmp/smi/mibs'), DirMibSource('/home/username/anaconda3/lib/python3.7/site-packages/pysnmp/smi/mibs/instances'), DirMibSource('pysnmp_mibs'), DirMibSource('/home/username/.pysnmp/mibs'))

Я не понимаю, почему в одном случае работает без проблем, а в другом нет. В руководстве по устройству инструкция такая же, как и GET, но в конце есть STRING 0 или 1, видимо, я что-то упустил, но не нашел, как это написать.

Я просто хочу дать эту очень простую инструкцию, если у кого-то есть простой ответ или альтернатива.

Большое Вам спасибо

P.S. : я также попробовал это руководство (https://www.ictshore.com/sdn/python-snmp-tutorial/), которые создают свои собственные функции, и снова работает GET, но не SET. Я понял, что мой OID не Object-TYPE.


person C.Pail    schedule 11.02.2019    source источник
comment
Похоже, вы не даете ему OID (например, 1.3.6.1.2.3.4.5.0), но какой-то строковый литерал, который pysnmp обрабатывает как файл MIB, который он не может найти. Может быть, обновить код вашего примера, чтобы включить фактический OID?   -  person Ilya Etingof    schedule 11.02.2019
comment
У меня есть OID 0.1.3.6.1.4.1.21287.16.1.0. Это для вывода GET, и это сработало. Но для SET Output у меня есть 0.1.3.6.1.4.1.21287.16.1.0 ; STRING 0 или 1, и я не знаю, как включить последнюю часть. Спасибо за ваш интерес.   -  person C.Pail    schedule 12.02.2019


Ответы (1)


Когда вы передаете значение setCMD(), оно (очевидно) должно быть типом объекта pysnmp.hlapi. Например:

from pysnmp.hlapi import *
engine = SnmpEngine()
community = CommunityData('public', mpModel=1)
transport = UdpTransportTarget(('192.168.1.1', 161))
context = ContextData()

# Your OID goes here.
identity = ObjectIdentity('1.3.6.1.4.1.534.6.6.7.6.1.1.3.0')

# If this was a string value, use OctetString() instead of Integer().
new_value = Integer(1)
type = ObjectType(identity, new_value)

# Setting lookupMib=False here because this example uses a numeric OID.
g = setCmd(engine, community, transport, context, identity, type, lookupMib=False)

errorIndication, errorStatus, errorIndex, varBinds = next(g)
print(errorIndication, varBinds)

Возможно, я упускаю какую-то тонкость использования pysnmp.hlapi, но это заклинание сработало для меня.

person Kyle    schedule 14.10.2020