root / pykota / trunk / bin / repykota @ 1410

Revision 1257, 10.4 kB (checked in by jalet, 21 years ago)

Copyright year changed.

  • 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 Reports generator
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.46  2004/01/08 14:10:32  jalet
27# Copyright year changed.
28#
29# Revision 1.45  2003/10/09 21:25:25  jalet
30# Multiple printer names or wildcards can be passed on the command line
31# separated with commas.
32# Beta phase.
33#
34# Revision 1.44  2003/10/07 09:07:27  jalet
35# Character encoding added to please latest version of Python
36#
37# Revision 1.43  2003/08/18 16:35:28  jalet
38# New pychecker pass, on the tools this time.
39#
40# Revision 1.42  2003/07/29 20:55:17  jalet
41# 1.14 is out !
42#
43# Revision 1.41  2003/07/07 12:19:52  jalet
44# Now repykota and warnpykota --groups check the groups the user is a member of
45# in the print quota database, not in the system passwd/group files
46#
47# Revision 1.40  2003/06/30 12:46:15  jalet
48# Extracted reporting code.
49#
50# Revision 1.39  2003/06/25 14:10:01  jalet
51# Hey, it may work (edpykota --reset excepted) !
52#
53# Revision 1.38  2003/06/15 22:26:52  jalet
54# More work on LDAP
55#
56# Revision 1.37  2003/06/10 16:37:54  jalet
57# Deletion of the second user which is not needed anymore.
58# Added a debug configuration field in /etc/pykota.conf
59# All queries can now be sent to the logger in debug mode, this will
60# greatly help improve performance when time for this will come.
61#
62# Revision 1.36  2003/06/06 14:21:08  jalet
63# New LDAP schema.
64# Small bug fixes.
65#
66# Revision 1.35  2003/05/28 13:56:24  jalet
67# Unneeded code.
68#
69# Revision 1.34  2003/04/29 22:03:38  jalet
70# Better error handling.
71#
72# Revision 1.33  2003/04/28 08:25:48  jalet
73# Small display bug in repykota was fixed.
74#
75# Revision 1.32  2003/04/23 22:13:56  jalet
76# Preliminary support for LPRng added BUT STILL UNTESTED.
77#
78# Revision 1.31  2003/04/23 09:58:17  jalet
79# Prices per page/job are now displayed
80#
81# Revision 1.30  2003/04/18 08:34:51  jalet
82# Minor fix.
83#
84# Revision 1.29  2003/04/18 08:29:30  jalet
85# Minor bug fix
86#
87# Revision 1.28  2003/04/17 09:36:30  jalet
88# Bad alignment in output
89#
90# Revision 1.27  2003/04/17 09:26:21  jalet
91# repykota now reports account balances too.
92#
93# Revision 1.26  2003/04/16 12:35:49  jalet
94# Groups quota work now !
95#
96# Revision 1.25  2003/04/15 11:30:57  jalet
97# More work done on money print charging.
98# Minor bugs corrected.
99# All tools now access to the storage as priviledged users, repykota excepted.
100#
101# Revision 1.24  2003/04/14 20:05:20  jalet
102# Reversed test.
103#
104# Revision 1.23  2003/04/11 14:42:54  jalet
105# Translations
106#
107# Revision 1.21  2003/04/10 21:47:20  jalet
108# Job history added. Upgrade script neutralized for now !
109#
110# Revision 1.20  2003/04/08 21:31:39  jalet
111# (anything or 0) = anything !!! Go back to school Jerome !
112#
113# Revision 1.19  2003/04/08 21:13:44  jalet
114# Prepare --groups option to work.
115#
116# Revision 1.18  2003/04/08 21:10:18  jalet
117# Checks --groups option presence instead of --users because --users is the default.
118#
119# Revision 1.17  2003/03/29 13:45:27  jalet
120# GPL paragraphs were incorrectly (from memory) copied into the sources.
121# Two README files were added.
122# Upgrade script for PostgreSQL pre 1.01 schema was added.
123#
124# Revision 1.16  2003/03/09 23:56:21  jalet
125# Option noquota added to do accounting only.
126#
127# Revision 1.15  2003/03/09 23:39:14  jalet
128# Simplified translations.
129#
130# Revision 1.14  2003/02/27 09:04:02  jalet
131# Missing translation
132#
133# Revision 1.13  2003/02/27 08:44:01  jalet
134# Check to see if the printer was ever used at all, and displays "unknown"
135# as the pagecounter value in this casCheck to see if the printer was ever used at all, and displays "unknown"
136# as the pagecounter value in this case.
137#
138# Revision 1.12  2003/02/17 23:02:23  jalet
139# getGraceDelay for printer
140#
141# Revision 1.11  2003/02/10 12:12:34  jalet
142# Translations.
143#
144# Revision 1.10  2003/02/10 12:07:30  jalet
145# Now repykota should output the recorded total page number for each printer too.
146#
147# Revision 1.9  2003/02/09 13:40:29  jalet
148# typo
149#
150# Revision 1.8  2003/02/09 12:56:53  jalet
151# Internationalization begins...
152#
153# Revision 1.7  2003/02/08 23:17:20  jalet
154# repykota now outputs life time page counters and the total pages printed by
155# all users/groups on each printer.
156#
157# Revision 1.6  2003/02/07 23:39:16  jalet
158# Typos
159#
160# Revision 1.5  2003/02/07 08:38:36  jalet
161# Missing conversion.
162# empty line between two printers
163#
164# Revision 1.4  2003/02/07 08:34:15  jalet
165# Test wrt date limit was wrong
166#
167# Revision 1.3  2003/02/07 00:08:52  jalet
168# Typos
169#
170# Revision 1.2  2003/02/06 23:58:05  jalet
171# repykota should be ok
172#
173#
174#
175
176import sys
177import os
178import pwd
179
180from mx import DateTime
181
182from pykota import version
183from pykota.tool import PyKotaTool, PyKotaToolError
184from pykota.config import PyKotaConfigError
185from pykota.storage import PyKotaStorageError
186from pykota.reporter import PyKotaReporterError
187from pykota import reporter
188
189__doc__ = """repykota v%s (c) 2003-2004 C@LL - Conseil Internet & Logiciels Libres
190
191Generates print quota reports.
192
193command line usage :
194
195  repykota [options]
196
197options :
198
199  -v | --version       Prints repykota's version number then exits.
200  -h | --help          Prints this message then exits.
201 
202  -u | --users         Generates a report on users quota, this is
203                       the default.
204 
205  -g | --groups        Generates a report on group quota instead of users.
206 
207  -P | --printer p     Report quotas on this printer only. Actually p can
208                       use wildcards characters to select only
209                       some printers. The default value is *, meaning
210                       all printers.
211                       You can specify several names or wildcards,
212                       by separating them with commas.
213 
214examples :                             
215
216  $ repykota --printer lp
217 
218  This will print the quota status for all users who use the lp printer.
219
220  $ repykota
221 
222  This will print the quota status for all users on all printers.
223 
224  $ repykota --printer "laser*,*pson" jerome "jo*"
225 
226  This will print the quota status for user jerome and all users
227  whose name begins with "jo" on all printers which name begins
228  with "laser" or ends with "pson".
229 
230  If launched by a non-root user, additionnal arguments representing
231  users or groups names are ignored, and only the current user/group
232  is reported.
233
234This program is free software; you can redistribute it and/or modify
235it under the terms of the GNU General Public License as published by
236the Free Software Foundation; either version 2 of the License, or
237(at your option) any later version.
238
239This program is distributed in the hope that it will be useful,
240but WITHOUT ANY WARRANTY; without even the implied warranty of
241MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
242GNU General Public License for more details.
243
244You should have received a copy of the GNU General Public License
245along with this program; if not, write to the Free Software
246Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
247
248Please e-mail bugs to: %s""" % (version.__version__, version.__author__)
249       
250class RePyKota(PyKotaTool) :       
251    """A class for repykota."""
252    def main(self, ugnames, options) :
253        """Print Quota reports generator."""
254        uid = os.geteuid()
255        if not uid :
256            # root user
257            if not ugnames :
258                # no username, means all usernames
259                ugnames = [ "*" ]
260        else :       
261            # not the root user
262            # reports only the current user
263            username = pwd.getpwuid(uid)[0]
264            if options["groups"] :
265                user = self.storage.getUser(username)
266                if user.Exists :
267                    ugnames = [ g.Name for g in self.storage.getUserGroups(user) ]
268                else :   
269                    ugnames = [ ]
270            else :
271                ugnames = [ username ]
272       
273        printers = self.storage.getMatchingPrinters(options["printer"])
274        if not printers :
275            raise PyKotaToolError, _("There's no printer matching %s") % options["printer"]
276           
277        self.reportingtool = reporter.openReporter(self, "text", printers, ugnames, (options["groups"] and 1) or 0)   
278        print self.reportingtool.generateReport()
279                   
280if __name__ == "__main__" : 
281    try :
282        defaults = { \
283                     "printer" : "*", \
284                   }
285        short_options = "vhugP:"
286        long_options = ["help", "version", "users", "groups", "printer="]
287       
288        # Initializes the command line tool
289        reportTool = RePyKota(doc=__doc__)
290       
291        # parse and checks the command line
292        (options, args) = reportTool.parseCommandline(sys.argv[1:], short_options, long_options, allownothing=1)
293       
294        # sets long options
295        options["help"] = options["h"] or options["help"]
296        options["version"] = options["v"] or options["version"]
297        options["users"] = options["u"] or options["users"]
298        options["groups"] = options["g"] or options["groups"]
299        options["printer"] = options["P"] or options["printer"] or defaults["printer"]
300       
301        if options["help"] :
302            reportTool.display_usage_and_quit()
303        elif options["version"] :
304            reportTool.display_version_and_quit()
305        elif options["users"] and options["groups"] :   
306            raise PyKotaToolError, _("incompatible options, see help.")
307        else :
308            retcode = reportTool.main(args, options)
309    except (PyKotaToolError, PyKotaConfigError, PyKotaStorageError, PyKotaReporterError), msg :           
310        sys.stderr.write("%s\n" % msg)
311        sys.stderr.flush()
312        retcode = -1 
313
314    try :
315        reportTool.storage.close()
316    except (TypeError, NameError, AttributeError) :   
317        pass
318       
319    sys.exit(retcode)   
Note: See TracBrowser for help on using the browser.