python net-загрузка mibs по snmp

#python #net-snmp #mib #pysnmp

#python #net-snmp #МиБ #pysnmp

Вопрос:

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

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

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

Комментарии:

1. Я не думаю, что вы когда-либо находили ответ на этот вопрос из других источников? Я столкнулся с тем же вопросом.

Ответ №1:

В конце концов, я нашел ответ. Со 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',)
>>> 
 

Комментарии:

1. фантастика! я также обнаружил, что, кроме того, вы можете изменить каталог MIB, в котором он выполняет поиск с помощью переменной среды MIBDIRS .

2. Я просто хочу сказать вам большое спасибо за упоминание экспорта переменной env перед загрузкой библиотеки. У меня возникла проблема с использованием easy-snmp, и, похоже, он не обрабатывал мою экспортированную переменную MIB, поэтому я попробовал то же самое, что вы рекомендовали, и это сработало без проблем. Единственное отличие заключалось в том, что мне пришлось экспортировать переменную перед импортом самой библиотеки.

Ответ №2:

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

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

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

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

sudo apt-get install snmp-mibs-downloader

Который, как и следовало ожидать, загрузит множество других стандартных MIBS (включая 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 команду, если вы хотите снова загрузить MIBS.

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

Мораль этой истории такова: если у вас есть правильный 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 директив конфигурации.

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

Комментарии:

1. спасибо за подробное объяснение. я не знал snmpconf (но сейчас знаю!) — однако, чего я действительно хотел, так это возможности программно управлять тем, какие mib-файлы (а не только каталоги) находятся в python. в любом случае спасибо!