#! /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() # Récupérer l'IP #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("Ne peut pas ouvrir/parser le fichier /var/spool/cups/%s" % fichier_ipp) #recuperation du nom de l'utilisateur user=sys.argv[2] #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" )