IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques tierces Python Discussion :

pysnmp : problème de décodage du résultat snmp


Sujet :

Bibliothèques tierces Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 201
    Par défaut pysnmp : problème de décodage du résultat snmp
    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:
    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
    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
     
    #!../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"
    Et voici l'erreur que je rencontre :

    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()}/{}
    L'oid que j'interroge est pourtant correct et devrai me retourner un résultat du style 134305417859312
    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 )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        rspMsg, wholeMsg = decoder.decode(wholeMsg, asn1Spec=?????)
    C'est peut-être pas des plus clair, mais si quelqu'un a déjà rencontré un problème du genre...
    Merci pour votre aide!

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 201
    Par défaut
    Le problème provenait du fait que le type de la valeur retournée était Counter64, non géré en snmp v1...

    Merci quand même et bonne continuation à tous!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème d'affichage du résultat dans une classe qui utilise SNMP
    Par ramzouni dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 22/05/2009, 01h26
  2. Problème pour afficher le résultat d'un calcul
    Par goomazio dans le forum Assembleur
    Réponses: 3
    Dernier message: 26/01/2006, 10h42
  3. Problème de récup de résultats d'une procédure stockée
    Par an_merle dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 12/01/2006, 10h08
  4. [Réseau]Problème de décodage de caractère
    Par addack dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 01/12/2005, 11h09
  5. problème d'affichge de résultat de requétte
    Par developpeur_mehdi dans le forum Bases de données
    Réponses: 7
    Dernier message: 14/03/2004, 15h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo