Каков наиболее эффективный способ очистки нескольких одиночных и ветвящихся OID?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Каков наиболее эффективный способ очистки нескольких одиночных и ветвящихся OID?

Сообщение Anonymous »

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

Для каждого 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, но предполагаю, что второй код имеет некоторые недостатки.

Например, на некоторых клиентах у меня есть сотни устройств 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())
Итак, каков наиболее эффективный способ очистки нескольких OID ветвей как для SNMPv1, так и для SNMPv2?

Подробнее здесь: https://stackoverflow.com/questions/332 ... ranch-oids
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»