Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
zaum-kurs-2013.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
655 Кб
Скачать
☆

1.4Стандартні snmp додатки (Асинхронні додатки)

1.4.1Асинхронний генератор команд

Асинхронний API для додатків Oneliner насправді є основою для синхронної версії, так що вони дуже схожі. Цей асинхронний API використовується для забезпечення роботи кількох, можливо різних, SNMP додатків і в той же час для обробки інших видів діяльності всередині користувальницької програми, коли SNMP додаток очікує введення/виводу.

Всі додатки команди генератора здійснюється в межах одного класу:

Клас AsynCommandGenerator ([ snmpEngine ]) створює об’єкт асинхронного генератора команд SNMP.

Методи екземплярів класу AsynCommandGenerator  реалізації конкретних типів запиту аналогічні тим, які описані в розділі класу Command Generator за винятком того, що асинхронний інтерфейс використовує функцію зворотного виклику для надання відповідей.

1.4.1.1GET Command

getCmd( authData, transportTarget, varNames, (cbFun, cbCtx), lookupNames=False,lookupValues=False )

Підготовка SNMPGET запиту для відправки. 

Повертає  значенняsendRequestHandle.

CbFun параметр є посиланням на викликуваний об'єкт (наприклад, Pythonфункції), що мають наступний синтаксис:

cbFun ( sendRequestHandle , errorIndication , ErrorStatus , errorIndex , varBinds ,cbCtx )

Де sendRequestHandle ціле значення, яке використовується для зіставлення відповіді на запит. Його копія повертається за запитом метода getCmd.

CbCtx параметр є посиланням на cbCtx об'єкт, передається getCmd методу

ErrorIndication , ErrorStatus , errorIndex і varBinds параметри мають той же зміст, що і в getCmd метод.

authData, transportTarget, varNames, lookupNames і lookupValues параметри мають той же зміст, що і в getCmd методі за винятком того, що varNames передається у вигляді послідовності, а не як окремі екземпляри керованих об'єктів.

GetCmd метод повертає ціле значення – унікальний sendRequestHandle , яке використовується для узгодження подальших відповідей на це прохання.

Наступний код виконує кілька одночасних операцій SNMP GET для декількох екземплярів керованих об'єктів до одного агента. Перевірка справжності інформації, використовуваної в цьому прикладі є однаковими для всіх цілей. 

Так GET операція:

  • Використовує SNMP v2c

  • З 'public'SNMPv2

  • Використовує IPv4/UDP

  • Прослуховування агента на 127.0.0.1

  • Для SNMPv2-MIB :: sysDescr.0, SNMPv2-MIB :: sysLocation.0 і SNMPv2-MIB :: sysName.0 об'єктів

from pysnmp.entity.rfc3413.oneliner import cmdgen

def cbFun(sendRequestHandle, errorIndication, errorStatus, errorIndex,

varBinds, cbCtx):

if errorIndication:

print(errorIndication)

return

if errorStatus:

print('%s at %s' % \

(errorStatus.prettyPrint(),

errorIndex and varBinds[int(errorIndex)-1] or '?')

)

return

for oid, val in varBinds:

if val is None:

print(oid.prettyPrint())

else:

print('%s = %s' % (oid.prettyPrint(), val.prettyPrint()))

cmdGen = cmdgen.AsynCommandGenerator()

for varName in ( cmdgen.MibVariable('SNMPv2-MIB', 'sysDescr', 0),

cmdgen.MibVariable('SNMPv2-MIB', 'sysLocation', 0),

cmdgen.MibVariable('SNMPv2-MIB', 'sysName', 0) ):

cmdGen.getCmd(

cmdgen.CommunityData('public'),

cmdgen.UdpTransportTarget(('127.0.0.1', 161)),

(varName,),

(cbFun, None)

)

cmdGen.snmpEngine.transportDispatcher.runDispatcher()

Всі запити і виконуються паралельно, тому тайм-аутіспроби налагодження встановлені зазамовчуванням, наведений вище код буде припинено через 6 секунд, незалежно від агентів.

setCmd ( authData , transportTarget , varBinds , ( cbFun , cbCtx ), lookupNames = False ,lookupValues ​​= False )

