root / pykota / trunk / bin / pykota @ 826

Revision 826, 6.1 kB (checked in by jalet, 21 years ago)

Stupid bug wrt exception handlingand value conversion

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
Line 
1#! /usr/bin/env python
2
3# PyKota accounting filter
4#
5# PyKota - Print Quotas for CUPS
6#
7# (c) 2003 Jerome Alet <alet@librelogiciel.com>
8# You're welcome to redistribute this software under the
9# terms of the GNU General Public Licence version 2.0
10# or, at your option, any higher version.
11#
12# You can read the complete GNU GPL in the file COPYING
13# which should come along with this software, or visit
14# the Free Software Foundation's WEB site http://www.fsf.org
15#
16# $Id$
17#
18# $Log$
19# Revision 1.13  2003/02/27 23:59:28  jalet
20# Stupid bug wrt exception handlingand value conversion
21#
22# Revision 1.12  2003/02/27 23:48:41  jalet
23# Correctly maps PyKota's log levels to syslog log levels
24#
25# Revision 1.11  2003/02/27 22:55:20  jalet
26# WARN log priority doesn't exist.
27#
28# Revision 1.10  2003/02/27 22:43:21  jalet
29# Missing import
30#
31# Revision 1.9  2003/02/27 22:40:26  jalet
32# Correctly handles cases where the printer is off.
33#
34# Revision 1.8  2003/02/09 12:56:53  jalet
35# Internationalization begins...
36#
37# Revision 1.7  2003/02/07 10:23:48  jalet
38# Avoid a possible future name clash
39#
40# Revision 1.6  2003/02/06 22:54:33  jalet
41# warnpykota should be ok
42#
43# Revision 1.5  2003/02/05 22:45:25  jalet
44# Forgotten import
45#
46# Revision 1.4  2003/02/05 22:42:51  jalet
47# Typo
48#
49# Revision 1.3  2003/02/05 22:38:39  jalet
50# Typo
51#
52# Revision 1.2  2003/02/05 22:16:20  jalet
53# DEVICE_URI is undefined outside of CUPS, i.e. for normal command line tools
54#
55# Revision 1.1  2003/02/05 21:28:17  jalet
56# Initial import into CVS
57#
58#
59#
60
61import sys
62import os
63
64from pykota.tool import PyKotaTool, PyKotaToolError
65from pykota.requester import openRequester, PyKotaRequesterError
66
67class PyKotaFilter(PyKotaTool) :   
68    """Class for the PyKota filter."""
69    def __init__(self, username) :
70        PyKotaTool.__init__(self, isfilter=1)
71        self.username = username
72        self.requester = openRequester(self.config, self.printername)
73        self.printerhostname = self.getPrinterHostname()
74   
75    def getPrinterHostname(self) :
76        """Returns the printer hostname."""
77        device_uri = os.environ.get("DEVICE_URI", "")
78        # TODO : check this for more complex urls than ipp://myprinter.dot.com:631/printers/lp
79        try :
80            (backend, destination) = device_uri.split(":", 1) 
81        except ValueError :   
82            raise PyKotaToolError, "Invalid DEVICE_URI : %s\n" % device_uri
83        while destination.startswith("/") :
84            destination = destination[1:]
85        return destination.split("/")[0].split(":")[0]
86       
87    def filterInput(self, inputfile) :
88        """Transparent filter."""
89        mustclose = 0   
90        if inputfile is not None :   
91            infile = open(inputfile, "rb")
92            mustclose = 1
93        else :   
94            infile = sys.stdin
95        data = infile.read(256*1024)   
96        while data :
97            sys.stdout.write(data)
98            data = infile.read(256*1024)
99        if mustclose :   
100            infile.close()
101           
102def main() :   
103    """Do it, and do it right !"""
104    #
105    # This is a CUPS filter, so we should act and die like a CUPS filter when needed
106    narg = len(sys.argv)
107    if narg not in (6, 7) :   
108        sys.stderr.write("ERROR: %s job-id user title copies options [file]\n" % sys.argv[0])
109        return 1
110    elif narg == 7 :   
111        # input file
112        inputfile = sys.argv[6]
113    else :   
114        # stdin
115        inputfile = None
116       
117    #   
118    # According to CUPS documentation, the username is the third command line argument
119    username = sys.argv[2].strip()   
120   
121    # Initializes the current tool
122    kotafilter = PyKotaFilter(username)   
123   
124    # Get the page counter directly from the printer itself
125    try :
126        counterbeforejob = kotafilter.requester.getPrinterPageCounter(kotafilter.printerhostname) # TODO use printername instead, make them match from CUPS' config files
127    except PyKotaRequesterError, msg :
128        # can't get actual page counter, assume printer is off, but warns in log
129        kotafilter.logger.log_message("%s" % msg, "warn")
130        printerIsOff = 1
131    else :   
132        printerIsOff = 0
133       
134    # Get the last page counter and last username from the Quota Storage backend
135    pgc = kotafilter.storage.getPrinterPageCounter(kotafilter.printername)   
136    if pgc is None :
137        # The printer is unknown from the Quota Storage perspective
138        # we let the job pass through, but log a warning message
139        kotafilter.logger.log_message(_("Printer %s not registered in the PyKota system") % kotafilter.printername, "warn")
140    else :   
141        # get last values from Quota Storage
142        (lastpagecounter, lastusername) = (pgc["pagecounter"], pgc["lastusername"])
143       
144        # if printer is off then we assume the correct counter value is the last one
145        if printerIsOff :
146            counterbeforejob = lastpagecounter
147           
148        # Update the last page counter and last username in the Quota Storage backend
149        # set them to current user and
150        kotafilter.storage.updatePrinterPageCounter(kotafilter.printername, username, counterbeforejob) # TODO : allow or deny users not in quota system, and die cleanly if needed
151       
152        # Is the current user allowed to print at all ?
153        action = kotafilter.warnUserPQuota(username)
154        if action == "DENY" :
155            # No, just die cleanly
156            return 1
157           
158        # Yes     
159        if (lastpagecounter is None) or (lastusername is None) :
160            lastusername = username
161            lastpagecounter = counterbeforejob
162        jobsize = (counterbeforejob - lastpagecounter)   
163        if jobsize >= 0:
164            kotafilter.storage.updateUserPQuota(lastusername, kotafilter.printername, jobsize)
165            kotafilter.warnUserPQuota(lastusername)
166        else :   
167            kotafilter.logger.log_message(_("Error in page count value %i for user %s on printer %s") % (jobsize, kotafilter.printername, lastusername), "error")
168       
169    # pass the job untouched to the underlying layer
170    kotafilter.filterInput(inputfile)     
171   
172    return 0
173
174if __name__ == "__main__" :   
175    sys.exit(main() or 0)
Note: See TracBrowser for help on using the browser.