17 апреля 2012

Что юзать в Python'е для SNMP...

Для snmp в питоне есть несколько библиотек но у всех свои недостатки.

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]
Вообщем я негодуэ!

2 комментария:

  1. Анонимный06 июля, 2012 08:44

    Вообще, большую часть админских и автоматизаторских задач на Питоне лучше решать не с помощью дополнительно устанавливаемых модулей, а с помощью такого-вот использования CLI-утилит.
    То есть, если взялся использовать в качестве шелла Питон, то иди до конца, и применяй стандартные шелловские методы: пайпы и вызов консольных утилит :)

    ОтветитьУдалить
  2. 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()

    Даже подсократить можно, вместо первых трех строк, написав две :))

    ОтветитьУдалить