scripts/impression/backend/laserjet
rozel afd6e6884b Patch de Brice que j'ai converti du C en python pour qu'il fonctionne :-P
darcs-hash:20050619113623-061a7-915b504f80e98510dd01937c52108edf551492e8.gz
2005-06-19 13:36:23 +02:00

256 lines
8.6 KiB
Python
Executable file

#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
#
# 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, time, tempfile, os
sys.path.append('/usr/scripts/impression')
import crans_backend, pjl_comm
sys.path.append('/usr/scripts/gestion')
from config import impression
## Préliminaires :
if len(sys.argv) == 1 :
print '%s laserjet "Crans" "Imprime tout en debitant"' % sys.argv[0]
sys.exit(0)
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
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]}
mail_err = u"""
Bonjour,
Il y a eu une erreur lors de votre impression
Le message d'erreur est le suivant :
%%(erreur)s
Si l'erreur se reproduit envoyez un mail à %(adresse_imprimante)s
--
L'imprimante
""" % {"adresse_imprimante" : impression.From_imprimante}
mail_ok = u"""
Bonjour,
L'impression que vous avez demandé coûte la modique somme
de %%(prix)s.
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
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
"""
mail_err_solde = u"""
Bonjour,
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 :
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="%s"
@PJL SET JOBNAME="Downloads for -"
@PJL SET DUPLICATEJOB = REPLACE
""" % utilisateur.Nom()
# Postscript mal formatté :
if prix.erreur:
# On loggue l'erreur
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' : utilisateur.Nom(), 'adrmail' : adrmail}, sujet, mail_err_solde % { 'solde' : utilisateur.solde() , 'prix' : prix.str_cout })
# Tout est OK, on imprime
else:
try:
#Envoi du fichier a l'imprimante
nom_fic2=tempfile.mktemp()
if(prix.recto_v=='Recto' or prix.faces==1):
sys.stderr.write("DEBUG: Ceci est un recto simple, on inverse juste l'ordre..\n" )
os.system("cp %s %s " % (nom_fic, nom_fic2))
os.system("psselect -r %s > %s " % (nom_fic, nom_fic2))
else:
sys.stderr.write("DEBUG: recto verso on permute deux a deux..\n" )
if(prix.faces%2 ==1):
sys.stderr.write("DEBUG: nombre de faces impair..\n" )
prix.faces+=1
sys.exit(0)
else:
sys.stderr.write("DEBUG: nombre de faces pair..\n" )
liste_pages=""
for i in range(1,int(prix.faces/2)+1):
liste_pages+=str(2*i)+","+str(2*i-1)+","
#on enleve la virgule superflue
liste_pages=liste_pages[:-1]
sys.stderr.write("DEBUG: Liste pages : %s\n" % liste_pages )
os.system("cp %s %s " % (nom_fic, nom_fic2))
os.system("psselect -p%s %s > %s 2>/dev/null" % (liste_pages, nom_fic, nom_fic2))
sys.stderr.write("DEBUG: Envoi du fichier..\n" )
imprimante=pjl_comm.hp9500()
imprimante.cx_open()
# imprimante.pjl_command('RESET')
imprimante.pjl_command('USTATUS PAGE = ON')
imprimante.pjl_command('USTATUS JOB = ON')
imprimante.pjl_command('USTATUS DEVICE = ON')
# imprimante.pjl_command('SET MEDIATYPE=TRANSPARENCY') #a tester
# 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, sys.argv[1], utilisateur.Nom())
os.system("cp %s /tmp/last_printed.ps" % nom_fic2)
os.system("chmod 666 /tmp/last_printed.ps")
os.system("rm %s" % nom_fic2)
message=imprimante.pjl_read()
i=0
sys.stderr.write("DEBUG: Message de l'imprimante : \n%s\n" %message )
while(message.find("PAGES=")==-1 and i<200):
message=imprimante.pjl_read()
sys.stderr.write("DEBUG: Message : %s\n" %message )
sys.stderr.write("DEBUG: Impression non terminée..\n" )
i=i+1
time.sleep(2)
sys.stderr.write("DEBUG: Impression terminée temporisation de 20s....\n" )
time.sleep(10)
imprimante.cx_close()
time.sleep(10)
# On débite l'adhérent si l'impression a eu lieu
# TODO: si messsage contient DISPLAY="Annulation de la tache"
# ne pas debiter l'utilisateur et envoyer le mail adequat
utilisateur.solde(-prix.c_total_euros)
utilisateur.save()
#Génération du code et écriture du code
i=0
code=0
import random
#instance de base
rand=random.Random()
#graine automatique avec le temps
rand.seed()
while(i<1000) :
#on génère le numéro de session
code=rand.randint(100000,999999) #pour avoir six chiffres
#on sauvegarde les données concernant la session dans un fichier qui périme dans duree_session
try:
open("/var/impression/codes/%d" %code, 'r')
except :
break
i=i+1
if code:
codefichier=open("/var/impression/codes/%d" %code, 'w')
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.exit(0)
#envoi du mail avec le code et le prix
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\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
s = StringIO()
sys.stderr = s
traceback.print_exc()
sys.stderr = sys.__stderr__
traceback = s.getvalue()
try:
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 ?
sys.exit(0)