#!/usr/bin/env python # -*- coding: iso-8859-15 -*- # Fonctions utilisées par les backend devis et laserjet # Écrit par Benoit avec la contribution de Brice et Fred # Licence : GNU General Public Licence, version 2 import sys, tempfile from ipp import IPPMessage import couts sys.path.append('/usr/scripts/gestion') from ldap_crans import crans_ldap def utilisateur(job, user, rw): """ Renvoie l'adherent qui imprime le job * job est le n° du job (argument n°1 des paramètres passés au backend) * user est l'utilisateur (argument n°2 des paramètres passés au backend) * rw vaut 1 si on veut modifier le compte LDAP de l'adhérent, 0 dans le cas contraire """ # Utilisation de Samba qui s'authentifie en root : on parse le spool if user=="root": sys.stderr.write("DEBUG: Utilisateur Root passé en paramètre\n") sys.stderr.write("DEBUG: On récupère le vrai utilisateur dans le spool\n") if len(job) < 5 : fichier_ipp = "c%05i" % int(job) else: fichier_ipp = "c%s" % job try: message = IPPMessage(open('/var/spool/cups/%s' % fichier_ipp).read()) except: sys.stderr.write("ERROR: Erreur : Ne peut pas ouvrir le fichier /var/spool/cups/%s" % fichier_ipp) sys.exit(0) # On conclue l'impression user = message["job-originating-user-name"] # Récupération de l'adhérent base = crans_ldap() if rw == 0 : res=base.search("login=%s"%user)['adherent'] else: res=base.search("login=%s"%user,'w')['adherent'] # Si on ne trouve rien : if len(res) != 1 : sys.stderr.write("ERROR: Erreur : adhérent %s non trouvé\n" % user) sys.exit(0) # On conclue l'impression sans stopper l'imprimante adherent=res[0] return adherent def fichier(entree): """ Effectue le nettoyage de entree et écrie dans fic""" #\x1B est le caractere d'échappement échap. UEL="\x1B%-12345X" fic = tempfile.NamedTemporaryFile() 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 élimine 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() return fic def calcul_prix(nom_fic, media): """Calcul le prix d'une impression * media vaut 'transparency' si impression sur transparent * nom_fic est le nom du fichier à imprimmer """ # Options par défaut (Couleur) : mode_couleur = "Couleur" if media == "transparency": format = "transparent" #Temporaire pour debugage ## fs=open(nom_fic,'r') ## fd=open('/tmp/benoit_Routard','w') ## while 1: ## txt=fs.readline() ## if txt == '': ## break ## fd.write(txt) ## fs.close() ## fd.close() # Calcul du cout de l'impression : try: prix = couts.cout(nom_fic, mode_couleur) except: sys.stderr.write("ERROR: Erreur : impossible de calculer le couts de %s." % nom_fic) sys.exit(1) # On arrete l'imprimante return prix