[admin/mail_invalide/,gen_confs/] Mise en place deconnexion pour mail invalide

Maintenant, quand on voit un mail invalide :
/usr/scripts/admin/mail_invalide/mail_invalide.py [mail]...
La personne est deconnectee au bout de 2 semaines si elle n'a pas change
son adresse mail.

 * Le script admin/mail_invalide/mail_invalide.py permet de generer les fiches,
et note l'adherent pour deconnexion 2 semaines plus tard (services_to_restart)
 * admin/mail_invalide/mail_invalide.tex est une fusion des deux
mail_invalide*.tex dans le dossier admin/src/
 * gen_confs/adherents.py s'occupe de marquer le mail comme invalide au bout de
2 semaines s'il n'a pas ete change (il met le flag mailInvalide=TRUE)
 * gen_confs/squid.py genere la liste des deconnectes pour Squid

darcs-hash:20091208003119-ddb99-74b4388950300879400250b9c40716013832d45e.gz
This commit is contained in:
Michel Blockelet 2009-12-08 01:31:19 +01:00
parent 6c68846b28
commit 0f9856085e
6 changed files with 287 additions and 159 deletions

250
admin/mail_invalide/mail_invalide.py Normal file → Executable file
View file

@ -1,161 +1,113 @@
#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import sys,os,string,time,locale
locale.setlocale(locale.LC_ALL,'')
sys.path.append("/usr/scripts/gestion")
from email_tools import format_sender
"""
Script de déconnexion pour mail invalide
# Import de la base de données
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
db = crans_ldap()
from config import upload
# logging tools
import syslog
def log(x):
syslog.openlog('GENERATE_MAIL_INVALIDE_NOTICE')
syslog.syslog(x)
syslog.closelog()
# Détermination de l'uid du cableur
uid = os.getenv('SUDO_UID')
if not uid :
print "Impossible de déterminer l'utilisateur"
sys.exit(1)
cableur = db.search('uidNumber=%s' % os.getenv('SUDO_UID'),'w')['adherent'][0]
sys.path.append('/usr/scripts/lib')
import utils.exceptions
os.chdir("/usr/scripts/admin/mail_invalide")
SRC = "/usr/scripts/admin/src"
# Nom des fichiers
headers = SRC + "/mail_invalide_debut.tex"
texsrc = SRC + "/mail_invalide_texte.tex"
pdf = time.strftime("mail_invalide-%d-%m-%Y_%Hh%M.pdf",time.localtime(time.time()))
# Fichiers temporaires à supprimer à la fin
mailtex = "mailtmp.tex"
barcode = "barcode.eps"
# Détection d'un manquement d'argument
if len(sys.argv) == 1 :
sys.exit("Erreur: aucune adresse mail fournie")
# On prend la liste des adresses mails données en argument
adresses = sys.argv
# On vire pour celà l'appel au script
adresses.pop(0)
if len(adresses) == 1 :
text = "Bonjour\n\n \
Voici la fiche d'avertissement à remettre à l'adhérent concerné pour\n \
l'informer que l'adresse mail qu'il a fourni n'est pas valide.\n\n \
Il faut donc imprimer la feuille et la mettre dans sa boîte aux\n \
lettres.\n\n"
else :
text = "Bonjour\n\n \
Voici les fiches d'avertissement à remettre aux adhérents concernés\n \
pour les informer que l'adresse mail qu'ils ont fourni n'est pas valide.\n\n \
Il faut donc imprimer les feuilles et les mettre dans les boîtes aux\n \
lettres correspondantes.\n\n"
text += "-- \nUn script exécuté par %s\n\n" % cableur.Nom().encode('iso8859-1')
text += os.popen("/usr/games/fortune",'r').read()
os.system("cp %s %s" % (headers, mailtex))
file = open(mailtex,'r+')
file.read()
chbres = []
for adresse in adresses :
os.system("barcode -n -E -b %s%s -o %s" % (adresse,time.strftime("%Y%m%d-%H%M",time.localtime()),barcode))
data = db.search("mail=%s" % adresse,'w')
try :
adherent = data['adherent'][0]
prenom = adherent.prenom().encode('iso8859-15')
nom = adherent.nom().encode('iso8859-15')
chbre = adherent.chbre()
# L'adhérent a une adresse mail invalide
adherent.mail_invalide(True)
adherent._save()
except :
print("Erreur : l'adresse < %s > n'a pas été trouvée dans la base" % adresse)
adresses.remove(adresse)
if len(adresses) == 0 :
sys.exit("Aucune adresse valide")
continue
chbres.append(chbre)
date = time.strftime("%A %d %B %Y",time.localtime(time.time()+15*24*3600))
if adresse == adresses[0] :
file.write("\\newcommand{\prenom}{%s}\n" % prenom)
file.write("\\newcommand{\\nom}{%s}\n" % nom)
file.write("\\newcommand{\chambre}{%s}\n" % chbre)
file.write("\\newcommand{\email}{\url{%s}}\n" % adresse)
file.write("\\newcommand{\deconnexion}{%s}\n" % date)
else :
file.write("\\renewcommand{\prenom}{%s}\n" % prenom)
file.write("\\renewcommand{\\nom}{%s}\n" % nom)
file.write("\\renewcommand{\chambre}{%s}\n" % chbre)
file.write("\\renewcommand{\email}{\url{%s}}\n" % adresse)
file.write("\\renewcommand{\deconnexion}{%s}\n" % date)
tex_src = open(texsrc, 'r')
file.write(tex_src.read())
tex_src.close()
if adresse != adresses[len(adresses)-1] :
file.write('\\newpage')
else :
file.write('\end{document}')
file.close()
#os.system("latex %s" % mailtex)
os.system("latex \\\\nonstopmode\\\\input %s 1> /dev/null" % mailtex)
os.system("dvips %s 2> /dev/null" % mailtex.replace('.tex','.dvi'))
os.system("ps2pdf %s %s" % (mailtex.replace('.tex','.ps'),pdf))
import locale
locale.setlocale(locale.LC_TIME, 'fr_FR.UTF-8')
# Génération du mail avec la pièce jointe
import smtplib
# Here are the email pacakge modules we'll need
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart
from email.Encoders import encode_base64
msg = MIMEMultipart()
msg['Subject'] = "Fiche(s) d'avertissement de mail invalide - %s" % time.strftime("%d/%m/%Y",time.localtime(time.time()))
msg['From'] = format_sender(u"%s <%s>" % (cableur.Nom(), cableur.mail()))
msg['To'] = format_sender(u"Câbleurs <respbats@crans.org>")
msg['Cc'] = format_sender(u"Disconnect Team <disconnect@crans.org>")
# msg.preamble = text
# Guarantees the message ends in a newline
# msg.epilogue = ''
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é.
fp = open(pdf, 'rb')
img = MIMEBase('application','pdf')
img.set_payload(fp.read())
fp.close()
encode_base64(img) # Ils auraient pu soigner...
img.add_header('Content-Disposition', 'attachment', filename=pdf)
Usage: mail_invalide.py [adresse mail]..."""
text = MIMEText(text, 'plain', 'iso-8859-1')
msg.attach(text)
msg.attach(img)
while (1 == 1):
print "Mail formaté, prêt à l'envoi."
print " [Envoyer, Abandonner]"
r = sys.stdin.readline().strip()
if (r == "e" or r == "E"):
# Send the email via our own SMTP server.
s = smtplib.SMTP()
s.connect()
s.sendmail(msg['From'], (msg['To'],msg['Cc']), msg.as_string())
s.close()
print "Mail envoyé !"
break
if (r == "a" or r == "A"):
print "Abandon"
os.system("rm -f %s" % pdf)
break
os.system("rm -f %s %s" % (mailtex.replace(".tex",".*"),barcode))
def generate_ps(proprio):
"""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~', proprio.email().encode('utf-8'))
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})
return '%s/%s.ps' % (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
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()
a_imprimer = []
a_verifier = []
for adresse in sys.argv[1:]:
print " * Recherche de %s ..." % adresse
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:
print "Génération de la fiche pour %s :" % res[0].Nom().encode('utf-8')
fiche = generate_ps(res[0])
print fiche
a_imprimer.append(fiche)
db.services_to_restart('mail_invalide_expire', ['%s$%s' % (res[0].id(), res[0].mail())], time.time()+14*86400)
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