#! /usr/bin/env python # -*- coding: utf-8 -*- """ Script de déconnexion pour mail invalide Copyright (C) 2009 Michel Blockelet inspiré de fiche_deconnexion.py par : Xavier Pessoles, Étienne Chové, Vincent Bernat, Nicolas Salles Licence : GPL v2 """ import commands, os, sys, time sys.path.append('/usr/scripts/gestion') from ldap_crans import crans_ldap from config import upload # logging tools import syslog def log(x): syslog.openlog('GENERATE_MAIL_INVALIDE_NOTICE') syslog.syslog(x) syslog.closelog() sys.path.append('/usr/scripts/lib') import utils.exceptions import locale locale.setlocale(locale.LC_TIME, 'fr_FR.UTF-8') help = """Script de déconnexion pour mail invalide. Une fiche sera générée pour chaque adhérent. Chaque adhérent sera déconnecté 2 semaines plus tard si son adresse mail n'a pas changé. Usage: mail_invalide.py [adresse mail]... L'adresse mail peut aussi être un aid précédé d'un tiret. Exemple: mail_invalide.py toto@example.com -42 va s'occuper de l'adhérent ayant toto@example.com comme adresse mail et l'adhérent ayant l'aid 42.""" def generate_ps(proprio, mail): """On génère la feuille d'avertissement et on retourne son emplacement.""" barcode = "/usr/scripts/admin/mail_invalide/barcode.eps" try: log('Generate invalid mail notice for %s' % proprio.Nom()) # Dossier de génération du ps dossier = '/usr/scripts/admin/mail_invalide' # Base pour le nom du fichier fichier = time.strftime('%Y-%m-%d-%H-%M') + '-mail-%s' % (proprio.Nom(). lower().replace(' ', '-')) # Création du fichier tex format_date = '%A %d %B %Y' template = file('%s/mail_invalide.tex' % dossier).read() template = template.replace('~prenom~', proprio.prenom().encode('utf-8')) template = template.replace('~nom~', proprio.nom().encode('utf-8')) template = template.replace('~chambre~', proprio.chbre().encode('utf-8')) template = template.replace('~mail~', mail.encode('utf-8').replace('_', '\\_')) template = template.replace('~fin~', time.strftime(format_date, time.localtime(time.time()+14*86400))) file('%s/%s.tex' % (dossier, fichier), 'w').write(template) # Compilation du fichier latex #commands.getstatusoutput('PATH="/bin:/usr/bin" cd %(dossier)s && barcode -n -E -b %(adresse)s%(date)s -o %(barcode)s && latex --interaction=nonstopmode %(base)s.tex && dvips %(base)s.dvi && rm -f %(base)s.dvi %(base)s.aux %(base)s.log %(base)s.tex %(barcode)s'%{'dossier': dossier, 'adresse': adresse, 'date': time.strftime("%Y%m%d-%H%M"), 'base': fichier, 'barcode': barcode}) commands.getstatusoutput('cd %(dossier)s && pdflatex -interaction nonstopmode %(base)s.tex'%{'dossier': dossier, 'adresse': adresse, 'date': time.strftime("%Y%m%d-%H%M"), 'base': fichier, 'barcode': barcode}) return '%s/%s.pdf' % (dossier, fichier) except Exception, e: log('Erreur lors de la génération du ps : ') log(str(e)) log("Values : adherent:%s" % proprio.Nom()) log(utils.exceptions.formatExc()) raise e def set_mail_invalide(adherent, mail, a_verifier, a_imprimer): if adherent.chbre() not in ['????', 'EXT']: print "Génération de la fiche pour %s :" % adherent.Nom().encode('utf-8') fiche = generate_ps(adherent, mail) print fiche a_imprimer.append(fiche) adherent.blacklist([time.time() + 14 * 24 * 3600, '-', 'mail_invalide', "Mail invalide"]) adherent.save() else: print u"Chambre de %s : %s, impossible de générer la fiche." % (adherent.Nom().encode('utf-8'), adherent.chbre()) a_verifier.append(mail) if __name__ == "__main__": if '--help' in sys.argv or '-h' in sys.argv or len(sys.argv) < 2: print help sys.exit(0) db = crans_ldap() # On fait la liste des .forwards dans les homes print " * Lecture des .forward ..." forwards = {} for uid in os.listdir('/home'): try: forwards[open('/home/%s/.forward' % uid, 'r').readline().strip()] = uid except: pass a_imprimer = [] a_verifier = [] for adresse in sys.argv[1:]: # Est-ce un aid ? if adresse[0] == '-': print " * Recherche de aid=%s ..." % adresse[1:] res = db.search("aid=%s" % adresse[1:], 'w')['adherent'] if len(res) == 0: print "*** Erreur : aucun résultat pour aid=%s" % adresse[1:] a_verifier.append(adresse) elif len(res) > 1: print "*** Erreur : plusieurs résultats pour aid=%s :" % adresse[1:] for adh in res: print adh.Nom() a_verifier.append(adresse) else: adherent = res[0] set_mail_invalide(adherent, adherent.email(), a_verifier, a_imprimer) continue print " * Recherche de %s ..." % adresse # Est-ce un .forward ? if forwards.has_key(adresse): res = db.search("uid=%s" % forwards[adresse], 'w')['adherent'] if len(res) == 0: print "*** Erreur : aucun résultat pour uid=%s" % forwards[adresse] a_verifier.append(adresse) else: adherent = res[0] set_mail_invalide(adherent, adresse, a_verifier, a_imprimer) continue # Est-ce une adresse mail sans compte Cr@ns ? res = db.search("mail=%s" % adresse, 'w')['adherent'] if len(res) == 0: print "*** Erreur : aucun résultat pour %s" % adresse a_verifier.append(adresse) elif len(res) > 1: print "*** Erreur : plusieurs résultats pour %s :" % adresse for adh in res: print adh.Nom() a_verifier.append(adresse) else: adherent = res[0] set_mail_invalide(adherent, adherent.email(), a_verifier, a_imprimer) if len(a_verifier) + len(a_imprimer) > 0: print '' print '***** Résultats *****' if len(a_verifier) > 0: print ' * Adresses mail à vérifier :' print ','.join(a_verifier) if len(a_imprimer) > 0: print ' * Fiches à imprimer :' for fiche in a_imprimer: print fiche