Преобразование команды snmptrap в python (pysnmp или альтернативный) - PullRequest
0 голосов
/ 05 мая 2019

Я могу отправить команду snmptrap (net-snmp-utils) из оболочки, эквивалентную -

snmptrap -v2c -c public myhostname.com '' .1.3.6.1.4.1.1234.7.0.1 .1.3.6.1.4.1.1234.7.1 s desktop 1.3.6.1.4.1.1234.7.2 s "TESTING" .1.3.6.1.4.1.1234.7.3 s CODE

Я пытаюсь сделать то же самое через python3. Сообщения ловушки, отправленные из сценария, принимаются и обрабатываются сервером / агентом / менеджером. Однако те из python (код и выходные данные вставлены ниже) не достигают сервера.

До сих пор я использовал pysnmp

from pysnmp import debug
debug.setLogger(debug.Debug('msgproc'))
from pysnmp.hlapi.asyncore import *
next(sendNotification(
    SnmpEngine(),
    CommunityData('public', mpModel=1),
    UdpTransportTarget(('myhostname.com', 162)),
    ContextData(),
    'trap',
    NotificationType(
        ObjectIdentity('1.3.6.1.6.3.1.1.5.2')
    ).addVarBinds(
        ( '1.3.6.1.6.3.1.1.4.3.0', '.1.3.6.1.4.1.1234.7.0.1'),
        ('.1.3.6.1.4.1.1234.7.1', OctetString('desktop')),
        ('1.3.6.1.4.1.1234.7.2', OctetString('TESTING')),
        ('.1.3.6.1.4.1.1234.7.3', OctetString('CODE'))
    )
))

Выход

2019-05-03 12: 16: 02,881 pysnmp: StatusInformation: {'errorIndication': AccessAllowed ()} 2019-05-03 12: 16: 02,884 pysnmp: StatusInformation: {'errorIndication': AccessAllowed ()} 2019-05-03 12: 16: 02,886 pysnmp: StatusInformation: {'errorIndication': AccessAllowed ()} 2019-05-03 12: 16: 02,891 pysnmp: StatusInformation: {'errorIndication': AccessAllowed ()} 2019-05-03 12: 16: 02,899 pysnmp: prepareOutgoingMessage: использование contextEngineId subtypeSpec,> кодировка iso-885 9-1 полезная нагрузка [0x80004fb805c3c8cf48]> contextName b '' 2019-05-03 12: 16: 02,904 pysnmp: generateRequestMsg: Сообщение:

 version=1
 community=public
 data=PDUs:
  snmpV2-trap=SNMPv2TrapPDU:
   request-id=10163951
   error-status=noError
   error-index=0
   variable-bindings=VarBindList:
    VarBind:
     name=1.3.6.1.2.1.1.3.0
     =_BindValue:
      value=ObjectSyntax:
       application-wide=ApplicationSyntax:
        timeticks-value=0

    VarBind:
     name=1.3.6.1.6.3.1.1.4.1.0
     =_BindValue:
      value=ObjectSyntax:
       simple=SimpleSyntax:
        objectID-value=1.3.6.1.6.3.1.1.5.2

    VarBind:
     name=1.3.6.1.6.3.1.1.4.3.0
     =_BindValue:
      value=ObjectSyntax:
       simple=SimpleSyntax:
        objectID-value=1.3.6.1.4.1.1234.7.0.1

    VarBind:
     name=1.3.6.1.4.1.1234.7.1
     =_BindValue:
      value=ObjectSyntax:
       simple=SimpleSyntax:
        string-value=desktop

    VarBind:
     name=1.3.6.1.4.1.1234.7.2
     =_BindValue:
      value=ObjectSyntax:
       simple=SimpleSyntax:
        string-value=TESTING

    VarBind:
     name=1.3.6.1.4.1.1234.7.3
     =_BindValue:
      value=ObjectSyntax:
       simple=SimpleSyntax:
        string-value=CODE

При добавлении 'io' к отладчику я получаю это в конце - это стандартное сообщение или это означает, что сообщение было поставлено в очередь и не ушло?

2019-05-06 04: 55: 42,914 pysnmp: sendMessage: в очереди исходящее сообщение (164 октета) 00000: 30 81 A1 02 01 01 04 06 70 75 62 6C 69 63 A7 81

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Ваше сообщение не было отправлено, потому что основной цикл не был запущен.

Вы, вероятно, должны импортировать pysnmp.hlapi, в отличие от pysnmp.hlapi.asyncore, потому что первый в конечном итоге по умолчанию принимает значение pysnmp.hlapi.asyncore.sync, чтозапускает основной цикл только для одного запроса.

Модуль pysnmp.hlapi.asyncore является асинхронным.Это означает, что помимо отправки сообщения вам также необходимо запустить основной цикл (snmpEngine.transportDispatcher.runDispatcher()).Вы можете найти пример об асинхронном использовании, но, похоже, сейчас вам нужна только синхронная версия.

0 голосов
/ 05 мая 2019

Я не эксперт по pysnmp, но проблема, похоже, связана с настройками snmp.Вы договорились с агентом?пожалуйста, проверьте http://www.net -snmp.org / docs / man / snmpd.conf.html для настроек, таких как версия, rwusers, группы и т. д. Если вы хотите альтернативы, вы можете проверить: https://github.com/pief/python-netsnmpagent иhttps://github.com/hosthvo/pyagentx

netsnmpagent не может отправлять ловушки, но вы можете сами добавить эту спецификацию.

Я рекомендую pyagentx.Использование основного агента немного сложно, однако вы можете создать свой агентx и расширить его.Но не забудьте сделать настройки поверх snmpd.conf.

...