#!/bin/bash /usr/scripts/python.sh # -*- coding: utf-8 -*- """Envoi de mail automatique pour signaler la fin d'impression à un adhérent. Le script se connecte à l'interface d'impression pour récupérer la liste des dernières tâches imprimées. Ce script est lancé par un cron toutes les dix minutes sur zamok. Pour éviter de notifier plusieurs fois de la même fin d'impression, on ne balaie dans la liste que le dernier intervalle (bornes entières) de dix minutes""" import BeautifulSoup import sys import requests import re import datetime import time import smtplib from gestion.affich_tools import cprint from gestion import mail from utils.sendmail import actually_sendmail from lc_ldap import shortcuts import impression.digicode as digicode URL_JOBLIST = 'https://imprimante.adm.crans.org/hp/device/JobLogReport/Index' CA = '/etc/ssl/certs/cacert.org.pem' RE_JOB_NAME = re.compile('JobLogName_') RE_JOB_STATUS = re.compile('JobLogStatus_') RE_JOB_DATE = re.compile('JobLogDate_') req = requests.get(URL_JOBLIST, verify=CA) doc = BeautifulSoup.BeautifulSoup(req.text) con = shortcuts.lc_ldap_readonly() jobs = doc.findAll(attrs={'class': 'PrintJobTicket'}) # Dernier intervalle de dix minutes, en bornes entières, qui vient de se # terminer now = datetime.datetime.now() fin = now.replace(second=0, minute=(now.minute/10)*10, microsecond=0) debut = fin - datetime.timedelta(minutes=10) success=dict() clubs=dict() echecs=dict() for job in jobs: # Fin de parsing uid = job.find(attrs={'id': RE_JOB_NAME}).text status = job.find(attrs={'id': RE_JOB_STATUS}).text date = job.find(attrs={'id': RE_JOB_DATE}).text date = datetime.datetime.strptime(date, '%Y/%m/%d %H:%M:%S') # Hors intervalle: on drope if date < debut or date >= fin: continue split = uid.split(u':') if status != "Success": # Préviens les imprimeurs si une impression a échoué, # pas de fioritures ici, boucle assez basique if len(split) < 3: name = 'Impression à la main' task = uid if name not in echecs: echecs[name] = {'task': []} echecs[name]['task'].append(task) else: nb = split[0] name = split[1] task = u':'.join(split[2:]) if name not in echecs: echecs[name] = {'task': []} echecs[name]['task'].append(task) if status != "Sucess": continue # Dans le cas d'un success, if len(split) < 3: continue # Boucle qui s'exécute normalement si la typographie dans # les logs d'impression est repectée (:) (sinon c'est un # impression manuel donc drop) nb = split[0] name = split[1] task = u':'.join(split[2:]) if u'@' in name: #Seuls les clubs ont un @ dans leur alias, donc boucle # dédiée au clubs [name, club] = name.split(u'@', 1) if club not in clubs: clubs[club] = {'task': []} clubs[club]['task'].append(task) if name not in success: success[name] = {'task': []} success[name]['task'].append(task) #Section consacrée à l'envoi : partie 1 pour les adh, partie 2 pour les clubs #To = 'detraz@crans.org' From = 'impression@crans.org' e = 0 a = 0 for name in success: ad = con.search(u'(uid=%s)' % name) if ad <> []: a = a + 1 adh = ad[0] To = name + u'@crans.org' tname = unicode(adh['prenom'][0]) + " " + unicode(adh['nom'][0]) codes = [x[0] + u'#' for x in digicode.list_code(name)] if not codes: codes = [digicode.gen_code(name) + u'#'] #cprint(u"Envoi du mail à %s" % To) mailtxt=mail.generate('mail_impression_ok', { 'To': To, 'From': From, 'tname': tname, 'taches': u', '.join(success[name]['task']), 'codes': u', '.join(codes) }) #print mailtxt.as_string() actually_sendmail(From, (To,), mailtxt) else: e = e+1 for club in clubs: a = a + 1 tname = club To = club + u'@crans.org' codes = [x[0] + u'#' for x in digicode.list_code(club)] if not codes: codes = [digicode.gen_code(club) + u'#'] #cprint(u"Envoi du mail à %s" % To) mailtxt=mail.generate('mail_impression_ok', { 'To': To, 'From': From, 'tname': tname, 'taches': u', '.join(clubs[club]['task']), 'codes': u', '.join(codes), }) #print mailtxt.as_string() #actually_sendmail(From, (To,), mailtxt) for name in echecs: ad = con.search(u'(uid=%s)' % name) To = 'impression@lists.crans.org' if ad <> []: adh = ad[0] tname = unicode(adh['prenom'][0]) + " " + unicode(adh['nom'][0]) else: tname = name mailtxt=mail.generate('mail_impression_ok', { 'To': To, 'From': From, 'tname': tname, 'taches': u', '.join(success[name]['task']), }) #print mailtxt.as_string() actually_sendmail(From, (To,), mailtxt) if e>0: print "Des problèmes sont survenus entre %s et %s" % (debut, fin) print "Nombre total de mails envoyés :" print a print "Nombre de mails non envoyés faute de résultats LDAP :" print e #print len(success)