From e76f2b4041ae106b60656ddb0541e201a3bd750a Mon Sep 17 00:00:00 2001 From: rozel Date: Sat, 18 Jun 2005 14:31:46 +0200 Subject: [PATCH] Principalement utilisation des fonctions de crans_backend, correction de fautes de franais et plus d'chec l'envoi du traceback sur la M-L impression. + petites modifs diverses et varies darcs-hash:20050618123146-061a7-1838deebcafb78775682264dede02071f06c79b7.gz --- impression/backend/laserjet | 213 ++++++++++++++---------------------- 1 file changed, 80 insertions(+), 133 deletions(-) diff --git a/impression/backend/laserjet b/impression/backend/laserjet index 8bef54f3..3708ba86 100755 --- a/impression/backend/laserjet +++ b/impression/backend/laserjet @@ -1,30 +1,22 @@ #! /usr/bin/env python # -*- coding: iso-8859-15 -*- # -# Backend CUPS pour laserjet -# tout en réalisant le devis et debitant. -# Codé par Benoit , Fred et Braice, inspirés par CUPSPykota +# Backend CUPS pour laserjet : imprime et debite +# Codé par Benoit, Fred et Braice, inspirés par CUPSPykota # Licence : GNU General Public Licence, version 2 #TODO #Parser ce que réponds l'imprimante # -import sys,os +import sys, time, tempfile, os sys.path.append('/usr/scripts/impression') -from ipp import IPPMessage -import couts -import pjl_comm +import crans_backend, pjl_comm sys.path.append('/usr/scripts/gestion') from config import impression -from ldap_crans import crans_ldap -import tempfile -import time +## Préliminaires : -base=crans_ldap() - -#on teste les argument AVANT le reste if len(sys.argv) == 1 : print '%s laserjet "Crans" "Imprime tout en debitant"' % sys.argv[0] sys.exit(0) @@ -33,7 +25,15 @@ if len(sys.argv) not in (6, 7) : sys.stderr.write("ERROR: %s job-id user title copies options [file]\n" % sys.argv[0]) sys.exit(0) # On passe sans stopper -#préparation des mails +if sys.argv[-1].find('/') != -1 : + # Fichier fourni + entree = open(sys.argv[-1]) +else : + # Lecture sur stdin + entree = sys.stdin + + +# Préparation des mails sujet=u"Impression n°%(numero)s : %(fichier)s" % {'numero' : sys.argv[1], 'fichier' : sys.argv[3]} @@ -53,20 +53,19 @@ L'imprimante mail_ok = u""" - Bonjour, -L'impression que vous avez demandé coute la modique somme +L'impression que vous avez demandé coûte la modique somme de %%(prix)s. -Votre ancien solde sur votre compte impression etait crédité de %(solde)s euros. +L'ancien solde de votre compte impression valait %(solde)s euros. + +L'impression s'est correctement effectuée et votre compte a été débité. Rappel : votre compte est bloqué à %(blocage)s euros -L'impression a été correctement effectuée et votre compte a été débité. - -Pour accéder à l'imprimante votre code unique pour cette impression est -le suivant %(code)s# +Pour accéder au local de l'imprimante (4ème étage du Bat J), +le code unique de cette impression est : %(code)s# -- L'imprimante @@ -75,126 +74,73 @@ L'imprimante mail_err_solde = u""" Bonjour, -Votre compte n'est pas assez approvisionné pour cette impression. -Votre solde actuel est de %(solde)s or l'impressiom coûte %(prix)s. -Par conséquent, votre compte ne sera pas débité. +Votre compte n'est pas assez approvisionné pour effectuer l'impression +demandée. + +En effet, votre solde actuel est de %(solde)s euros et l'impression +coûte %(prix)s euros. -- L'imprimante """ +## Récuperation de l'utilisateur en écriture : -debut = """.%-12345X@PJL SET STRINGCODESET=UTF8 +utilisateur = crans_backend.utilisateur(sys.argv[1],1) + +# Récuperation de l'adresse mail +adrmail = utilisateur.mail() +if adrmail.find('@') == -1 : + adrmail += "@crans.org" +adrmail = adrmail.encode("iso8859-15") +sys.stderr.write("DEBUG: Utilisateur %s recupere.\n" % utilisateur.Nom()) + +## Nettoyage du fichier : + +fic = crans_backend.fichier(entree) +nom_fic = fic.name +sys.stderr.write("DEBUG: Fichier %s nettoye.\n" % nom_fic) + + +## Calcul du prix de l'impression : + +if "media=transparency" in sys.argv: + prix = crans_backend.calcul_prix(nom_fic, "transparency") +else: + prix = crans_backend.calcul_prix(nom_fic, "") +sys.stderr.write("DEBUG: Prix : %s format %s recto-verso : %s.\n" %(prix.c_total_euros,prix.format,prix.recto_v) ) + +## Formulation du mail au vue des résultats +if not prix.erreur: + if prix.c_total_euros > (utilisateur.solde() - impression.decouvert) : + err_solde = 1 + else : + err_solde = 0 + +debut = """.%%-12345X@PJL SET STRINGCODESET=UTF8 @PJL SET STRINGCODESET=UTF8 @PJL SET HOLD=ON @PJL SET HOLDTYPE=PRIVATE @PJL SET HOLDKEY="1234" -@PJL SET USERNAME="PD" +@PJL SET USERNAME="%s" @PJL SET JOBNAME="Downloads for -" @PJL SET DUPLICATEJOB = REPLACE -""" +""" % utilisateur.Nom() - -if sys.argv[-1].find('/') != -1 : - # Fichier fourni - entree = open(sys.argv[-1]) -else : - # Lecture sur stdin - entree = sys.stdin - -# Recuperation du nom de l'utilisateur -#user=sys.argv[2] #On ne fait pas comme ca, car samba passe l'utilisateur root -if len(sys.argv[1]) < 5 : - fichier_ipp = "c%05i" % int(sys.argv[1]) -else: - fichier_ipp = "c%s" % sys.argv[1] -try: - message = IPPMessage(open('/var/spool/cups/%s' % fichier_ipp).read()) -except: - sys.stderr.write("ERROR: Erreur : Ne peut pas ouvrir/parser le fichier /var/spool/cups/%s" % fichier_ipp) - sys.exit(0) -user=message["job-originating-user-name"] - -# Recuperation de l'adherent en écriture -res=base.search("login=%s"%user,'w')['adherent'] -#si on ne trouve rien -if len(res) != 1 : - sys.stderr.write("ERROR: Erreur : adherent %s non trouvé\n" % user) - sys.exit(0) # on ne stoppe pas l'imprimante -adherent=res[0] - - -#\x1B est le caractere d'échappement échap. -UEL="\x1B%-12345X" - -fic = tempfile.NamedTemporaryFile() -nom_fic=fic.name -ligne = entree.readline() -# On rends le fichier propre et on enleve les options qui nous gènent -while ligne: - #On ne choisit pas le bac de sortie - if ligne.find('%%BeginFeature: *OutputBin') != -1: - while ligne.find('%%EndFeature') == -1: - ligne = entree.readline() - ligne = entree.readline() - #On ne choisit pas le bac d'entree - if ligne.find('%%BeginFeature: *InputSlot') != -1: - while ligne.find('%%EndFeature') == -1: - ligne = entree.readline() - ligne = entree.readline() - #On elimine les instructions PJL - #Normalement on n'est pas obligé de retirer le UEL mais c'est plus propre - while ligne.startswith('@PJL') or ligne.startswith(UEL): - ligne = entree.readline() - fic.write(ligne) - ligne = entree.readline() -fic.flush() - - -# Récupérer l'adresse mail -adrmail = adherent.mail() -nom_adher = adherent.Nom() -if adrmail.find('@') == -1 : - adrmail += "@crans.org" -adrmail = adrmail.encode("iso8859-15") - -# Récupérer le solde -solde = adherent.solde() - -## calcul du prix - -# Option par défaut (Couleur) -mode_couleur = "Couleur" - -# On récupère les options passées -if "media=transparency" in sys.argv: - format = "transparent" - -# Calcul du coût de l'impression -sys.stderr.write("DEBUG: Calcul du prix..\n" ) -prix = couts.cout(nom_fic, mode_couleur) -sys.stderr.write("DEBUG: Prix : %s format %s recto-verso : %s..\n" %(prix.c_total_euros,prix.format,prix.recto_v) ) - -raison="" +# Postscript mal formatté : if prix.erreur: - raison=prix.erreur -else: - if prix.c_total_euros > (solde - impression.decouvert) : - err_solde= 1 - else : - err_solde=0 - -#Si il y a une erreur (compte non approvisionné, postscript mal formatté) -if raison: # On loggue l'erreur - sys.stderr.write( ("ERROR: Erreur : utilisateur : \"%s\" raison %s" % (user,raison)).encode('latin-1')) - #envoi du mail d'erreur - prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : nom_adher, 'adrmail' : adrmail}, sujet, mail_err % {'erreur' : raison} ) + sys.stderr.write( ("ERROR: Erreur : utilisateur : \"%s\" raison %s" % (utilisateur.Nom(), prix.erreur)).encode('latin-1')) + # et on envoi le mail d'erreur + prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : utilisateur.Nom(), 'adrmail' : adrmail}, sujet, mail_err % {'erreur' : prix.erreur} ) + +# Compte non suffisamment approvisionné : elif err_solde: - prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : nom_adher, 'adrmail' : adrmail}, sujet, mail_err_solde % { 'solde' : solde , 'prix' : prix.str_cout }) -#Tout est OK on imprime + prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : utilisateur.Nom(), 'adrmail' : adrmail}, sujet, mail_err_solde % { 'solde' : utilisateur.solde() , 'prix' : prix.str_cout }) + +# Tout est OK, on imprime else: #Adaptation de la facture @@ -233,7 +179,7 @@ else: # imprimante.pjl_command('SET MEDIATYPE=PAPER') # imprimante.pjl_command('SET OUTBIN=LOWER') #a tester # imprimante.pjl_command('SET OUTBIN=UPPER') #a tester - imprimante.write_postscript(nom_fic2, user, nom_adher) + imprimante.write_postscript(nom_fic2, sys.argv[1], utilisateur.Nom()) os.system("cp %s /tmp/last_printed.ps" % nom_fic2) os.system("chmod 666 /tmp/last_printed.ps") @@ -253,8 +199,8 @@ else: imprimante.cx_close() time.sleep(10) # On débite l'adhérent si l'impression a eu lieu - adherent.solde(-prix.c_total_euros) - adherent.save() + utilisateur.solde(-prix.c_total_euros) + utilisateur.save() #Génération du code et écriture du code @@ -277,18 +223,18 @@ else: if code: codefichier=open("/var/impression/codes/%d" %code, 'w') - codefichier.write("Utilisateur %s\n"%(nom_adher)) + codefichier.write("Utilisateur %s\n"%(utilisateur.Nom())) codefichier.close() else : #Grosse erreur faudra faire qqch - sys.stderr.write("ERROR: Erreur il n'y a pas de code disponible" ) + sys.stderr.write("ERROR: Erreur : il n'y a pas de code disponible" ) sys.exit(0) #envoi du mail avec le code et le prix - prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : nom_adher, 'adrmail' : adrmail}, sujet, mail_ok % {'solde' : solde, 'blocage' : str(impression.decouvert), 'code' : code }) + prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : utilisateur.Nom(), 'adrmail' : adrmail}, sujet, mail_ok % {'solde' : utilisateur.solde(), 'blocage' : str(impression.decouvert), 'code' : code }) except: - sys.stderr.write("ERROR: Erreur , impression annulée" ) - prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : nom_adher, 'adrmail' : adrmail}, sujet, mail_err % {'erreur' : u"Le fichier n'a pu être imprimé, \veuillez reessayer plus tard.\n"} ) + sys.stderr.write("ERROR: Erreur , impression annulée\n" ) + prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : utilisateur.Nom(), 'adrmail' : adrmail}, sujet, mail_err % {'erreur' : u"Le fichier n'a pu être imprimé.\n Veuillez réessayer plus tard.\n"} ) # Report de bug import traceback from cStringIO import StringIO @@ -299,10 +245,11 @@ else: sys.stderr = sys.__stderr__ traceback = s.getvalue() try: - prix.send_mail("Impression <%s>" % impression.From_imprimante , "ERREUR " + sujet, "Une erreur c'est produite lors de cette impression, voici le compte rendu :\n" + traceback) - sys.stderr.write("INFO: Un rapport de bug à été automatiquement envoyé.\n") + prix.send_mail("Impression <%s>" % impression.From_imprimante , u"ERREUR " + sujet, "Une erreur s'est produite lors de cette impression, voici le compte rendu :\n" + traceback) + sys.stderr.write("INFO: Un rapport de bug a ete automatiquement envoye.\n") except : sys.stderr.write("ERROR: Impossible d'envoyer le rapport de bug.\n") + sys.stderr.write("ERROR: %s \n" % traceback) # On loggue ce que ne loggue pas cups quelquepart ?