root / pykota / trunk / bin / pykotme @ 1911

Revision 1911, 7.5 kB (checked in by jalet, 19 years ago)

Heavy work on pkbanner. Not finished yet though, but mostly works.

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