yapsnmp - быстрая, простая библиотека, но не обновлялась с 2004 года и имеет некоторые глюки. Для установки во всякие там Линуксы требуется бубен. Не работают многие флаги, например PRINT_NUMERIC_OIDS(http://sourceforge.net/tracker/?func=detail&aid=1119247&group_id=21077&atid=121077).
PySNMP - хорошая документация, но работает ОООооочень медленно, причем даже в тредах. Для большого объема данных не подходит.
Net-SNMP - обертка на питоне для netsnmp. Работает, синтаксис сложный.
Для просмотра таблицы коммутации используется команда типа:
snmpwalk -v 2c -c mycomm 192.168.1.100 1.3.6.1.2.1.17.7.1.2.2.1.2 -O n
Флаг -0 n означает вывод в цифровом виде (вместо бинарного).
Если Вы хотите запрограммировать эту команду на питоне, то yapsnmp не подходит из-за флагов, pysnmp неподойдет если вам нужно например пройти пару сотен/тысяч свичей. Net-SNMP слишком много букв писать в коде для такой простой команды. Поэтому как решение можно делать так:
for ip in hosts: fdb = os.popen("snmpwalk -v 2c -c mycomm %s 1.3.6.1.2.1.17.7.1.2.2.1.2 -O n" % ip) try: tmp = map(int, e.replace("= INTEGER:", ".").replace("\n", "").split(".")[1:]) except Exception, e: print e continue mac = "%02x:%02x:%02x:%02x:%02x:%02x" % tuple(i for i in tmp[-7:-1]) port = tmp[-1] vlan = tmp[-8]Вообщем я негодуэ!
Вообще, большую часть админских и автоматизаторских задач на Питоне лучше решать не с помощью дополнительно устанавливаемых модулей, а с помощью такого-вот использования CLI-утилит.
ОтветитьУдалитьТо есть, если взялся использовать в качестве шелла Питон, то иди до конца, и применяй стандартные шелловские методы: пайпы и вызов консольных утилит :)
PySnmp не работает с тредами, у неё есть возможность асинхронного создания запросов, но работает медленней чем, например, net-snmp с тредами.
ОтветитьУдалитьNet-SNMP - непонятно, что сложного в синтаксисе? По-моему точно такой же как у yapsnmp. Код примера на netsnmp будет выглядеть так:
snmp = netsnmp.Session(Version = 2, DestHost=ip, Community=community)
oids = netsnmp.VarList(netsnmp.Varbind('.1.3.6.1.2.1.17.7.1.2.2.1.2'))
snmp.walk(oids)
for oid in oids:
oid.print_str()
Даже подсократить можно, вместо первых трех строк, написав две :))