Partage
  • Partager sur Facebook
  • Partager sur Twitter

Dictionnaire Python

problème pour remplir un dictionnaire

    23 mai 2018 à 9:30:36

    Bonjour

    j'expose mon problème :

    j'ai besoin de faire  des interrogations  en SNMP  sur plusieurs équipements et avec plusieurs OID .

    pour limité le temps d'exécution  j'utilise une fonction treading.thread.

    quand je lance la fonction elle récupère les éléments et je voudrais les placer dans un dictionnaire pour pouvoir la manipuler par la suite. 

    voici mon code :

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import os
    import subprocess
    import re
    import threading
    import time
    import csv
    import unicodedata
    
    
    
    #création de variable pour les fichiers 
    file_data_sites = "adresse_ip_des_equipements.csv"
    fileoutput = "output_resultat.csv"
    
    
    
    # la fonction qui assure le snmpget
    def snmpget(ip_site, oid):
        p = subprocess.Popen([
    	'snmpget',
            '-v', '1',
            '-c', 'public',
            '-Oqv',
    	ip_site ,
    	oid],
    	stderr=subprocess.STDOUT,
    	stdout=subprocess.PIPE).stdout.read()
    
        try:         
    	if 'Timeout' in p:
    		result = ("%s;%s;Timeout")% (ig, ip_site)
    		#controle des données
    		print result
    		writer.writerow( [result] )
    	elif 'Error' in p:
    	    result = ("%s;%s;Error")% (ig, ip_site)
    	    #controle des données
    	    print result
    	    writer.writerow( [result] )
    	else:
    		p = p.replace('\n', '').replace('"', '')
    		result = "%s;%s;%s"% (ig, ip_site, p)
    		#controle des données
    		print result
    		writer.writerow( [result] )
    #ICI JE VOUDRAIS Ajouter le résultat dans un dictionnaire mais comme je n'y arrive pas je place le résultat dans un fichier .csv                                   
      except: pass #écriture dans le fichiet output_resultat.csv pour le résultat fichier = open(fileoutput, "w") writer = csv.writer(fichier) #ecriture de l'entete du fichier writer.writerow( ["@ip;system description;system_uptime"] ) #récupération des données du fichier adresse_ip_des_equipements.csv with open(file_data_sites, "r") as csvfile: spamreader = csv.reader(csvfile, delimiter=';', quotechar='|') for data in spamreader: #recupération valeur sites et @ip du site ig = data[0].replace('\n', '').replace('"', '') name_site = data[1].replace('\n', '').replace('"', '') #intérogation sur l'OID system description
    oid = 'oid system description' #appel de la fonction snmpget qui lance en // les commandes. threading.Thread(target=snmpget,args=(ip_site, oid,)).start()

    #intérogation sur l'OID system uptime
    oid = 'OID system uptime' #appel de la fonction snmpget qui lance en // les commandes. threading.Thread(target=snmpget,args=(ip_site, oid,)).start()

    j'aimerai que mon dictionnaire ressemble a ceci  :

    resultat = {'nom_du_site': 'le nom du site',  '@ip': adresse ip , {'system_desc': description system, 'system_uptime': system uptime}}

    si qlq'un a une idée je suis preneur :)

    attention  le code  n'est pas le code final c'est une première approche : )

    -
    Edité par ClovisDesnoyers 23 mai 2018 à 9:32:08

    • Partager sur Facebook
    • Partager sur Twitter
      23 mai 2018 à 11:15:20

      Et quel est le problème ? Si c'est pour faire le dictionnaire, ça va dépendre du résultat de snmpget, ça ressemble à quoi la sortie dans les différents cas ?
      • Partager sur Facebook
      • Partager sur Twitter
        23 mai 2018 à 12:07:30

        Bonjour

        oui le problème c'est pour faire le dictionnaire : (

        le snmpget renvoie  un string  (une chaîne de caractère) 

        SNMPGET oid systemname --> renvoie le nom du serveur  exemple  : serveur1

        SNMPGET oid systemuptime --> renvoie un datetime  exemple  : 08h25m35s

        snmpget OID1 --> donne un truc string

        snmpget oid2 --> donne un autre truc string

        etc ..

        il faut juste les organiser dans un dictionnaire comme ceci  :

        dictionnaire = {'nomdusite': serveur1, '@ip':192.168.0.1, 'data_serveur':{'system_uptime': 08h25m35s}}

        une fois que tous les oid ont été intérogé sur tous les serveurs on devrait avoir ceci 

        >>print dictionnaire

        {

        'nomdusite': serveur1, '@ip':192.168.0.1, 'data_serveur':{'system_uptime': 08h25m35s, "OID1": 'blabla', 'OID2':'blabla' ... etc }

        'nomdusite': serveur2, '@ip':192.168.0.2, 'data_serveur':{'system_uptime': 10h25m35s, "OID1": 'blabla', 'OID2':'blabla' ... etc }

        'nomdusite': serveur3, '@ip':192.168.0.3, 'data_serveur':{'system_uptime': 20h25m35s, "OID1": 'blabla', 'OID2':'blabla' ... etc }

        'nomdusite': serveur4, '@ip':192.168.0.4, 'data_serveur':{'system_uptime': 07h25m35s, "OID1": 'blabla', 'OID2':'blabla' ... etc }

        'nomdusite': serveur5, '@ip':192.168.0.5, 'data_serveur':{'system_uptime': 02h25m35s, "OID1": 'blabla', 'OID2':'blabla' ... etc }

        'nomdusite': serveur6, '@ip':192.168.0.6, 'data_serveur':{'system_uptime': 00h25m35s, "OID1": 'blabla', 'OID2':'blabla' ... etc }

        'nomdusite': serveur7, '@ip':192.168.0.7, 'data_serveur':{'system_uptime': 6547h25m35s, "OID1": 'blabla', 'OID2':'blabla' ... etc }

        }

        j'ai ajouté ceci dans la fonction :

        data_result[serveur1, donnée_attendu]  = p

        mais ce n'est pas bon  cela me donne  un dictionnaire bizard :)

        exemple pour afficher le résultat :

        for key,values in data_result.items()

                       print key,values

        ca donne  :

        ('serveur1', 'system_uptime') 08h25m35s

        ('serveur1',  'oid1') blablabal

        etc...

        et c'est pas du tout ce que je voudrais :[

        -
        Edité par ClovisDesnoyers 23 mai 2018 à 12:15:19

        • Partager sur Facebook
        • Partager sur Twitter
          23 mai 2018 à 15:01:15

          Je suis quand même assez surpris que tu saches faire du threading mais que ça foire au niveau de la création d'un dico, mais sinon un exemple concret. Normalement tu as tout dedans pour l'adapter à tes besoins perso.

          from subprocess import Popen, PIPE
          
          class CMDError(BaseException) :
          	pass
          
          def get_cmd_res(cmd) :
          	sp = Popen(cmd, shell=True, 
          		stdin=PIPE,
              	stdout=PIPE,
              	stderr=PIPE
              	)
          
          	out, err = sp.communicate()
          	if err : raise CMDError("Error with the cmd line : %s - Error msg : %s" %(cmd, err)) 
          	return out.decode('utf-8').rstrip() # if you want to encode, not necessary
          
          def run_cmds(value) :
          	data = {}
          	cmds = {
          		"Addition" : "bc -l <<< %i+%i" %(value, value),
          		"Soustraction" : "bc -l <<< '%i-%i'" %(value, value),
          		"Division" : "bc -l <<< '%i/%i'" %(value, value),
          		"Multiplication" : "bc -l <<< '%i*%i'" %(value, value)
          	}
          
          	for cname, cmd in cmds.items() :
          		try : 
          			data[cname] = get_cmd_res(cmd)
          		except CMDError as e :
          			print (value, e)
          			data[cname] = "ERROR"
          
          	return data
          
          def launch_all() :
          	res = [{"value" : value,  ** run_cmds(value)} 
          		   for value in range(10)]
          
          	print (res)
          
          launch_all()

          Sinon il y a une lib qui te permet de bosser directement avec le protocole SNMP sans passer par une commande système, sûrement plus portable et plus propre.

          • Partager sur Facebook
          • Partager sur Twitter
            24 mai 2018 à 16:28:35

            Merci pour la réponse.

            en effet  le problème  pour la construction de mon dictionnaire c'est le caractère asynchrone des informations.

            les résultats des snmpget n'arrive pas dans l'ordre, il n'est donc pas facile de faire un dictionnaire ordonné .

            j'ai trouvé la solution en ajoutant chaque résultat du snmpget dans un fichier  output.

            ce fichier n'est pas trillé et pas dans l'ordre mais ce n'est pas grave,  il va être traité par des script PHP  pour un affichage sur un site web /

            en tous cas merci encore pour ta réponse.

            sujet a résolu : )

            je ne peux pas vous donner le code final  sinon  je serais  obligé de fermé votre site et de tuer toutes les personnes qui on lu ceci :) (joke)

            • Partager sur Facebook
            • Partager sur Twitter

            Dictionnaire Python

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown