scripts/admin/mail_invalide/mail_invalide.py
Daniel STAN e71bd59108 [mail_invalides] fichiers tex et cie dans /usr/scripts/var
Ignore-this: e33c30e4cb66e6bef1755489421c0cef

darcs-hash:20130115012438-28565-8247d96aed70466652eee738dbe5653e03f60363.gz
2013-01-15 02:24:38 +01:00

168 lines
6.3 KiB
Python
Executable file

#! /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/var/mails_invalides'
# 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