[mac_prises] On s'assure que le minimum de connexions SQL soit fait.

This commit is contained in:
Pierre-Elliott Bécue 2013-02-03 01:14:20 +01:00
parent 777ba5cd9c
commit 6bc8ef3949
3 changed files with 39 additions and 10 deletions

View file

@ -8,8 +8,6 @@
import os, sys, re import os, sys, re
from commands import getstatusoutput from commands import getstatusoutput
sys.path.append('/usr/scripts/gestion')
import annuaires_pg
import time import time
@ -19,10 +17,12 @@ import time
# (plante lamentablement quand j'essaye avec mon compte sur vo, sous # (plante lamentablement quand j'essaye avec mon compte sur vo, sous
# ipython. Mais si je sudo ipython, ça marche... # ipython. Mais si je sudo ipython, ça marche...
def liste_chambres_macs(switch): def liste_chambres_macs(switch, annuaire):
u''' u'''
Fonction générant un dictionnaire (macs) contenant pour chaque prise une Fonction générant un dictionnaire (macs) contenant pour chaque prise une
liste des macs qui y sont actives. 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'] liste_bats = ['a', 'b', 'c', 'g', 'h', 'i', 'j', 'm', 'p']
@ -40,12 +40,12 @@ def liste_chambres_macs(switch):
continue continue
else: else:
mac = data[port] mac = data[port]
uplink = annuaires_pg.uplink_prises[bat] uplink = annuaire.uplink_prises[bat]
prise = num_switch*100+port prise = num_switch*100+port
if prise in uplink: if prise in uplink:
continue continue
result = annuaires_pg.reverse(bat, prise) result = annuaire.reverse(bat, prise)
if result: if result:
chbre = bat+result[0] chbre = bat+result[0]
if chbre in liste_chbres: if chbre in liste_chbres:

View file

@ -1,3 +1,3 @@
#!/bin/sh #!/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

View file

@ -7,6 +7,9 @@ import mac_prise
from threading import Thread from threading import Thread
import time import time
sys.path.append('/usr/scripts/gestion')
import annuaires_pg
class ThreadWithReturnValue(Thread): class ThreadWithReturnValue(Thread):
""" """
Classe de threading qui récupère le "return" d'une fonction, et le renvoie avec 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 self._return = None
def run(self): 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: if self._Thread__target is not None:
self._return = self._Thread__target(*self._Thread__args, self._return = self._Thread__target(*self._Thread__args,
**self._Thread__kwargs) **self._Thread__kwargs)
def output(self): def output(self):
"""
Renvoie la sortie de la fonction threadée.
"""
Thread.join(self) Thread.join(self)
return self._return return self._return
def get_curseur(temps):
"""
Au cas 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__': if __name__ == '__main__':
""" """
On envoie sur n threads les n arguments, puis on récupère les sorties On envoie sur n threads les n arguments, puis on récupère les sorties
@ -35,16 +65,15 @@ if __name__ == '__main__':
threads = {} threads = {}
output = {} output = {}
for switch in switches: 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() threads[switch].start()
# On change de boucle, car il faut absolument que tous les threads aient démarré, histoire qu'on # On change de boucle, car il faut absolument que tous les threads aient démarré, histoire qu'on
# parallélise vraiment ! # parallélise vraiment !
for switch in switches: for switch in switches:
output[switch] = threads[switch].output() output[switch] = threads[switch].output()
connecteur = psycopg2.connect(database="mac_prises", user="crans")
connecteur.set_session(autocommit=True) curseur = get_curseur(time.time())
curseur = connecteur.cursor()
requete = "INSERT INTO correspondance (date, chambre, mac) VALUES (%s, %s, %s);" requete = "INSERT INTO correspondance (date, chambre, mac) VALUES (%s, %s, %s);"