root / pykota / trunk / bin / pykotme @ 1546

Revision 1546, 7.2 kB (checked in by jalet, 20 years ago)

Now all tracebacks include PyKota's version number

  • 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# -*- coding: ISO-8859-15 -*-
3
4# PyKota Print Quota Quote sender
5#
6# PyKota - Print Quotas for CUPS and LPRng
7#
8# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
9# This program is free software; you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation; either version 2 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program; if not, write to the Free Software
21# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
22#
23# $Id$
24#
25# $Log$
26# Revision 1.12  2004/06/18 13:34:49  jalet
27# Now all tracebacks include PyKota's version number
28#
29# Revision 1.11  2004/06/07 18:43:40  jalet
30# Fixed over-verbose exits when displaying help or version number
31#
32# Revision 1.10  2004/06/03 21:50:34  jalet
33# Improved error logging.
34# crashrecipient directive added.
35# Now exports the job's size in bytes too.
36#
37# Revision 1.9  2004/05/21 20:53:34  jalet
38# Now pykotme doesn't spawn a new process anymore to compute job's size, but
39# use the PDLAnalyzer class directly
40#
41# Revision 1.8  2004/05/10 07:23:21  jalet
42# pykotme now uses pkpgcounter to compute the job's size.
43#
44# Revision 1.7  2004/01/12 22:43:40  jalet
45# New formula to compute a job's price
46#
47# Revision 1.6  2004/01/08 14:10:32  jalet
48# Copyright year changed.
49#
50# Revision 1.5  2003/10/09 21:25:25  jalet
51# Multiple printer names or wildcards can be passed on the command line
52# separated with commas.
53# Beta phase.
54#
55# Revision 1.4  2003/10/07 09:07:27  jalet
56# Character encoding added to please latest version of Python
57#
58# Revision 1.3  2003/07/29 20:55:17  jalet
59# 1.14 is out !
60#
61# Revision 1.2  2003/07/25 10:41:29  jalet
62# Better documentation.
63# pykotme now displays the current user's account balance.
64# Some test changed in ldap module.
65#
66# Revision 1.1  2003/07/03 09:44:01  jalet
67# Now includes the pykotme utility
68#
69#
70#
71
72import sys
73import os
74import pwd
75
76from pykota import version
77from pykota.tool import PyKotaTool, PyKotaToolError, crashed
78from pykota.config import PyKotaConfigError
79from pykota.storage import PyKotaStorageError
80from pykota.pdlanalyzer import PDLAnalyzer, PDLAnalyzerError
81
82__doc__ = """pykotme v%s (c) 2003-2004 C@LL - Conseil Internet & Logiciels Libres
83
84Gives print quotes to users.
85
86command line usage :
87
88  pykotme  [options]  [files]
89
90options :
91
92  -v | --version       Prints pykotme's version number then exits.
93  -h | --help          Prints this message then exits.
94 
95  -P | --printer p     Gives a quote for this printer only. Actually p can
96                       use wildcards characters to select only
97                       some printers. The default value is *, meaning
98                       all printers.
99                       You can specify several names or wildcards,
100                       by separating them with commas.
101 
102examples :                             
103
104  $ pykotme --printer apple file1.ps file2.ps
105 
106  This will give a print quote to the current user. The quote will show
107  the price and size of a job consisting in file1.ps and file2.ps
108  which would be sent to the apple printer.
109 
110  $ pykotme --printer apple,hplaser <file1.ps
111 
112  This will give a print quote to the current user. The quote will show
113  the price and size of a job consisting in file1.ps as read from
114  standard input, which would be sent to the apple or hplaser
115  printer.
116
117  $ pykotme
118 
119  This will give a quote for a job consisting of what is on standard
120  input. The quote will list the job size, and the price the job
121  would cost on each printer.
122
123
124This program is free software; you can redistribute it and/or modify
125it under the terms of the GNU General Public License as published by
126the Free Software Foundation; either version 2 of the License, or
127(at your option) any later version.
128
129This program is distributed in the hope that it will be useful,
130but WITHOUT ANY WARRANTY; without even the implied warranty of
131MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
132GNU General Public License for more details.
133
134You should have received a copy of the GNU General Public License
135along with this program; if not, write to the Free Software
136Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
137
138Please e-mail bugs to: %s""" % (version.__version__, version.__author__)
139       
140       
141class PyKotMe(PyKotaTool) :       
142    """A class for pykotme."""
143    def main(self, files, options) :
144        """Gives print quotes."""
145        if (not sys.stdin.isatty()) and ("-" not in files) :
146            files.append("-")
147        totalsize = 0   
148        for filename in files :   
149            try :
150                parser = PDLAnalyzer(filename)
151                totalsize += parser.getJobSize()
152            except PDLAnalyzerError, msg :   
153                sys.stderr.write("%s\n" % msg)
154                sys.stderr.flush()
155           
156        # get current user
157        uid = os.geteuid()
158        username = pwd.getpwuid(uid)[0]
159        user = self.storage.getUser(username)
160        if user.Exists and user.LimitBy and (user.LimitBy.lower() == "balance"):
161            print _("Your account balance : %.2f") % (user.AccountBalance or 0.0)
162           
163        printers = self.storage.getMatchingPrinters(options["printer"])
164        if not printers :
165            raise PyKotaToolError, _("There's no printer matching %s") % options["printer"]
166           
167        print _("Job size : %i pages") % totalsize   
168        for printer in printers :
169            userpquota = self.storage.getUserPQuota(user, printer)
170            cost = userpquota.computeJobPrice(totalsize)
171            print _("Cost on printer %s : %.2f") % (printer.Name, cost)
172           
173if __name__ == "__main__" : 
174    retcode = 0
175    try :
176        defaults = { \
177                     "printer" : "*", \
178                   }
179        short_options = "vhP:"
180        long_options = ["help", "version", "printer="]
181       
182        # Initializes the command line tool
183        sender = PyKotMe(doc=__doc__)
184       
185        # parse and checks the command line
186        (options, args) = sender.parseCommandline(sys.argv[1:], short_options, long_options, allownothing=1)
187       
188        # sets long options
189        options["help"] = options["h"] or options["help"]
190        options["version"] = options["v"] or options["version"]
191        options["printer"] = options["P"] or options["printer"] or defaults["printer"]
192       
193        if options["help"] :
194            sender.display_usage_and_quit()
195        elif options["version"] :
196            sender.display_version_and_quit()
197        else :
198            retcode = sender.main(args, options)
199    except SystemExit :       
200        pass
201    except :
202        try :
203            sender.crashed("pykotme failed")
204        except :   
205            crashed("pykotme failed")
206        retcode = -1
207
208    try :
209        sender.storage.close()
210    except (TypeError, NameError, AttributeError) :   
211        pass
212       
213    sys.exit(retcode)   
Note: See TracBrowser for help on using the browser.