#!/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, rw): """ Renvoie l'adherent qui imprime le job * job est le n°du job (argument n°1 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 """ # Récupération du nom de l'utilisateur # On n'utilise pas sys.argv[2], car Samba fournit root # en mode Authentifie 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 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" # 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