Для каждого snmp-устройства я хотел бы просканировать оиды в нескольких ветках.
В каждой ветке есть динамическое количество оидов, поэтому я не знаю, какие конкретно оиды мне нужны, я просто знаю, что мне нужны все оиды в ветке.
У меня есть устройства, поддерживающие только SNMPv1, поэтому для этих устройств я пишу код, совместимый с SNMPv1.
Для остальных устройств я использую SNMPv2.
SNMPv1
Предположим, у меня есть два OID, которые я хотел бы пройти по их ветке («1.3.6.1.2.1.4» и '1.3.6.1.2.1.6').
Под OID ветки я подразумеваю все OID в ветке.
У меня есть следующий код: < /p>
Код: Выделить всё
cmdGen = cmdgen.AsynCommandGenerator()
cmdGen.asyncNextCmd(
cmdgen.CommunityData('public', mpModel=1),
cmdgen.UdpTransportTarget(('192.168.0.101', 161)),
(str('1.3.6.1.2.1.4'),str('1.3.6.1.2.1.6'),),
(__cbFun_Walk, (cmdgen.CommunityData('public', mpModel=1), cmdgen.UdpTransportTarget(('192.168.0.101', 161)))))
cmdGen.snmpEngine.transportDispatcher.runDispatcher()
Очевидно, что это неэффективно.
Я также мог бы написать 2 asyncNextCmd для OID ветки:
Код: Выделить всё
cmdGen = cmdgen.AsynCommandGenerator()
cmdGen.asyncNextCmd(
cmdgen.CommunityData('public', mpModel=1),
cmdgen.UdpTransportTarget(('192.168.0.101', 161)),
(str('1.3.6.1.2.1.4'),),
(__cbFun_Walk, (cmdgen.CommunityData('public', mpModel=1),
cmdgen.UdpTransportTarget(('192.168.0.101', 161)))))
cmdGen.asyncNextCmd(
cmdgen.CommunityData('public', mpModel=1),
cmdgen.UdpTransportTarget(('192.168.0.101', 161)),
(str('1.3.6.1.2.1.6'),),
(__cbFun_Walk, (cmdgen.CommunityData('public', mpModel=1),
cmdgen.UdpTransportTarget(('192.168.0.101', 161)))))
cmdGen.snmpEngine.transportDispatcher.runDispatcher()
Например, на некоторых клиентах у меня есть сотни устройств SNMP, поэтому я открыл asyncCmd для каждого сетевого устройства одновременно.
Это привело к тому, что множество устройств не отвечало и слишком сильно загрузили процессор.
SNMPv2
Мне также хотелось бы попытаться понять, как работает основная часть данных, и смогу ли я использовать ее, чтобы сделать свой код более эффективным.
SNMPv2
Мне также хотелось бы попытаться понять, как работает основная часть данных, и смогу ли я использовать ее, чтобы сделать свой код более эффективным.
SNMPv2
Мне также хотелось бы попытаться понять, как работает основная часть данных и могу ли я использовать ее для повышения эффективности своего кода.
SNMPv2
Мне также хотелось бы попытаться понять, как работает основная часть данных и могу ли я использовать ее для повышения эффективности своего кода.
SNMPv2
Мне также хотелось бы попытаться понять, как работает основная часть данных и могу ли я использовать ее, чтобы сделать свой код более эффективным. />
Предположим, у меня есть 2 ветки, по которым я хотел бы пройти.
1.3.6.1.2.1.4.20 с 5 оидами и 1.3.6.1.2.1.4.21 с 39 оидами. oids.
Я получаю все значения в обеих ветвях, но также получаю больше значений, чем хочу.
Количество значений, которые я получаю, всегда соответствует ветке с наибольшее количество оидов, умноженное на количество ветвей, которые у меня есть.
Например, ветка с наибольшим количеством оидов имеет 39 оидов, а количество ветвей равно 2, поэтому 39*2=78, это означает getBulk вернет 78 oids.
Я хочу, чтобы getBulk возвращал все oids ветвей для каждой ветки и ничего больше, поэтому в моем случае мне нужно 44 oids(39+5 = 44).
Это мой код:
Код: Выделить всё
cmdGen = cmdgen.CommandGenerator()
errorIndication, errorStatus, errorIndex, varBindTable = cmdGen.bulkCmd(
cmdgen.CommunityData('public'),
cmdgen.UdpTransportTarget(('192.168.0.101', 161)),
0, 1,
'1.3.6.1.2.1.4.21', '1.3.6.1.2.1.4.20'
)
if errorIndication:
print errorIndication
elif errorStatus:
print '%s at %s\n' % (
errorStatus.prettyPrint(),
errorIndex and varBindTable[-1][int(errorIndex)-1] or '?'
)
else:
for varBindTableRow in varBindTable:
for name, val in varBindTableRow:
print str(name.prettyPrint()) + ' = ' + str(val.prettyPrint())
Подробнее здесь: https://stackoverflow.com/questions/332 ... ranch-oids