Commit 79f87d70 authored by Vincent Le gallic's avatar Vincent Le gallic

Ménage

 (tout ce qui était dans integrité/checkintegrity.py est mainenant
  dans serveur/Consistency.py)
parent 7da44b7c
# -*- coding:utf-8 -*-
# Ce script sert à vérifier que tout se passe bien dans la base.
# Il est lancé toutes les 24h, si il y a un problème, il envoie un mail à
# l'adresse mail mails_integrity_problem (déclarée dans config.py)
# à terme, son rôle sera d'arrêtée la note si elle est incohérente.
import time
notedir = "/home/note/Note_Kfet_2015_server/"
# Ce script n'est pas forcément dans le basedir de la note,
# mais il a besoin d'en importer des choses
import sys
sys.path.append(notedir)
sys.path.append(notedir+"/mail")
# fichier de config python
import config
# script d'envoi de mails
import mail
# module d'accès à la bdd
from pyPgSQL import PgSQL
# normalement on aura besoin que d'un seul curseur puisqu'on ne fait que des SELECT
con=PgSQL.connect(database="note")
cur=con.cursor()
ok,errors=True,[]
# On vérifie l'intégrité des soldes pour chaque compte,
# c'est-à-dire que son solde est égal à la somme de ses transactions.
integrite_solde_perso = """SELECT idbde,gagne-perdu as calcul,effectif,effectif-(gagne-perdu) as en_trop
FROM
(SELECT idbde,
(SELECT COALESCE(sum(montant*quantite),0)
FROM transactions
WHERE destinataire=main.idbde AND valide) as gagne,
(SELECT COALESCE(sum(montant*quantite),0)
FROM transactions
WHERE emetteur=main.idbde AND valide) as perdu,
(SELECT solde
FROM comptes WHERE idbde=main.idbde) as effectif
FROM comptes as main)
AS calculs
WHERE gagne-perdu!=effectif;"""
cur.execute(integrite_solde_perso)
non_integres = cur.fetchall()
for i in range(len(non_integres)):
#NB: même le bde n'a pas le droit d'être non intègre.
# si son solde devient trop énorme, on crée un compte spécial de backup.
ok=False
errors.append(["Solde personnel non intègre",dict(non_integres[i])])
# On vérifie l'intégrité globale. IE la somme des soldes doit toujours êtres nulle.
cur.execute("SELECT sum(solde) FROM comptes;")
result = cur.fetchone()
if result[0]!=0:
ok=False
errors.append(["Somme globale des soldes non nulle",dict(result)])
# On vérifie que chaque bouton pointe vers un club
cur.execute("""SELECT idbouton
FROM
(SELECT boutons.id as idbouton,comptes.type='club' as faux FROM boutons,comptes WHERE boutons.destinataire=comptes.idbde)
AS plop
WHERE faux=false;""")
boutonsErrones = cur.fetchall()
boutonsErrones = [i[0] for i in boutonsErrones]
if len(boutonsErrones)!=0:
ok=False
errors.append(["Bouton(s) qui ne pointent pas vers un club",list(boutonsErrones)])
date = time.strftime("%Y-%m-%d %T")
if not ok:
# On écrit tout ça dans un fichier de log.
f = open(config.integrityerrorfile,"a")
f.write("Integrity Error detected on %s.\nDetails :\n"%(date))
f.write(str(errors))
f.close()
# Et on prévient par mail.
msg = "Date d'envoi : %s\nIl y a des erreurs de cohérence dans la base.\n\n"%(date)
for i in errors:
msg += "%s\n%s\n\n"%(i[0],i[1])
msg += "-- \nNote Kfet 2015"
mail.envoie_mail("note-errors@crans.org",config.mails_integrity_problem,"Incohérence dans la base",msg)
# Dans tous les cas, on écrit dans un fichier de log qu'on a fait la vérification.
f=open(config.integritylogfile,"a")
if ok:
f.write("%s Integrity checked.\n"%(date))
else:
f.write("%s Integrity failed ! (see %s for details)\n"%(date,config.integrityerrorfile))
f.close()
#!/bin/bash
# Comment ça se script ne sert qu'à lancer un script python ?
python checkintegrity.py
exit 0
SELECT numcbde,gagne-perdu as calcul,effectif,effectif-(gagne-perdu) as a_enlever
FROM
(SELECT numcbde,
(SELECT sum(montant*quantite)
FROM transactions
WHERE destinataire=main.numcbde AND valide='t') as gagne,
(SELECT sum(montant*quantite)
FROM transactions
WHERE emetteur=main.numcbde AND valide='t') as perdu,
(SELECT solde
FROM adherents WHERE numcbde=main.numcbde) as effectif
FROM adherents as main)
AS calculs
WHERE gagne-perdu!=effectif;
2950
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment