来自 table 的 PySNMP 表单字典
PySNMP form dictionary from table
我正在尝试使用 PySNMP
模块从 Cisco 交换机输出 ifTbale
table。
这是我当前的代码:
from pysnmp.hlapi import *
for (errorIndication,
errorStatus,
errorIndex,
values) in nextCmd(SnmpEngine(),
CommunityData('public', mpModel=0),
UdpTransportTarget(('172.20.19.14', 161)),
ContextData(),
ObjectType(ObjectIdentity('IF-MIB', 'ifIndex')),
ObjectType(ObjectIdentity('IF-MIB', 'ifDescr')),
ObjectType(ObjectIdentity('IF-MIB', 'ifType')),
ObjectType(ObjectIdentity('IF-MIB', 'ifSpeed')),
lexicographicMode=False):
print('======================')
for v in values:
print(str(v))
所以这是有效的,因为它输出如下:
======================
IF-MIB::ifIndex.10028 = 10028
IF-MIB::ifDescr.10028 = FastEthernet0/28
IF-MIB::ifType.10028 = 'ethernetCsmacd'
IF-MIB::ifSpeed.10028 = 100000000
======================
IF-MIB::ifIndex.10029 = 10029
IF-MIB::ifDescr.10029 = FastEthernet0/29
IF-MIB::ifType.10029 = 'ethernetCsmacd'
IF-MIB::ifSpeed.10029 = 100000000
======================
IF-MIB::ifIndex.10030 = 10030
IF-MIB::ifDescr.10030 = FastEthernet0/30
IF-MIB::ifType.10030 = 'ethernetCsmacd'
IF-MIB::ifSpeed.10030 = 10000000
...
我想最终将其更改为函数,但目前我想知道如何将其放入嵌套字典中。
我想要以下格式的数据:
{ifIndex{ifDescr, ifType, ifSpeed}}
看起来像这样:
{10028{ifDescr: 'FastEthernet0/28', ifType: 'ethernetCsmacd', ifSpeed: '100000000'}}
我不确定如何解决这个问题,因为我无法构建字典。
编辑:
我设法用以下代码得到了一本字典:
print('======================')
raw_dict = {str(v).split('.')[0].split(':')[2]: str(v).split('.')[1].split()[2] for v in values}
print(raw_dict.items())
if_dict = {raw_dict['ifIndex']: {k: v} for k, v in raw_dict.items()}
print(if_dict)
但它并没有遍历 raw_dict
.
中的所有值
这是输出:
======================
dict_items([('ifSpeed', '100000000'), ('ifIndex', '10048'), ('ifDescr', 'FastEthernet0/48'), ('ifType', "'ethernetCsmacd'")])
{'10048': {'ifType': "'ethernetCsmacd'"}}
======================
dict_items([('ifSpeed', '1000000000'), ('ifIndex', '10101'), ('ifDescr', 'GigabitEthernet0/1'), ('ifType', "'ethernetCsmacd'")])
{'10101': {'ifType': "'ethernetCsmacd'"}}
======================
dict_items([('ifSpeed', '1000000000'), ('ifIndex', '10102'), ('ifDescr', 'GigabitEthernet0/2'), ('ifType', "'ethernetCsmacd'")])
{'10102': {'ifType': "'ethernetCsmacd'"}}
======================
dict_items([('ifSpeed', '4294967295'), ('ifIndex', '10501'), ('ifDescr', 'Null0'), ('ifType', "'other'")])
{'10501': {'ifType': "'other'"}}
所以你想像这样构建一个字典:
{10028: {ifDescr: 'FastEthernet0/28',
ifType: 'ethernetCsmacd',
ifSpeed: '100000000'}}
为此,您需要 MIB 对象名称(例如 ifDescr
)、MIB 对象实例 ID(例如 10028
)和 SNMP 对象值(例如 FastEthernet0/28
)。让我提出以下代码以从 SNMP 响应变量绑定中清除这些组件:
myDict = collections.defaultdict(collections.defaultdict)
for varBind in varBinds:
varName, varValue = varName
mibName, objectName, objectInstanceId = varName.getMibSymbol()
idx = '.'.join([str(indexPart) for indexPart in objectInstanceId])
myDict[idx][objectName] = varValue
请记住,上面的代码暗示 PySNMP 已加载响应 OID 的 MIB,因此它可以将响应 OID 转换为符号值,如 ifDescr
.
我不确定你所说的 "not iterating through all the values" 是什么意思。
我正在尝试使用 PySNMP
模块从 Cisco 交换机输出 ifTbale
table。
这是我当前的代码:
from pysnmp.hlapi import *
for (errorIndication,
errorStatus,
errorIndex,
values) in nextCmd(SnmpEngine(),
CommunityData('public', mpModel=0),
UdpTransportTarget(('172.20.19.14', 161)),
ContextData(),
ObjectType(ObjectIdentity('IF-MIB', 'ifIndex')),
ObjectType(ObjectIdentity('IF-MIB', 'ifDescr')),
ObjectType(ObjectIdentity('IF-MIB', 'ifType')),
ObjectType(ObjectIdentity('IF-MIB', 'ifSpeed')),
lexicographicMode=False):
print('======================')
for v in values:
print(str(v))
所以这是有效的,因为它输出如下:
======================
IF-MIB::ifIndex.10028 = 10028
IF-MIB::ifDescr.10028 = FastEthernet0/28
IF-MIB::ifType.10028 = 'ethernetCsmacd'
IF-MIB::ifSpeed.10028 = 100000000
======================
IF-MIB::ifIndex.10029 = 10029
IF-MIB::ifDescr.10029 = FastEthernet0/29
IF-MIB::ifType.10029 = 'ethernetCsmacd'
IF-MIB::ifSpeed.10029 = 100000000
======================
IF-MIB::ifIndex.10030 = 10030
IF-MIB::ifDescr.10030 = FastEthernet0/30
IF-MIB::ifType.10030 = 'ethernetCsmacd'
IF-MIB::ifSpeed.10030 = 10000000
...
我想最终将其更改为函数,但目前我想知道如何将其放入嵌套字典中。
我想要以下格式的数据:
{ifIndex{ifDescr, ifType, ifSpeed}}
看起来像这样:
{10028{ifDescr: 'FastEthernet0/28', ifType: 'ethernetCsmacd', ifSpeed: '100000000'}}
我不确定如何解决这个问题,因为我无法构建字典。
编辑: 我设法用以下代码得到了一本字典:
print('======================')
raw_dict = {str(v).split('.')[0].split(':')[2]: str(v).split('.')[1].split()[2] for v in values}
print(raw_dict.items())
if_dict = {raw_dict['ifIndex']: {k: v} for k, v in raw_dict.items()}
print(if_dict)
但它并没有遍历 raw_dict
.
这是输出:
======================
dict_items([('ifSpeed', '100000000'), ('ifIndex', '10048'), ('ifDescr', 'FastEthernet0/48'), ('ifType', "'ethernetCsmacd'")])
{'10048': {'ifType': "'ethernetCsmacd'"}}
======================
dict_items([('ifSpeed', '1000000000'), ('ifIndex', '10101'), ('ifDescr', 'GigabitEthernet0/1'), ('ifType', "'ethernetCsmacd'")])
{'10101': {'ifType': "'ethernetCsmacd'"}}
======================
dict_items([('ifSpeed', '1000000000'), ('ifIndex', '10102'), ('ifDescr', 'GigabitEthernet0/2'), ('ifType', "'ethernetCsmacd'")])
{'10102': {'ifType': "'ethernetCsmacd'"}}
======================
dict_items([('ifSpeed', '4294967295'), ('ifIndex', '10501'), ('ifDescr', 'Null0'), ('ifType', "'other'")])
{'10501': {'ifType': "'other'"}}
所以你想像这样构建一个字典:
{10028: {ifDescr: 'FastEthernet0/28',
ifType: 'ethernetCsmacd',
ifSpeed: '100000000'}}
为此,您需要 MIB 对象名称(例如 ifDescr
)、MIB 对象实例 ID(例如 10028
)和 SNMP 对象值(例如 FastEthernet0/28
)。让我提出以下代码以从 SNMP 响应变量绑定中清除这些组件:
myDict = collections.defaultdict(collections.defaultdict)
for varBind in varBinds:
varName, varValue = varName
mibName, objectName, objectInstanceId = varName.getMibSymbol()
idx = '.'.join([str(indexPart) for indexPart in objectInstanceId])
myDict[idx][objectName] = varValue
请记住,上面的代码暗示 PySNMP 已加载响应 OID 的 MIB,因此它可以将响应 OID 转换为符号值,如 ifDescr
.
我不确定你所说的 "not iterating through all the values" 是什么意思。