Нужно получить таблицы MAC-адресов от коммутаторов d-link с помощью python

Вероятно, мне следует использовать SNMP v2c и pysnmp, но я не могу понять, как это сделать четко, возможно, мне нужен список портов для словарей массива Mac. В любом случае, я собираюсь вставить это в mongodb, а затем получить номер порта с MAC-адресом.

Вот команда оболочки, которая дает эту информацию

snmpwalk -O0sUX -v2c -Cc -c public 10.77.10.8 BRIDGE-MIB::dot1dTpFdbPort

обновление: https://github.com/edikmkoyan/portmatrix/blob/master/portmatrix.py


person Edik Mkoyan    schedule 26.01.2016    source источник


Ответы (1)


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

from pysnmp.hlapi import *

for (errorIndication,
     errorStatus,
     errorIndex,
     varBindTable) in bulkCmd(SnmpEngine(),
                              CommunityData('public'),
                              UdpTransportTarget(('demo.snmplabs.com', 161)),
                              ContextData(),
                              0, 25,
                              ObjectType(ObjectIdentity('BRIDGE-MIB', 'dot1dTpFdbPort')),
                              lexicographicMode=False):
    if errorIndication:
        Exception(errorIndication)
    elif errorStatus:
        Exception(errorStatus)
    else:
        for varBinds in varBindTable:
            for varBind in varBinds:
                # imaginary MongoDB document mapping port-ID -> MAC
                db.portsAndMacs.insert_one(
                    {varBind[1].prettyPrint(): varBind[0].prettyPrint()[-17:]}
                )
person Ilya Etingof    schedule 26.01.2016
comment
где определен varBindTable? - person Edik Mkoyan; 08.02.2016
comment
Начиная с блоков if вы должны добавить отступ в каждой строке и удалить эту строку. для varBinds в varBindTable: - person Edik Mkoyan; 08.02.2016
comment
и на самом деле он начинается с dot1dTpFdbPort, но проходит все поддерево BRIDGE-MIB. - person Edik Mkoyan; 08.02.2016
comment
Обновил мой код. Извините за недопонимание! Флаг lexicographicMode может помочь получить только поддеревья. - person Ilya Etingof; 08.02.2016
comment
с этим print varBind он выводит этот BRIDGE-MIB::dot1dTpFdbPort.c8:2a:14:0b:23:35 = 134, но с этим он выводит что-то вроде этого 1.3.6.1.2.1.17.4.3.1.2.168.32.102 .9.136.105 JSON создан неправильно - person Edik Mkoyan; 08.02.2016
comment
Я думаю, вам также следует удалить эту строку для varBinds в varBindTable: varBindTables не определен - person Edik Mkoyan; 08.02.2016
comment
также lookupMib должен быть True - person Edik Mkoyan; 08.02.2016
comment
дайте мне свой адрес электронной почты, чтобы я мог добавить вас в список участников github.com/edikmkoyan/ portmatrix/blob/master/portmatrix.py - person Edik Mkoyan; 22.02.2016
comment
Добавил вас в соавторы, Илья Не могу получить таблицу mac адресов для D-Link DGS-3120, может есть способ сделать что-то универсальное? D-Link DGS-3120 не имеет OID для BRIDGE-MIB. - person Edik Mkoyan; 22.02.2016
comment
Попробуйте пройтись по всему устройству, чтобы увидеть, есть ли там что-то длиной в 6 октетов. Другим способом было бы прочитать/собрать все опубликованные MIB D-LINK в надежде выяснить, где они обычно хранят адреса L2. Но есть вероятность, что они вообще не показывают MAC через SNMP. - person Ilya Etingof; 23.02.2016