Bonjour à tous,
J'utilise la lib pysnmp pour effectuer des interrogation snmp sur divers équipements et ça fonctionne plutôt bien dans l'ensemble.
Mais j'ai un soucis de lecture du résultat pour un oid sur un type d'équipement précis.
Voici les méthodes que j'utilise pour mon interrogation snmp:
un appel tout simple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 def snmpGetProcess(transportDispatcher, transportDomain, transportAddress, wholeMsg): global headVars global reqPDU global reqMsg global pMod global oid_origin global hashGet while wholeMsg: print wholeMsg #>>> 01XXXXXX�$4$j00 #>>> + #>>> \F{@�lp� #c'est ici que ça casse... je n'arrive pas à décoder wholeMsg rspMsg, wholeMsg = decoder.decode(wholeMsg, asn1Spec=pMod.Message()) rspPDU = pMod.apiMessage.getPDU(rspMsg) # Match response to request if pMod.apiPDU.getRequestID(reqPDU)==pMod.apiPDU.getRequestID(rspPDU): # Check for SNMP errors reported errorStatus = pMod.apiPDU.getErrorStatus(rspPDU) if errorStatus: raise Exception(errorStatus.prettyPrint()) else: for name, val in pMod.apiPDU.getVarBinds(rspPDU): hashGet[name.prettyPrint()] = val.prettyPrint() transportDispatcher.jobFinished(1) global startedAt if time() - startedAt > SNMP_TIMEOUT: raise Exception('Request timed out') startedAt = time() def snmpGet(ip,community,oid,v_snmp=1) : global headVars global reqPDU global reqMsg global pMod global oid_origin global hashGet global startedAt startedAt = time() hashGet = {} oid_origin = oid pMod = api.protoModules[v_snmp] # SNMP table header headVars = [ pMod.ObjectIdentifier(textToTuple(oid)) ] # Build PDU reqPDU = pMod.GetRequestPDU() pMod.apiPDU.setDefaults(reqPDU) pMod.apiPDU.setVarBinds(reqPDU, [ (x, pMod.null) for x in headVars ]) # Build message reqMsg = pMod.Message() pMod.apiMessage.setDefaults(reqMsg) pMod.apiMessage.setCommunity(reqMsg, community) pMod.apiMessage.setPDU(reqMsg, reqPDU) transportDispatcher = AsynsockDispatcher() transportDispatcher.registerRecvCbFun(snmpGetProcess) transportDispatcher.registerTimerCbFun(cbTimerFun) transportDispatcher.registerTransport(udp.domainName, udp.UdpSocketTransport().openClientMode()) transportDispatcher.sendMessage(encoder.encode(reqMsg), udp.domainName, (ip, PORT_SNMP)) transportDispatcher.jobStarted(1) transportDispatcher.runDispatcher() transportDispatcher.closeDispatcher() return hashGet
Et voici l'erreur que je rencontre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 #!../Python/bin/python -u from pysnmp.carrier.asynsock.dispatch import AsynsockDispatcher from pysnmp.carrier.asynsock.dgram import udp from pyasn1.codec.ber import encoder, decoder from pysnmp.proto import api from time import time import os, sys from libs.snmp.snmp_lib import snmpGetBulk,snmpGet,textToTuple,snmpGetBranch,multiSnmpGet,hmib # Port SNMP par defaut PORT_SNMP = 161 # Variables Globales startedAt = time() reqPDU = None headVars = [] hashGet = {} oAction= None currentIp="XX.XX.XX.XX" print "---------------"+currentIp+"/" oAction = snmpGet(currentIp,"XXXXXXXX","1.3.6.1.2.1.31.1.1.1.10.92",0) if oAction!= None: print "oAction != None" l = oAction.keys() l.sort() for x in l : print x+" : "+oAction[x] print "---------------" else : print "oAction == None"
L'oid que j'interroge est pourtant correct et devrai me retourner un résultat du style 134305417859312
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 File "dev/Python/lib/python2.6/site-packages/pyasn1/codec/ber/decoder.py", line 763, in __call__ '%r not in asn1Spec: %r' % (tagSet, asn1Spec) pyasn1.error.PyAsn1Error: TagSet(Tag(tagClass=64, tagFormat=0, tagId=6)) not in asn1Spec: {TagSet(Tag(tagClass=64, tagFormat=0, tagId=3)): ObjectSyntax(), TagSet(Tag(tagClass=64, tagFormat=0, tagId=1)): ObjectSyntax(), TagSet(Tag(tagClass=0, tagFormat=0, tagId=4)): ObjectSyntax(), TagSet(Tag(tagClass=0, tagFormat=0, tagId=2)): ObjectSyntax(), TagSet(Tag(tagClass=64, tagFormat=0, tagId=0)): ObjectSyntax(), TagSet(Tag(tagClass=64, tagFormat=0, tagId=4)): ObjectSyntax(), TagSet(Tag(tagClass=0, tagFormat=0, tagId=6)): ObjectSyntax(), TagSet(Tag(tagClass=64, tagFormat=0, tagId=2)): ObjectSyntax(), TagSet(Tag(tagClass=0, tagFormat=0, tagId=5)): ObjectSyntax()}/{}
Je précise que le code fonctionne si j'interroge un autre oid...
je me demande donc qu'est-ce que je doit faire pour décoder correctement ce résultat? (Je sais même pas en quoi c'est encodé, ni pourquoi c'est différent des autres oids...je suis perdu)
C'est peut-être pas des plus clair, mais si quelqu'un a déjà rencontré un problème du genre...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 rspMsg, wholeMsg = decoder.decode(wholeMsg, asn1Spec=?????)
Merci pour votre aide!
Partager