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