Synchro mot de passe
authorWilly MANGA <willy.manga@auf.org>
Fri, 21 Oct 2016 18:57:35 +0000 (19:57 +0100)
committerWilly MANGA <willy.manga@auf.org>
Fri, 21 Oct 2016 18:57:35 +0000 (19:57 +0100)
 * première tentative «brutale» :) de synchroniser les mots de passe
entre SOGo et ma table auth dans la bd messagerie

scripts/syncmdp.py [new file with mode: 0644]

diff --git a/scripts/syncmdp.py b/scripts/syncmdp.py
new file mode 100644 (file)
index 0000000..5db1dc5
--- /dev/null
@@ -0,0 +1,166 @@
+#/usr/bin/env python
+# -*- coding:utf-8 -*-
+
+"""
+L'objectif est de synchroniser
+les mots de passe des personnels
+d'une table vers une autre
+à intervalle régulier
+"""
+
+import MySQLdb
+
+from _mysql_exceptions import *
+from getpass import getpass
+
+passwd = getpass('Mot de passe bd: ')
+host = 'localhost'
+db = 'bacgl'
+user = 'willy'
+
+#TODO vraiment gérer les exceptions parce que pour le moment ... :P
+
+c_db = MySQLdb.connect(host,user,passwd,db)
+#initialisation pour le côté sogo
+c = c_db.cursor()
+
+#initialisation pour le côté local
+d = c_db.cursor()
+
+#Plusieurs cas de figure
+#on veut récupérer d'abord consulter les infos à l'origine
+
+pays_region = ['cm','ga','bi','cd','cg','cf','td']
+BACGL_pays = {'cm': 'Cameroun',
+        'ga': 'Gabon',
+        'bi': 'Bujumbura',
+        'cd': 'République démocratique du Congo',
+        'cg': 'Congo',
+        'cf': 'Centrafrique',
+        'td': 'Tchad',
+        }
+
+t1_champIdentifiant = 'c_uid'
+t1_champMdp = 'c_password'
+t1_table = 'auf_users'
+requete = 'SELECT  %s,%s from %s' % (t1_champIdentifiant,
+        t1_champMdp,t1_table)
+
+pays='cm'
+requete_pays = 'SELECT  %s,%s from %s where department = %s' % (\
+        t1_champIdentifiant,
+        t1_champMdp,t1_table,pays
+        )
+
+#requete pour toute la région
+requete_region = "SELECT %s,%s from %s where department='%s'" % (\
+        t1_champIdentifiant, t1_champMdp, t1_table,pays_region[0])
+for p in pays_region[1:] : #pour ne pas débuter au premier
+    requete_region += " OR department = '%s'" % p
+
+#execution de la requete
+try :
+    c.execute(requete_region)
+except ProgrammingError:
+    print 'erreur dans votre requête!'
+    print 'bye'
+    exit
+except OperationalError:
+    print 'erreur opérationnelle dans votre requête!'
+    print 'bye'
+    exit
+else:
+    print 'on peut continuer sereinement :) '
+
+# on récupère aussi les infos de l'autre côté dans la
+#table auth
+t2_champIdentifiant = 'user'
+t2_champMdp = 'password'
+t2_champActif = 'actif'
+t2_table = 'auth'
+
+t2_requete = "SELECT %s,%s from %s  where actif=1" %\
+        (t2_champIdentifiant, t2_champMdp, t2_table)
+
+
+try :
+    d.execute(t2_requete)
+except OperationalError:
+    print 'erreur opérationnelle dans votre requête!'
+    print 'bye'
+    exit
+else:
+    print 'Suite du traitement'
+
+print '-' * 80
+print '-' * 80
+### la phase des comparaisons
+
+#on va se servir des ensembles pour la comparaison
+r_sogo_set = set(c.fetchall())
+r_auth_set = set(d.fetchall())
+
+#on cherche là où il y a une différence à savoir :
+#présent dans SOGo.auf_users mais pas dans messagerie.auth
+diff_set_sogo = r_sogo_set.difference(r_auth_set)
+
+#req_update_auth = "UPDATE auth set password= '%s' where user= %s"
+
+nbr_maj = 0
+nbr_aj = 0
+compte_maj = []
+compte_aj = []
+
+if len(diff_set_sogo) > 0:
+
+    for usager in diff_set_sogo:
+        req_recherche = "SELECT %s from auth where user='%s'" % \
+                (t2_champIdentifiant,usager[0])
+        if  d.execute(req_recherche) == 0 : #utilisateur inexistant
+            req_insert_auth = \
+                    "INSERT INTO auth (user,password) VALUES \
+                    ('%s','%s') " % \
+                    (usager[0], usager[1])
+            try:
+                d.execute(req_insert_auth)
+            except OperationalError:
+                print 'Oups'
+                exit
+            else:
+                print 'Nouveau compte ajouté'
+                nbr_aj += 1
+                compte_aj.append(usager[0])
+        elif d.execute(req_recherche) > 0:
+            #normalement ici ça signifie que le compte est déjà présent
+
+            req_update_auth = \
+            "UPDATE auth set password = '%s' where user = '%s'" %\
+                    (usager[1], usager[0])
+            print req_update_auth
+            print 'Traitement'
+
+            try:
+                d.execute(req_update_auth)
+            except OperationalError:
+                print 'erreur !'
+                exit
+            else:
+                nbr_maj += 1
+                compte_maj.append(usager[0])
+                print 'Mot de passe pour %s  mis à jour' % usager[0]
+
+print '-' * 80
+if nbr_aj > 0 :
+    print '%s compte(s) ajouté(s)' % nbr_aj
+    print '--°--' * 20
+    for i in compte_aj:
+        print i
+        print '+-------+'
+    print '--°--' * 80
+
+if nbr_maj > 0 :
+    print '%s compte(s) mis à jour' % nbr_maj
+    print '--°--' * 20
+    for i in compte_maj:
+        print i
+        print '+-----+'