From 6bc8ef39496a8acdfd4e32af71b83d2b1ff207e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre-Elliott=20B=C3=A9cue?= Date: Sun, 3 Feb 2013 01:14:20 +0100 Subject: [PATCH] [mac_prises] On s'assure que le minimum de connexions SQL soit fait. --- surveillance/mac_prises/mac_prise.py | 10 +++--- surveillance/mac_prises/mac_prise_cleaner.sh | 2 +- surveillance/mac_prises/mac_prise_holder.py | 37 +++++++++++++++++--- 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/surveillance/mac_prises/mac_prise.py b/surveillance/mac_prises/mac_prise.py index 8e617dfd..2e241826 100755 --- a/surveillance/mac_prises/mac_prise.py +++ b/surveillance/mac_prises/mac_prise.py @@ -8,8 +8,6 @@ import os, sys, re from commands import getstatusoutput -sys.path.append('/usr/scripts/gestion') -import annuaires_pg import time @@ -19,10 +17,12 @@ import time # (plante lamentablement quand j'essaye avec mon compte sur vo, sous # ipython. Mais si je sudo ipython, ça marche... -def liste_chambres_macs(switch): +def liste_chambres_macs(switch, annuaire): u''' Fonction générant un dictionnaire (macs) contenant pour chaque prise une liste des macs qui y sont actives. + Reçoit annuaires_pg en second argument, pour éviter l'ouverture de + multiples connexions sql pour rien. ''' liste_bats = ['a', 'b', 'c', 'g', 'h', 'i', 'j', 'm', 'p'] @@ -40,12 +40,12 @@ def liste_chambres_macs(switch): continue else: mac = data[port] - uplink = annuaires_pg.uplink_prises[bat] + uplink = annuaire.uplink_prises[bat] prise = num_switch*100+port if prise in uplink: continue - result = annuaires_pg.reverse(bat, prise) + result = annuaire.reverse(bat, prise) if result: chbre = bat+result[0] if chbre in liste_chbres: diff --git a/surveillance/mac_prises/mac_prise_cleaner.sh b/surveillance/mac_prises/mac_prise_cleaner.sh index fc8cfddc..4ee58175 100755 --- a/surveillance/mac_prises/mac_prise_cleaner.sh +++ b/surveillance/mac_prises/mac_prise_cleaner.sh @@ -1,3 +1,3 @@ #!/bin/sh -psql -U crans mac_prises -c "DELETE FROM correspondance WHERE date <= timestamp 'now' - interval '2 days';" +psql -U crans mac_prises -c "DELETE FROM correspondance WHERE date <= timestamp 'now' - interval '2 days';" 1>/dev/null diff --git a/surveillance/mac_prises/mac_prise_holder.py b/surveillance/mac_prises/mac_prise_holder.py index 4bca766e..4f071486 100755 --- a/surveillance/mac_prises/mac_prise_holder.py +++ b/surveillance/mac_prises/mac_prise_holder.py @@ -7,6 +7,9 @@ import mac_prise from threading import Thread import time +sys.path.append('/usr/scripts/gestion') +import annuaires_pg + class ThreadWithReturnValue(Thread): """ Classe de threading qui récupère le "return" d'une fonction, et le renvoie avec @@ -18,13 +21,40 @@ class ThreadWithReturnValue(Thread): self._return = None def run(self): + """ + Méthode appelée par start. + On la réécrit pour que le retour soit non vide. + """ if self._Thread__target is not None: self._return = self._Thread__target(*self._Thread__args, **self._Thread__kwargs) def output(self): + """ + Renvoie la sortie de la fonction threadée. + """ Thread.join(self) return self._return +def get_curseur(temps): + """ + Au cas où le nombre max de connexions est atteint. + """ + i = 0 + while i <= 5: + try: + connecteur = psycopg2.connect(database="mac_prises", user="crans") + connecteur.set_session(autocommit=True) + break + except Exception as e: + print e + i += 1 + time.sleep(3) + + if i == 6: + raise EnvironmentError('Impossible de contacter la base postgresql') + else: + return connecteur.cursor() + if __name__ == '__main__': """ On envoie sur n threads les n arguments, puis on récupère les sorties @@ -35,16 +65,15 @@ if __name__ == '__main__': threads = {} output = {} for switch in switches: - threads[switch] = ThreadWithReturnValue(target=mac_prise.liste_chambres_macs, args=(switch,)) + threads[switch] = ThreadWithReturnValue(target=mac_prise.liste_chambres_macs, args=(switch, annuaires_pg)) threads[switch].start() # On change de boucle, car il faut absolument que tous les threads aient démarré, histoire qu'on # parallélise vraiment ! for switch in switches: output[switch] = threads[switch].output() - connecteur = psycopg2.connect(database="mac_prises", user="crans") - connecteur.set_session(autocommit=True) - curseur = connecteur.cursor() + + curseur = get_curseur(time.time()) requete = "INSERT INTO correspondance (date, chambre, mac) VALUES (%s, %s, %s);"