Не понимаю, почему я получаю эту ошибку в скрипте Python - PullRequest
0 голосов
/ 21 ноября 2019

Привет! Я использую скрипт Python 3 для выполнения операции snmp set для одного из переключателей.

Сценарий выглядит следующим образом.

import pysnmp

from pysnmp import hlapi

def cast(value):
    try:
        return int(value)
    except (ValueError, TypeError):
        try:
            return float(value)
        except (ValueError, TypeError):
            try:
                return str(value)
            except (ValueError, TypeError):
                pass
    return value

def fetch(handler, count):
    result = []
    for i in range(count):
        try:
            error_indication, error_status, error_index, var_binds = next(handler)
            if not error_indication and not error_status:
                items = {}
                for var_bind in var_binds:
                    items[str(var_bind[0])] = cast(var_bind[1])
                result.append(items)
            else:
                raise RuntimeError('Got SNMP error: {0}'.format(error_indication))
        except StopIteration:
            break
    return result


def construct_value_pairs(list_of_pairs):
    pairs = []
    for key, value in list_of_pairs.items():
        pairs.append(hlapi.ObjectType(hlapi.ObjectIdentity(key), value))
    return pairs

def set(target, value_pairs, credentials, port=161, engine=hlapi.SnmpEngine(), context=hlapi.ContextData()):
    handler = hlapi.setCmd(
        engine,
        credentials,
        hlapi.UdpTransportTarget((target, port)),
        context,
        *construct_value_pairs(value_pairs)
    )
    return fetch(handler, 1)[0]

Если я запускаю set('10.23.193.153', {'1.3.6.1.2.1.1.5.0': 'Test1'}, hlapi.CommunityData('public'))

Сценарий выполняется, и имя хоста на коммутаторе меняется на Test1.

Однако, если я выполняю другую операцию установки с использованием

set('10.23.193.153', {'1.3.6.1.4.1.11.2.14.11.5.1.16.19.1.2.1': 'admin'}, hlapi.CommunityData('public'))

, я получаю следующую ошибку. Указанный выше oid меняет имя пользователя коммутатора.

> ============ RESTART: C:/Users/regop/Desktop/SNMP Password Reset.py ============ Traceback (most recent call last):   File "C:/Users/regop/Desktop/SNMP Password Reset.py", line 53, in <module>
>     set('10.23.193.153', {'1.3.6.1.4.1.11.2.14.11.5.1.16.19.1.2.1': 'admin'}, hlapi.CommunityData('public'))   File
> "C:/Users/regop/Desktop/SNMP Password Reset.py", line 49, in set
>     return fetch(handler, 1)[0]   File "C:/Users/regop/Desktop/SNMP Password Reset.py", line 22, in fetch
>     error_indication, error_status, error_index, var_binds = next(handler)   File
> "C:\Users\regop\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pysnmp\hlapi\asyncore\sync\cmdgen.py",
> line 214, in setCmd
>     cmdgen.setCmd(snmpEngine, authData, transportTarget,   File "C:\Users\regop\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pysnmp\hlapi\asyncore\cmdgen.py",
> line 239, in setCmd
>     return cmdgen.SetCommandGenerator().sendVarBinds(   File "C:\Users\regop\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pysnmp\entity\rfc3413\cmdgen.py",
> line 249, in sendVarBinds
>     v2c.apiPDU.setVarBinds(reqPDU, varBinds)   File "C:\Users\regop\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pysnmp\proto\api\v1.py",
> line 131, in setVarBinds
>     apiVarBind.setOIDVal(   File "C:\Users\regop\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pysnmp\proto\api\v1.py",
> line 42, in setOIDVal
>     varBind.setComponentByPosition(1).getComponentByPosition(1).setComponentByType(val.getTagSet(),
> val, verifyConstraints=False, matchTags=False, matchConstraints=False,
> innerFlag=True) AttributeError: 'str' object has no attribute
> 'getTagSet'

Не уверен, что я здесь отличаюсь.

1 Ответ

1 голос
/ 21 ноября 2019

Это необработанное исключение похоже на ошибку в pysnmp, но это не имеет отношения к вашему вопросу.

Я предполагаю, что проблема вызвана тем, что ваш второй OID не был разрешен в MIB и, следовательно, значением (admin) автоматически не преобразуется в какой-либо объект типа SNMP.

Решение может быть одним из:

  • Обращайтесь к своим объектам SNMP по их символическим именам (MIB, символ, идентификатор экземпляра)
  • Продолжайте использовать OID, но предварительно загружайте MIB, где определен этот OID
  • Продолжайте использовать OID, но передавайте свои значения как объекты SNMP , чтобыне нужны MIB
...