загрузка Python Net-SNMP Mibs - PullRequest
       16

загрузка Python Net-SNMP Mibs

4 голосов
/ 28 октября 2011

Я использую библиотеки python net-snmp для выполнения длинных запросов на различных коммутаторах. Я хотел бы иметь возможность загружать новые MIB, но не могу найти никакой документации о том, как это сделать.

PySNMP выглядит довольно сложным и требует от меня создания объектов Python для каждой MIB (что не масштабируется для меня); так что я застрял с библиотеками net-snmp (что неплохо, за исключением загрузки mib).

Я знаю, что могу использовать опции -m и -M с инструментами командной строки net-snmp, и есть документация по предварительной компиляции пакета net-snmp (./configure, make и т. Д.) со всеми MIBS (и я полагаю, в библиотеки тоже); если библиотеки Python не предлагают возможность загрузки MIB, могу ли я хотя бы настроить net-snmp для предоставления моим библиотекам Python доступа к MIB без перекомпиляции?

Ответы [ 2 ]

3 голосов
/ 28 февраля 2012

Я все-таки нашел ответ.Со страницы руководства snmpcmd(1):

   -m MIBLIST
          Specifies a colon separated  list  of  MIB  modules  (not
          files)  to load for this application.  This overrides (or
          augments) the environment variable  MIBS,  the  snmp.conf
          directive  mibs,  and the list of MIBs hardcoded into the
          Net-SNMP library.

Ключевой момент здесь заключается в том, что вы можете использовать переменную окружения MIBS так же, как вы используете опцию командной строки -m ... и эту поддержкудля этого реализуется на уровне библиотеки.Это означает, что если вы определите переменную окружения MIBS до запуска Python, это повлияет на поведение библиотеки netsnmp:

