scripts/surveillance/fiche_deconnexion/generate.py
Vincent Le Gallic 14b5e136cf [surveillance/fiche_deconnexion/generate.py] On log l'erreur quand on échoue sur la génération d'un .ps
ça me semble un peu illusoire parce que si ça foire, latex va attendre qu'on lui parle, donc ça va deadlocker...
 Mais au moins, ça prévient si latex est pas installé. (True story)
2013-02-06 06:43:38 +01:00

167 lines
5.7 KiB
Python
Executable file

#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
"""
Script de génération de feuille de déconnexion pour :
- upload
- p2p
Copyright (C) Xavier Pessoles, Étienne Chové, Vincent Bernat, Nicolas Salles
Licence : GPL v2
"""
import sys
sys.path.append('/usr/scripts/gestion')
from ldap_crans import crans_ldap
import crans.utils.exceptions
from config import upload
from time import *
from unicodedata import normalize
import commands
# logging tools
import syslog
def log(x):
syslog.openlog('GENERATE_DECONNEXION_NOTICE')
syslog.syslog(x)
syslog.closelog()
sys.path.append('/usr/scripts/lib')
import utils.exceptions
import locale
locale.setlocale(locale.LC_TIME, 'fr_FR.utf8')
sanctions = ['upload', 'p2p']
help = """Script de génération d'une feuille de déconnexion.
Les sanctions disponibles sont :
\t--%s
usage: generate.py --sanction recherche_ldap
Le motif de recherche dans la base ldap doit donné un résultat unique""" % "\n\t--".join(map(lambda x: x,sanctions))
def decode(s):
u"""
Retourne un unicode à partir de s
s doit être en utf-8
"""
if type(s) is unicode:
# Si s est déjà un unicode, on ne décode pas
return s
else:
return s.decode('utf-8', 'ignore') # On ignore les erreurs
def strip_accents(a):
u""" Supression des accents de la chaîne fournie """
res = normalize('NFKD', decode(a)).encode('ASCII', 'ignore')
return res.replace(' ', '_').replace("'", '')
def generate_ps(sanction, proprio, db):
"""En fonction de la sanction à appliquer au propriétaire,
on génère la feuille de déconnexion et on retourne son nom et
emplacement."""
try:
log('Generate deconnexion notice for %s' % proprio.Nom())
# Dossier de génération du ps
dossier = '/usr/scripts/surveillance/fiche_deconnexion'
# Base pour le nom du fichier
fichier = strftime('%Y-%m-%d-%H-%M') + '-%s-%s' % (sanction,
strip_accents(proprio.Nom().lower().replace(' ', '-')))
# Création du fichier tex
format_date = '%A %d %B %Y'
template = file('%s/deconnexion_%s.tex' % (dossier, sanction)).read()
template = template.replace('~prenom~', proprio.prenom().encode('iso8859-15'))
template = template.replace('~nom~', proprio.nom().encode('iso8859-15'))
template = template.replace('~chambre~', proprio.chbre().encode('iso8859-15'))
template = template.replace('~mail~', proprio.email().encode('iso8859-15'))
template = template.replace('~debut~', strftime(format_date, localtime()))
template = template.replace('~fin~', strftime(format_date, localtime(time()+14*86400)))
# filtrage des autodisc
historique = [ bl.encode('iso-8859-15', 'ignore').split('$') for bl in proprio.blacklist() if bl.split('$')[2] == 'autodisc_%s' % sanction ]
# transfomation en tuple (date, sanction)
historique = [ (strftime('%A %d %B %Y', localtime(int(bl[0]))), bl[-1]) for bl in historique ]
# On ne prend au maximum que les 5 dernières occurences
historique = historique[-5:]
# tranformation en ligne
if sanction == 'upload' :
# On donne la valeur de l'upload
historique = [ '%s & %s & Mo'%(bl[0], bl[1].split(' ')[-2]) for bl in historique ]
else :
# On donne juste la date
historique = [ '%s' % bl[0] for bl in historique ]
# assemblage des lignes
historique = r"""\\
""".join(historique)
template = template.replace('~historique~', historique)
if sanction == 'upload' :
template = template.replace('~limitehard~', str(upload.hard))
template = template.replace('~nbadher~', str(len(db.search('paiement=ok')['adherent'])))
file('%s/%s.tex' % (dossier, fichier), 'w').write(template)
# Compilation du fichier latex
# Paquets nécessaires : texlive-latex-base, texlive-latex-recommended,
# texlive-latex-extra, texlive-lang-french, texlive-luatex,
# texlive-pstricks
commande = 'PATH="/bin:/usr/bin" cd %(dossier)s && latex %(base)s.tex && dvips %(base)s.dvi && rm -f %(base)s.dvi %(base)s.aux %(base)s.log %(base)s.tex'%{'dossier': dossier, 'base': fichier}
status, output = commands.getstatusoutput(commande)
if status != 0:
log('Erreur lors de la génération du ps : ')
log(output)
return '%s/%s.ps' % (dossier, fichier)
except Exception, e:
log('Erreur lors de la génération du ps : ')
log(str(e))
log("Values : sanction:%s adherent:%s" % (sanction,
strip_accents(proprio.Nom())))
log(crans.utils.exceptions.formatExc())
raise e
if __name__ == "__main__":
def log(x):
print x
def aide():
print help
sys.exit(0)
if '--help' in sys.argv or '-h' in sys.argv:
aide()
db = crans_ldap()
sanction = ''
for s in sanctions :
if '--%s' % s in sys.argv:
sanction = s
if not sanction :
print "Erreur : aucune sanction définie.\n"
aide()
if len(sys.argv) <= 2 :
print "Erreur : aucun motif de recherche défini.\n"
aide()
else :
motif = sys.argv[-1]
recherche = db.search(motif)['adherent']
if len(recherche) == 0:
print "Erreur : aucun résultat pour %s.\n" % motif
aide()
elif len(recherche) != 1:
print "Erreur : plusieurs résultats pour %s.\n" % motif
aide()
else :
adherent = recherche[0]
# On génére alors le postscript
fichier = generate_ps(sanction, adherent, db)
print u'Le fichier %s a été généré.' % fichier