#! /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 time import * from config import upload import commands # logging tools import syslog def log(x): syslog.openlog('GENERATE_DECONNEXION_NOTICE') syslog.syslog(x) syslog.closelog() import crans.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 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, 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 ] # 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, 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