scripts/impression/backend/devis
rozel 9b12d8f960 Rcupration de l'utilisateur rel de cups en parsant son spool.
On ne peut pas utiliser le 2me argument pass au backend car en mode
authentifi Samba fournit root plutot que de faire suivre l'utilisateur
connect  Samba.

darcs-hash:20050616091142-061a7-4047755bb27376e46c05548d3ac06e2aac9c697b.gz
2005-06-16 11:11:42 +02:00

160 lines
5.1 KiB
Python
Executable file

#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
#
# Backend CUPS réalisant les devis
# Codé par Benoit et Fred, inspirés par CUPSPykota
# Licence : GNU General Public Licence, version 2
import sys
sys.path.append('/usr/scripts/impression')
from ipp import IPPMessage
import couts
sys.path.append('/usr/scripts/gestion')
from config import impression
from ldap_crans import crans_ldap
import tempfile
import resource
# Limitation à 50 Mo de mémoire
resource.setrlimit(resource.RLIMIT_DATA, (1024*1024*50, 1024*1024*50))
resource.setrlimit(resource.RLIMIT_RSS, (1024*1024*50, 1024*1024*50))
if len(sys.argv) == 1 :
print '%s devis "Crans" "Mail un devis au demandeur"' % 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(1) # Cela stoppe l'imprimante
if sys.argv[-1].find('/') != -1 :
# Fichier fourni
entree = open(sys.argv[-1])
else :
# Lecture sur stdin
entree = sys.stdin
#\x1B est le caractere d'échappement échap.
UEL="\x1B%-12345X"
# On ecrit les données dans un vrai fichier
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()
# 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)
user=message["job-originating-user-name"]
# Recuperation de l'adherent
base = crans_ldap()
res=base.search("login=%s"%user)['adherent']
#si on ne trouve rien
if len(res) != 1 :
sys.stderr.write("ERROR: Erreur : adherent %s non trouvé\n" % user)
# import smtplib
# conn = smtplib.SMTP('localhost')
# titre="L\'adherent n\'existe pas"
# corps="Ceci est surement un probleme dans la base\nL\'utilisateur %s existe dans le fichier de mot de passe mais n\'est pas dans la base ldap" %user
# conn.sendmail(From_imprimante, From_imprimante , mail_err % (sys.argv[1],titre,corps))
# conn.quit()
sys.exit(0) # on ne stoppe pas l'imprimante pour le moment
adherent=res[0]
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
# Options 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)
if prix.c_total_euros > (solde - impression.decouvert) :
possible = u"Désolé, je crois que cela ne va pas être possible d'imprimer.\nVous devez alimenter votre compte impression pour pouvoir imprimer ce document."
else :
possible = u"Il vous sera possible d'imprimer ce document sur Laserjet."
if prix.format=="NON_VALIDE":
possible = u"ATTENTION : Le format de papier que vous avez choisi n'est pas valide\n"
possible += u"Il ne vous sera pas possible d'imprimer ce document sur Laserjet.\n"
possible += u"Rappel : Si vous utilisez lp il faut définir l'option PageSize"
# Envoyer le mail
sujet=u"Devis d'impression n°%(numero)s : %(fichier)s" % {'numero' : sys.argv[1], 'fichier' : sys.argv[3]}
mail = u"""
Bonjour,
L'impression que vous avez demandé vous sera facturé
la modique somme de %%(prix)s.
Votre compte impression est actuellement crédité de %(solde)s euros.
Rappel : votre compte est bloqué à %(blocage)s euros
%(possible)s
Voici le détail de votre devis
Résultats de l'analyse :
Noir (par face) : %%(noir)s%%%%
Couleur (par face) : %%(couleur)s%%%%
Nombre de faces (par copie) : %%(faces)s
Nombre de pages (par copie) : %%(pages)s
Nombre de copies : %%(copies)s
Format : %%(format)s
Prix total : %%(prix)s
--
L'imprimante devis
""" % {'solde' : solde, 'blocage' : str(impression.decouvert), 'possible' : possible}
sys.stderr.write("DEBUG: Envoi du mail..\n" )
prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : nom_adher, 'adrmail' : adrmail}, sujet, mail )
sys.stderr.write("DEBUG: Fin du devis..\n" )