2017-02-22 20 views
0

мне наконец удалось сгенерировать Получить команду к моей собственной MIB со следующим скриптом питона:Как сгенерировать набор команды для моей собственной MIB

from pysnmp.entity.rfc3413.oneliner import cmdgen 

errorIndication, errorStatus, errorIndex, varBinds = cmdgen.CommandGenerator().getCmd(
     cmdgen.CommunityData('10.0.1.134', 'admin', 0), 
     cmdgen.UdpTransportTarget(('10.0.1.134', 161)), 
     (1,3,6,1,4,1,4515,1,8,1,1,1,8,1295360,1295360) 
) 

print (varBinds) 

print (varBinds[0]) 

print (varBinds[0][0]) 

print (varBinds[0][1]) 

varBinds печать в 4-х различных способах была только для процесс изучения. Теперь я попытался подражать одному и тому же скрипту, превратив его в команду Set (без каких-либо успехов). Есть много примеров, которые можно получить, но не установлены. Итак, я пробовал следующее:

from pysnmp.entity.rfc3413.oneliner import cmdgen 

errorIndication, errorStatus, errorIndex, rspVarBinds = cmdgen.CommandGenerator().setCmd(
     cmdgen.CommunityData('10.0.1.134', 'admin', 0), 
     cmdgen.UdpTransportTarget(('10.0.1.134', 161)), 
     (1,3,6,1,4,1,4515,1,8,1,1,1,8,1295360,1295360), 
     (1), 
) 

Мне не удалось создать команду Set, как вы можете видеть. И я не понимаю, как я могу заставить его работать. Кстати, OID, который я устанавливаю, представляет собой чтение-запись Integer (32 бит) со следующими возможными значениями: up (1), down (2) и standby (3).

Что мне нужно изменить, чтобы преуспеть в установке OID с любым из возможных значений?

Я попробовал ваш сценарий и предложил не удалось:

from pysnmp.hlapi import SnmpEngine, setCmd, CommunityData, UdpTransportTarget, ContextData, ObjectType, ObjectIdentity 

from pysnmp.proto.api.v2c import Integer32 
setCmd(SnmpEngine(), 
     CommunityData('public', mpModel=0), 
     UdpTransportTarget('10.0.1.134', 161), 
     ContextData(), 
     ObjectType(ObjectIdentity('1.3.6.1.4.1.4515.1.8.1.1.1.8.1295360.1295360'), Integer32(1))) 

Это сообщения об ошибках, которые я получил:

** Traceback (самый последний вызов последним): Файл «C: \ Program Файлы \ Python35 \ lib \ site-packages \ pysnmp-4.3.2-py3.5.egg \ pysnmp \ hlapi \ asyncore \ transport.py ", строка 56, в _resolveAddr socket.IPPROTO_UDP) [0] [4] [: 2] Файл «C: \ Program Files \ Python35 \ lib \ socket.py», строка 732, в getaddrinfo для res в _socket.getaddrinfo (хост, порт, семейство, тип, прото, флаги): socket.gaierror: [ Errno 11004] getaddrinfo fai привело

Во время обработки вышеуказанного исключения, другое исключение произошло:

Traceback (самый последний вызов последнего): файл "", линия 3, в Файл «C: \ Program Files \ Python35 \ Lib \ site-packages \ pysnmp-4.3.2-py3.5.egg \ pysnmp \ hlapi \ transport.py ", строка 17, в init self.transportAddr = self._resolveAddr (transportAddr) Файл" C: \ Program Files \ Python35 \ lib \ site-packages \ pysnmp-4.3.2-py3.5.egg \ pysnmp \ hlapi \ asyncore \ transport.py ", строка 58, в сообщении об ошибке _resolveAddr.PySnmpError ('Плохой IPv4/UDP-транспортный адрес% s:% s '% (' @ '. join ([str (x) для x в transportAddr]), sys.exc_info() [1])) pysnmp.error.PySnmpError: Bad IPv4/U DP транспортный адрес 1 @ 0 @. @ 0 @. @ 1 @. @ 1 @ 3 @ 4: [Errno 11004] getaddrinfo failed **

Что мне нужно сделать, чтобы исправить это?

ответ

0

Вы должны обернуть OID-значение пары (ы) в ObjectType объект (ы):

setCmd(SnmpEngine(), 
     CommunityData('public', mpModel=0), 
     UdpTransportTarget(('demo.snmplabs.com', 161)), 
     ContextData(), 
     ObjectType(ObjectIdentity('1.3.6.1.2.1.1.9.0'), Integer32(1))) 

код выше на самом деле не использовать любые MIBs. Если вы хотите работать на более человек дружит, вы можете заменить OID с MIB модулем + символом и целым с метким (как описано в MIB):

setCmd(SnmpEngine(), 
     CommunityData('public', mpModel=0), 
     UdpTransportTarget(('demo.snmplabs.com', 161)), 
     ContextData(), 
     ObjectType(ObjectIdentity('MY-CUSTOM-MIB', 'myCustomVariable', 0), 'up')) 

Вот working example.

+0

Я попробовал ваш предложенный сценарий, и что-то все еще отсутствует. Я отредактировал мой вопрос выше –

+0

Я нашел свою ошибку, мне не хватало скобок в UdpTransportTarget. Теперь я могу запустить свой скрипт без каких-либо ошибок. Моя проблема в том, что команда Set на самом деле не выполняется (я выполняю команду Get commanf через MIB Browser).Мне удалось выполнить действие Get на том же OID, что и раньше (скрипт python). Может быть, мне не хватает ожидания или что-то в этом роде? Есть ли способ отладить это дальше? –

+0

Я снова узнал, чего не хватает. Поскольку я совершенно не знаком с python, я не понял, во-первых, что setCmd (...) - это только оператор, и для того, чтобы отправить команду Set, мне нужно что-то еще. Я узнал, что если я сделаю следующий (setCmd (...)), чем выполняется команда Set (проверена с помощью сниффера). Кстати, есть ли другой способ, кроме использования следующего, применить setCmd? Спасибо за помощь, вы отлично справляетесь. –