Заставить PySNMP разрешать идентификаторы объектов

Я пытаюсь выполнить SNMP-прогулку с PySNMP. Я написал следующий скрипт, который работает, но для каждого устройства, которое я «прохожу», OID только десяти строк могут быть преобразованы в «настоящее имя».

from pysnmp.entity.rfc3413.oneliner import cmdgen
from os.path import exists
import sys
import os

# Turn on debugging
#debug.setLogger(debug.Debug('msgproc', 'secmod'))

# Enter parameters
target_IP           = raw_input('Target IP (192.168.13.100): ') or '192.168.13.100'
target_port         = raw_input('Target port (161): ') or 161
max_timeout         = int(raw_input('Maximum timeout in seconds (1):')) or 1
max_retries         = int(raw_input('Maximum number of retries (0):')) or 0
target_file_name    = raw_input('Target filename (.txt is added): ') + '.txt' 

# Check for already existing file
path = 'walks/'
if not os.path.exists(path):
    os.makedirs(path)
if exists(path+target_file_name):
    sys.exit("The file '%s' already exists. Try again." % target_file_name)
else: 
    target_file = open(path+target_file_name, 'w+')

# Initialize counter to zero
counter = 0

# Create command generator
cmdGen = cmdgen.CommandGenerator()

# Get data

errorIndication, errorStatus, errorIndex, varBindTable = cmdGen.nextCmd(
    cmdgen.CommunityData('public'),
    cmdgen.UdpTransportTarget((target_IP, target_port), timeout=max_timeout, retries=max_retries),
    '1.3', 
    lexicographicMode=True, 
    #maxRows=1000, 
    ignoreNonIncreasingOid=True,
    lookupNames=True
)

# Print errors and values to file
if errorIndication:
    print(errorIndication)
else:
    # Print error messages

    if errorStatus:
        print('%s at %s' % (
            errorStatus.prettyPrint(),
            errorIndex and varBindTable[-1][int(errorIndex)-1] or '?'
            )
        )
    else:
        # Print values
        for varBindTableRow in varBindTable:
            for name, val in varBindTableRow:
                counter += 1
                target_file.write("(%s)\t %s value = \t%s\n" % (counter, name.prettyPrint(), val.prettyPrint()))

        # Finish the operation                
        target_file.close()
        print('Writing to %s successful. %d lines have been written' % (target_file_name, counter))
        sys.exit(0)

В результате получается файл с очень большим количеством строк. первые записи выглядят так:

(1)  SNMPv2-MIB::sysDescr."0" value =   Hirschmann MAR
(2)  SNMPv2-MIB::sysObjectID."0" value =    1.5.6.9.1.1.248.4.10.90
(3)  SNMPv2-MIB::sysUpTime."0" value =  2626357
(4)  SNMPv2-MIB::sysContact."0" value =     Hirschmann Automation and Control GmbH
(5)  SNMPv2-MIB::sysName."0" value =    mar1030.plc-s7-15000
(6)  SNMPv2-MIB::sysLocation."0" value =    Hirschmann MAR
(7)  SNMPv2-MIB::sysServices."0" value =    2
(8)  SNMPv2-MIB::sysORLastChange."0" value =    300

Но тогда OID больше не разрешаются:

(9)  SNMPv2-SMI::mib-2."2.1.0" value =  27
(10)     SNMPv2-SMI::mib-2."2.2.1.1.1" value =  1
(11)     SNMPv2-SMI::mib-2."2.2.1.1.2" value =  2
(12)     SNMPv2-SMI::mib-2."2.2.1.1.3" value =  3
.....

Что вызывает это и что я могу с этим поделать?


person vicco    schedule 31.03.2015    source источник


Ответы (1)


Чтобы разрешить MIB с помощью pysnmp, вы должны загрузить их в механизм pysnmp до выполнения запросов SNMP. Ваш сценарий выполняет разрешение MIB для SNMPv2-MIB, поскольку он автоматически загружается механизмом pysnmp.

Чтобы использовать простые текстовые MIB с pysnmp, вы должны преобразовать их из простой текстовой формы (например, ASN.1) в формат pysnmp (код Python). Вы можете использовать сценарий оболочки build-pysnmp-mib (на основе libsmi) или загрузить и установить предварительно скомпилированный пакет общих MIB (пакет Python pysnmp-mibs).

Чтобы загрузить некоторые или все доступные MIB, вы можете использовать метод MibVariable.loadMibs(*mibs). См. этот скрипт например.

person Ilya Etingof    schedule 31.03.2015
comment
Хорошо, я уже установил MIB-пакет. Теперь, когда я просто использую cmdgen.MibVariable('IF-MIB', '').loadMibs() в качестве аргумента, я получаю файл еще большего размера, но, как я понимаю, только IF-ветви. Поэтому, если я введу INTERNET-MIB, он должен пройти все дерево сверху вниз, что может занять некоторое время. Я правильно это понимаю? - person vicco; 01.04.2015