$ python 
Python 2.7.2 (default, Oct 27 2011, 01:40:22) 
[GCC 4.6.1 20111003 (Red Hat 4.6.1-10)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> import netsnmp
>>> os.environ['MIBS'] = 'UPS-MIB:SNMPv2-SMI'
>>> oid = netsnmp.Varbind('upsAlarmOnBattery.0')
>>> netsnmp.snmpget(oid, Version=1, DestHost='myserver', Community='public')
('0',)
>>> 

Обратите внимание, что вы должны установить os.environ['MIBS'] до того, как вызов любой из функций модуля netsnmp (поскольку это приведет к загрузке библиотеки и любые изменения среды после этого не окажут никакого влияния).

Вы можете (очевидно) также установить переменную среды вне Python:

$ export MIBS='UPS-MIB:SNMPv2-SMI'
$ python
>>> import netsnmp
>>> oid = netsnmp.Varbind('upsAlarmOnBattery.0')
>>> netsnmp.snmpget(oid, Version=1, DestHost='myserver', Community='public')
('0',)
>>> 
2 голосов
/ 21 декабря 2012

(Первое сообщение !!!)

Технически вам не нужно инициализировать или экспортировать переменные окружения, если вы правильно настроили net-snmp.

(отмечая, что я включенUbuntu 12.04.1 LTS, так что мне действительно не нужно было компилировать net-snmp из исходного кода, и даже хотя я рассмотрю все, что я сделал для полноты, это действительно должно применяться, только если вы хотите настроить некоторые MIB длябыть автоматически подхваченным net-snmp или его привязками Python.)

Сначала я сделал sudo apt-get install libsnmp-base libsnmp-python libsnmp15 snmp

Это установит net-snmp и его библиотеки, а также привязки Python.Он также устанавливает некоторые MIB по умолчанию (только для net-snmp) в /usr/share/mibs/netsnmp/.Если вы хотите получить кучу других MIB IETF / IANA, выполните:

sudo apt-get install snmp-mibs-downloader

, которая, как и следовало ожидать, загрузит тонну других стандартных MIB (включая IF-MIB и тому подобное) в /var/lib/mibs/iana, /var/lib/mibs/ietf, а также /usr/share/mibs/iana и /usr/share/mibs/ietf.Пакет snmp-mibs-downloader также дает команду /usr/bin/download-mibs, если вы хотите снова загрузить MIB.

Далее, используйте команду snmpconf, чтобы настроить среду net-snmp:

$ snmpconf -h
/usr/bin/snmpconf [options] [FILETOCREATE...]
options:
  -f           overwrite existing files without prompting
  -i           install created files into /usr/share/snmp.
  -p           install created files into /home/$USER/.snmp.
  -I DIR       install created files into DIR.
  -a           Don't ask any questions, just read in current
               current .conf files and comment them
  -r all|none  Read in all or none of the .conf files found.
  -R file,...  Read in a particular list of .conf files.
  -g GROUP     Ask a series of GROUPed questions.
  -G           List known GROUPs.
  -c conf_dir  use alternate configuration directory.
  -q           run more quietly with less advice.
  -d           turn on debugging output.
  -D           turn on debugging dumper output.

Я использовал snmpconf -p и прошелся по пунктам меню.Процесс в основном ищет существующие файлы snmp.conf (/etc/snmp/snmp.conf по умолчанию) и объединяет их с вновь созданным конфигурационным файлом, который будет помещен в /home/$USER/.snmp/snmp.conf, указанный параметром -p.С этого момента вам действительно нужно только указать snmpconf, где искать MIB, но есть ряд полезных опций, которые предоставляет скрипт для генерации директив конфигурации в snmp.conf.

Вам следуетпосле работы с snmpconf у вас будет в основном рабочая среда.Вот как выглядит моя (очень голая) /home/$USER/.snmp/snmp.conf:

###########################################################################
#
# snmp.conf
#
#   - created by the snmpconf configuration program
#

###########################################################################
# SECTION: Textual mib parsing
#
#   This section controls the textual mib parser.  Textual
#   mibs are parsed in order to convert OIDs, enumerated
#   lists, and ... to and from textual representations
#   and numerical representations.

# mibdirs: Specifies directories to be searched for mibs.
#   Adding a '+' sign to the front of the argument appends the new
#   directory to the list of directories already being searched.
#   arguments: [+]directory[:directory...]

mibdirs : +/usr/share/mibs/iana:/usr/share/mibs/ietf:/usr/share/mibs/netsnmp:/home/$USERNAME/.snmp/mibs/newmibs

# mibs: Specifies a list of mibs to be searched for and loaded.
#   Adding a '+' sign to the front of the argument appends the new
#   mib name to the list of mibs already being searched for.
#   arguments: [+]mibname[:mibname...]

mibs +ALL

Некоторые ошибки:

  1. Когда net-snmp загружает этот файл конфигурации, он не выполняетрекурсивный поиск в каталоге, поэтому вы должны указать абсолютный путь к каталогу, в котором находятся MIB.
  2. Если вы решите указать net-snmp, чтобы загрузить все 300+ MIB в эти каталоги, это может замедлить работу вашего SNMPзапросов, и некоторые вещи должны быть сброшены в STDERR из-за того, что некоторые MIB либо устарели, либо неправильно, либо пытались импортировать определения из MIB, которые не существуют или не были загруженыпакет.Возможны следующие варианты: скажите snmpconf, как вы хотите, чтобы эти ошибки обрабатывались, или выясните, что отсутствует или устарело, и загрузите MIB самостоятельно.Если вы пойдете за последним, вы можете оказаться в кроличьей норе MIB, так что имейте это в виду.Лично я бы предложил, чтобы вы загрузили их все, а затем работали в обратном направлении, чтобы загружать только те MIB, которые имеют смысл для опроса определенного устройства.
  3. Порядок каталогов, который вы указываете в пути поиска вsnmp.conf важно, особенно если некоторые MIB ссылаются или зависят от других MIB.Я сделал одну ошибку, которую ушел, просто взяв файл MIB в каталоге iana и переместив его в каталог ietf.Я уверен, что есть способ программно выяснить, какие MIB зависят от других, и заставить их счастливо сосуществовать в одном каталоге, но я не хотел тратить кучу времени, пытаясь выяснить это.

Мораль этой истории в том, что если у вас есть надлежащий snmp.conf, вы должны просто сделать это:

$ python
>>> import netsnmp
>>> oid = netsnmp.VarList(netsnmp.Varbind('dot1qTpFdbPort'))
>>> res = netsnmp.snmpwalk(oid, Version=2, DestHost='10.0.0.1', Community='pub')
>>> print res
('2', '1')
>>>

К вашему сведению Я пропустил кучу STDERR выходных, ноОпять же, вы можете сконфигурировать свою среду для выгрузки STDERR в лог-файл, если вы хотите через snmp.conf директивы конфигурации.

Надеюсь, это поможет.

...