You are viewing pyhedgehog

Fri, Dec. 14th, 2012, 06:56 pm
Обзор библиотек Python для работы с SNMP

Crosspost: https://docs.google.com/document/pub?id=1bVVnWh3V5d6V-THz6lWf1yAuzWAwhVZSYDJflSPOiSo

У всех найденных библиотек очень плохо с документацией.

netsnmp

Поставляется вместе с пакетом net-snmp (библиотекой и утилитами).

Проверенная версия: 1.0a1 (соответствует версии net-snmp 5.7.2) Текущую версию можно выяснить тут: http://www.net-snmp.org/about/ChangeLog.html  Источник: http://www.net-snmp.org/  Подробнее: http://www.net-snmp.org/wiki/index.php/Python_Bindings  Полезная статья: http://www.rootninja.com/how-to-write-simple-netsnmp-apps-in-python/

Плюсы:

  • Использует проверенную (и в большинстве случаев используемую в качестве “системной” библиотеку).
  • Поддерживает SNMPv3.

Минусы: Довольно бедный интерфейс:

  • Только синхронный интерфейс.
  • Только простейшие функции - get, getnext, set, walk.
  • Нет возможности ресолвить именованные OID’ы (хотя их можно использовать при запросах).
  • Нет “серверного” интерфейса (ловить запросы или trap’ы).

pysnmp

Проверенная версия: 4.2.3 Текущую версию можно выяснить тут: http://pypi.python.org/pypi/pysnmp/  Источник: http://pysnmp.sourceforge.net/

Плюсы:

  • Есть и серверный и клиентский интерфейс.
  • Поддерживаются все версии SNMP (1-3).
  • Есть ресолвинг именованных OID’в.
  • Есть и синхронный и асинхронный интерфейсы.
  • Не имеет проблем с переносимостью, поскольку написано на “чистом” python’е.

Минусы:

  • Совершенно невнятная организация модулей библиотеки.
  • Странное ограничение на ресолвинг - модуль нужно передавать отдельно (то есть самому разбивать по “::”, что особенно неудобно в местах куда хочется просто передать OID)

libsnmp

Проверенная версия: 4.2.3 Текущую версию можно выяснить тут: http://pypi.python.org/pypi/libsnmp/  Источник: http://www.seafelt.com/software/sources

Плюсы:

  • Достаточно прозрачный интерфейс.
  • Асинхронный интерфейс.
  • Вместо документации есть примеры скриптов (snmpget-v1, snmpget-v2, snmp-walk, traplistener, trapsender).
  • Не имеет проблем с переносимостью, поскольку написано на “чистом” python’е.

Минусы:

  • Сомнительная поддержка - сайт на который ссылается метаинформация не упоминает эту библиотеку вообще.
  • Только асинхронный интерфейс.
  • Нет поддержки SNMPv3.
  • Нет поддержки ресолвинга OID’ов ни в виде отдельного интерфейса, ни при вызове других функций.

Другие

Источник: http://pypi.python.org/pypi?%3Aaction=search&term=snmp&submit=search

Есть ещё много библиотек на которые у меня не хватило дыхания. Возможно там и скрываются жемчужины проектирования и реализации, но исследование “неудачников” я отложу до следующего раза...

Sat, Feb. 16th, 2013 08:44 am (UTC)
(Anonymous)

> Странное ограничение на ресолвинг - модуль нужно передавать отдельно (то есть самому разбивать по “::”, что особенно неудобно в местах куда хочется просто передать OID)

В SNMP (как в стандарте) есть понятие MIB-а и есть понятие имени объекта определенного в MIB-е. Но нет определенного синтаксиса для адресации символа в MIB-е. Нотация :: принята в имплементации command-line утилит Net-SNMP. Не факт что эту нотацию хорошо и правильно использовать в API библиотек(и).

И еще - вроде бы pysnmp позволяет передавать просто OID, без имени модуля.

=Глеб

Sun, Feb. 17th, 2013 02:31 pm (UTC)
pyhedgehog

Интересное замечание. С одной стороны это очень логично, но с другой стороны Net-SNMP является де факто стандартом вместе со своей нотацией. Логично было бы сделать отдельную функцию позволяющую ресолвить "полное имя". Впрочем, насколько я помню в разрабатываемой версии такая функция появилась. :)

Thu, Jun. 27th, 2013 05:54 pm (UTC)
zhmark

8 лет назад мне нравился yapsnmp. netsnmp - (был?) для роботов, а этот - для людей. спасибо за список - скоро может понадобиться.

Thu, Jun. 27th, 2013 06:48 pm (UTC)
pyhedgehog

Да, я его (в числе прочих) потом тоже поисследовал и по ссылке на google docs это видно. С ним большая проблема - как только нужно что-то, что не соответствует его настройкам по умолчанию, тут же нужно становится на голову.