
Ca permettait aux gens qui avaient un accent dans leur nom de ne pas se faire deconnecter (plantage du script generate.py et donc de deconnexion.py). Par ailleurs, si generate.py plante, deconnexion.py deconnecte quand meme. darcs-hash:20100509145618-ddb99-8d9ab159498056ef83de79bc6e2ff62247803c3c.gz
160 lines
5.3 KiB
Python
160 lines
5.3 KiB
Python
#! /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
|
|
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')
|
|
|
|
|
|
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').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
|
|
commands.getstatusoutput('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})
|
|
|
|
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
|