1 авг. 2012 г.

Python with SNMP

 Статья вновь из разряда "собрать самолет с нуля при потерянной инструкции". Кратко предыстория. Сначала пробовал PySNMP — не получилось. При запуске программы орет на пропущенные скобки, хотя все на месте.
Позже пробовал twistedsnmp — такая же проблема где-то пропущена закрывающаяся скобка и программа не запускается.
Отчаявшись — решил собрать библиотеку дла python'а из Net-snmp. При выполнении


python python.sh build

выдается более 20000 строк об ошибках и сообщение, что 'cc' имеет ошибки.

И тут, покапавшись в портах, нахожу программку с невзрачным названием 
yapsnmp (как позже оказалось это абривеатура). Установка прошла гладко. 
Но смутил пример автора для выполнения запроса:





yapsnmp.Session('router45-ny').walk('system')

Проблема была в следующем - т.к. у меня все мои девайсы используют 
разные версии snmp, то в примере автора не было указано ни версии 
протокола, ни комьюнити. Открыв доки - тоже не нашел ничего внятного, 
кроме того, что было в общих чертах указано что они могут быть. 
Попарился немного и о чудо!!! Программа заработала. Вот так все будет 
100% работать:

import yapsnmp
print yapsnmp.Session('10.10.1.1', version=2, community='public').walk('ifOperStatus')

А вот, собственно, вывод:





(('ifOperStatus.1', 'up'), ('ifOperStatus.2', 'up'), ('ifOperStatus.3', 'down'), ('ifOperStatus.4', 'down'), ('ifOperStatus.5', 'down'), ('ifOperStatus.6', 'down'), ('ifOperStatus.7', 'down'), ('ifOperStatus.8', 'down'), ('ifOperStatus.9', 'down'), ('ifOperStatus.10', 'down'), ('ifOperStatus.11', 'down'), ('ifOperStatus.12', 'down'), ('ifOperStatus.13', 'down'), ('ifOperStatus.14', 'down'), ('ifOperStatus.15', 'down'), ('ifOperStatus.16', 'down'), ('ifOperStatus.17', 'down'), ('ifOperStatus.18', 'down'), ('ifOperStatus.19', 'down'), ('ifOperStatus.20', 'down'), ('ifOperStatus.21', 'down'), ('ifOperStatus.22', 'down'), ('ifOperStatus.23', 'down'), ('ifOperStatus.24', 'down'), ('ifOperStatus.25', 'down'), ('ifOperStatus.26', 'down'), ('ifOperStatus.27', 'down'), ('ifOperStatus.28', 'down'), ('ifOperStatus.29', 'down'), ('ifOperStatus.30', 'down'), ('ifOperStatus.31', 'down'), ('ifOperStatus.32', 'down'), ('ifOperStatus.33', 'down'), ('ifOperStatus.34', 'down'), ('ifOperStatus.35', 'down'), ('ifOperStatus.36', 'down'), ('ifOperStatus.37', 'down'), ('ifOperStatus.38', 'down'), ('ifOperStatus.39', 'down'), ('ifOperStatus.40', 'down'), ('ifOperStatus.41', 'down'), ('ifOperStatus.42', 'down'), ('ifOperStatus.43', 'down'), ('ifOperStatus.44', 'down'), ('ifOperStatus.45', 'down'), ('ifOperStatus.46', 'down'), ('ifOperStatus.47', 'down'), ('ifOperStatus.48', 'down'), ('ifOperStatus.49', 'up'), ('ifOperStatus.50', 'down'), ('ifOperStatus.51', 'down'), ('ifOperStatus.52', 'up'))

Думаю, что кому-то пригодится.


UPD @2015.09.11
Разработка одного из проектов для ОС Ubuntu потребовала использование SNMP. Указанный ранее yapsnmp в репозитории не обнаружен. Пришлось использовать доступный python-netsnmp.
Работает следующим образом:

import netsnmp
ifOperStatus = '.1.3.6.1.2.1.2.2.1.8'
res = netsnmp.snmpwalk(ifOperStatus, Version=1, DestHost='***.***.***.***', Community='public')

Документация подразумевает немного другое использование
import netsnmp 
var = netsnmp.Varbind('sysDescr.0') 
res = netsnmp.snmpget(var, ...: Version = 1, ...: DestHost = 'localhost', ...: Community='public') 
print res ('Linux machine.pretendco.com 2.4.7-10lpc #1 Tue Nov 13 03:44:18 EST 2001 i686',)
Вся проблема в том, что в Ubuntu нужно дополнительно указывать соответствие MIB и OID. Следуя документации, получаю ошибку: 
error: walk: unknown object ID (sysDescr)None


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

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.