Підготовка SNMPSET запиту для відправки. Повертає sendRequestHandle значення.

AuthData , transportTarget , іменізмінної , lookupNames і lookupValues ​​параметри мають той же зміст, що і в setCmd методі.

CbFun і cbCtx параметри мають той же зміст, що і в AsynCommandGenerator.getCmd методі.

1.4.1.2GETNEXT Command

nextCmd( authData, transportTarget, varNames, (cbFun, cbCtx), lookupNames=False,lookupValues=False )

Підготовка SNMP запиту GETNEXT для відправки. 

Повертає sendRequestHandle значення.

authData, transportTarget, varNames, lookupNames and lookupValues парам пара мають той же зміст, що і в nextCmd метод за винятком того, що varNames передається у вигляді послідовності, а не як окремі екземпляри керованих об'єктів імена.

CbFun і cbCtx параметри мають той же зміст, що і в AsynCommandGenerator.getCmd методі, параметр varNames має той же зміст, що і в CommandGenerator.nextCmd методі за винятком того, що тут він передається в якості кортежу.

Наступний код виконує кілька одночасних операцій SNMP GETNEXT від різних агентів, що ідентифікуються за їх адресами транспорту. Перевірка справжності інформації і Managed Objects екземпляри, що використовуються в цьому прикладі є однаковими для всіх цілей. Так GETNEXT операція:

  • Використовує SNMP v3

  • з SNMPv3 з користувачем USR-md5-де, MD5 аутентифікацію і протоколи конфіденційностіDES

  • IPv4/UDP

  • прослуховування агента на 127.0.0.1, 192.168.1.1, 10.40.1.1 (порт 161)

  • для SNMPv2-MIB::system subtree

from pysnmp.entity.rfc3413.oneliner import cmdgen

def cbFun(sendRequestHandle, errorIndication, \

errorStatus, errorIndex, varBindTable, cbCtx):

if errorIndication:

print(errorIndication)

return

if errorStatus:

print('%s at %s' % \

(errorStatus.prettyPrint(),

errorIndex and varBindTable[-1][int(errorIndex)-1] or '?')

)

return

for varBindRow in varBindTable:

for oid, val in varBindRow:

if val is None:

return # stop table retrieval

else:

print('%s = %s' % (oid.prettyPrint(), val.prettyPrint()))

return True # continue table retrieval

cmdGen = cmdgen.AsynCommandGenerator()

for transportTarget in ( cmdgen.UdpTransportTarget(('127.0.0.1', 161)),

cmdgen.UdpTransportTarget(('192.168.1.1', 161)),

cmdgen.UdpTransportTarget(('10.40.1.1', 161)) ):

cmdGen.nextCmd(

cmdgen.UsmUserData('usr-md5-des', 'authkey1', 'privkey1'),

transportTarget,

( cmdgen.MibVariable('SNMPv2-MIB', 'system'), ),

(cbFun, None)

)

cmdGen.snmpEngine.transportDispatcher.runDispatcher()

1.4.1.3GETBULK Command

bulkCmd( authData, transportTarget, nonRepeaters, maxRepetitions, varNames, (cbFun,cbCtx), lookupNames=False, lookupValues=False )

Підготовка SNMP запиту GetBulk для відправки. Повертає sendRequestHandle значення.

authData, transportTarget, nonRepeaters, maxRepetitions varNames,lookupNames і  lookupValues ​​параметри мають той же зміст, що і в bulkCmd методі за винятком того, що varNames передається у вигляді послідовності, а не як окремі екземпляри керованих об'єктів.

CbFun і cbCtx параметри мають той же зміст, що і в AsynCommandGenerator.nextCmd методі.

Після одного чи декількох запитів,які були викликані за одним або кількома з перерахованих вище методів, повинен бути викликаний TransportDispatcher. Це можна зробити застосувавши:

asynCommandGenerator.snmpEngine.transportDispatcher.runDispatcher()

Де asynCommandGenerator є AsynCommandGenerator екземпляр класу.

RunDispatcher() метод обривається, коли немає очікуваних запитів, які залишились для запуску додатків.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]