From bc8061ce62e188854cc43e7ab6b410fba110ab6e Mon Sep 17 00:00:00 2001 From: Sylvain Boilard Date: Fri, 9 Nov 2012 12:59:13 +0100 Subject: [PATCH] =?UTF-8?q?[impression,=20print=5Fstatus.py]=20On=20envoie?= =?UTF-8?q?=20un=20mail=20aux=20adh=C3=A9rents=20quand=20leur=20impression?= =?UTF-8?q?=20est=20sortie.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ignore-this: f085d6454f6c32f808ce78ec73a75e84 darcs-hash:20121109115913-8ef3c-605c7cc120ce806a41d4bdc0205fd66590db48a9.gz --- impression/print_status.py | 155 +++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100755 impression/print_status.py diff --git a/impression/print_status.py b/impression/print_status.py new file mode 100755 index 00000000..8aa91d8d --- /dev/null +++ b/impression/print_status.py @@ -0,0 +1,155 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +""" +print_status.py + +Récupère le statut des dernières impressions auprès de l'imprimante et envoie un +mail à l'intérressé quand son impression est sortie, ou envoie un message aux +imprimeurs si l'impression semble avoir échoué. + +Auteur : Sylvain Boilard +License : BSD 2 clauses. + +""" + +import sys, os +sys.path.append("/usr/scripts/gestion") + +import time +import httplib2 +import re +from smtplib import SMTP +from ldap_crans import crans_ldap + +last_print_filename = "/var/run/print_status/last_print.txt" +printer_host ="imprimante.adm.crans.org" +smtp_server= "smtp.crans.org" +error_send_to= u"impression@crans.org" +ok_mail=u"""Content-Type: text/plain; charset=utf-8 +Content-Disposition: inline +Content-Transfer-Encoding: quoted-printable +From: %s +To: %s +Subject: [Impression] Impression de "%s" terminée. + +Bonjour %s, + +Le fichier "%s" que tu as envoyé %s +a été imprimé. Tu peux venir le récupérer au local impression, au 4ème étage du +bâtiment J, muni du code secret qui t'a été donné lorsque tu as envoyé ton +document. Si tu as oublié ce code, ou pour tout autre problème lié au service +d'impression, tu peux contacter les imprimeurs à l'adresse %s . + +Bonne journée, + +-- +Les imprimeurs du Cr@ns +""" +error_mail=u"""Content-Transfer-Encoding: quoted-printable +Content-Type: text/plain; charset=utf-8 +Content-Disposition: inline +From: %s +To: %s +Subject: [Impression][print_status.py] Impression potentiellement échouée. + +Bonjour, + +Il semble y avoir eu un problème avec l'impression du fichier +"%s" (tâche n°%s) de %s (uid=%s), +lancée %s. +Le statut de la tâche est "%s". + +Aucun autre mail ne sera envoyé à ce sujet. Si nécéssaire, veuillez tenir +l'intéressé au courant aux adresses suivantes : + +%s + +Bonne journée, + +-- +print_status.py +""" + +litMonths = [u"Janvier", u"Février", u"Mars", u"Avril", u"Mai", u"Juin", u"Juillet", u"Août", u"Septembre", u"Octobre", u"Novembre", u"Décembre"] + +def getMSE(): + """Retourne le nombre de millisecondes depuis le 1 Janvier 1970 sous forme d'une chaîne de caractères.""" + return str(int(time.time()*1000.)) + +def buildDate(date): + """Retourne la date et l'heure passée en argument après l'avoir mise en forme.""" + dm, year, hms = date.split(' ') + day, month = dm.split('/') + hour, minute, _ = hms.split(':') + return u"le " + day + u" " + litMonths[int(month) - 1] + u" " + year + u" à " + hour + u":" + minute + +http = httplib2.Http() + +# On récupère la liste des tâches et on enlève les entêtes. +# Pour faire la requête, on doit récupérer un cookie de session. +headers, _ = http.request("https://" + printer_host + "/twelcome.cgi?CorePGTAG=0&Dummy=" + getMSE()) +_, content = http.request("https://" + printer_host + "/pprint.csv?Flag=Csv_Data&LogType=0&Dummy=" + getMSE(), 'GET', headers={'Cookie': headers['set-cookie']}) +task_list = content.split('\n') +task_list.pop(0) + +# On récupère la dernière tâche à avoir été traitée la dernière fois quel le script a été lancé. +# Si le fichier n'existe pas, on le crée en mettant la première tâche parmi celles que l'on vient de récupérer, et on s'arrête là. +try: + last_file = open(last_print_filename, "r") + last = last_file.read() + last_file.close() +except: + last_file = open(last_print_filename, "w") + last_file.write(task_list[0].split(',')[0]) + last_file.close() + exit(0) + +db = crans_ldap() +match_doc_name = re.compile(r"/[^/]*\.pdf") + +# On parcoure les tâches récupérées et qui n'ont pas déja été traitées, et on agit en conséquence. +for item in task_list: + fields = item.split(',', 6) + # On notera la présence d'une tâche complètement vide à la fin de la liste. + if fields[0] == last or fields[0] == '': + break + if fields[3].strip('"') == "root": + result = fields[1].strip('"') + taskID, user, _ = fields[2].strip('"').split(':') + user = user.split('@').pop() # On récupère le nom du club si besoin. + date = buildDate(fields[5]) + match_taskID = re.compile(r"impression\(%s\)" % taskID) + db_query = db.search("uid=%s" % user) + if db_query['adherent']: + target = db_query['adherent'][0] + full_name = target.prenom() + u" " + target.nom() + send_to = [ target.mail() + u"@crans.org" ] + else: + target = db_query['club'][0] + full_name = u"Club " + target.nom() + send_to = [] + for aid in target.imprimeurs(): + send_to.append(db.search("aid=" + aid)['adherent'][0].mail() + u"@crans.org") + historique = target.historique() + historique.reverse() # Ce qu'on cherche a des chances d'être récent et donc d'être à la fin de l'historique. + for hist_line in historique: + if match_taskID.search(hist_line): + filename = match_doc_name.search(hist_line).group()[1:] + break + conn = SMTP(smtp_server) + if result == "OK": + for dest in send_to: + mail_content = ok_mail % (error_send_to, dest, filename, full_name, filename, date, error_send_to) + conn.sendmail(error_send_to, dest, mail_content.encode("utf-8")) + else: + mail_content = error_mail % (error_send_to, error_send_to, filename, taskID, full_name, user, date, result, u"\n".join(send_to)) + conn.sendmail(error_send_to, error_send_to, mail_content.encode("utf-8")) + conn.quit() + +# Éventuellement, on met à jour le numéro de la dernière tâche traitée. +new_last = task_list[0].split(',', 1)[0] +if last != new_last: + last_file = open(last_print_filename, "w") + last_file.write(new_last) + last_file.close()