root / pykota / trunk / bin / repykota @ 2228

Revision 2216, 6.2 kB (checked in by jerome, 20 years ago)

Now exits with no traceback in case of Ctrl+C

  • 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, 2005 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#
26
27import sys
28import os
29import pwd
30
31from mx import DateTime
32
33from pykota.tool import PyKotaTool, PyKotaToolError, crashed, N_
34from pykota.config import PyKotaConfigError
35from pykota.storage import PyKotaStorageError
36from pykota.reporter import PyKotaReporterError
37from pykota import reporter
38
39__doc__ = N_("""repykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres
40
41Generates print quota reports.
42
43command line usage :
44
45  repykota [options]
46
47options :
48
49  -v | --version       Prints repykota's version number then exits.
50  -h | --help          Prints this message then exits.
51 
52  -u | --users         Generates a report on users quota, this is
53                       the default.
54 
55  -g | --groups        Generates a report on group quota instead of users.
56 
57  -P | --printer p     Report quotas on this printer only. Actually p can
58                       use wildcards characters to select only
59                       some printers. The default value is *, meaning
60                       all printers.
61                       You can specify several names or wildcards,
62                       by separating them with commas.
63 
64examples :                             
65
66  $ repykota --printer lp
67 
68  This will print the quota status for all users who use the lp printer.
69
70  $ repykota
71 
72  This will print the quota status for all users on all printers.
73 
74  $ repykota --printer "laser*,*pson" jerome "jo*"
75 
76  This will print the quota status for user jerome and all users
77  whose name begins with "jo" on all printers which name begins
78  with "laser" or ends with "pson".
79 
80  If launched by an user who is not a PyKota administrator, additionnal
81  arguments representing users or groups names are ignored, and only the
82  current user/group is reported.
83
84This program is free software; you can redistribute it and/or modify
85it under the terms of the GNU General Public License as published by
86the Free Software Foundation; either version 2 of the License, or
87(at your option) any later version.
88
89This program is distributed in the hope that it will be useful,
90but WITHOUT ANY WARRANTY; without even the implied warranty of
91MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
92GNU General Public License for more details.
93
94You should have received a copy of the GNU General Public License
95along with this program; if not, write to the Free Software
96Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
97
98Please e-mail bugs to: %s""")
99       
100class RePyKota(PyKotaTool) :       
101    """A class for repykota."""
102    def main(self, ugnames, options) :
103        """Print Quota reports generator."""
104        if self.config.isAdmin :
105            # PyKota administrator
106            if not ugnames :
107                # no username, means all usernames
108                ugnames = [ "*" ]
109        else :       
110            # not the root user
111            # reports only the current user
112            username = pwd.getpwuid(os.geteuid())[0]
113            if options["groups"] :
114                user = self.storage.getUser(username)
115                if user.Exists :
116                    ugnames = [ g.Name for g in self.storage.getUserGroups(user) ]
117                else :   
118                    ugnames = [ ]
119            else :
120                ugnames = [ username ]
121       
122        printers = self.storage.getMatchingPrinters(options["printer"])
123        if not printers :
124            raise PyKotaToolError, _("There's no printer matching %s") % options["printer"]
125           
126        self.reportingtool = reporter.openReporter(self, "text", printers, ugnames, (options["groups"] and 1) or 0)   
127        print self.reportingtool.generateReport()
128                   
129if __name__ == "__main__" : 
130    retcode = 0
131    try :
132        defaults = { \
133                     "printer" : "*", \
134                   }
135        short_options = "vhugP:"
136        long_options = ["help", "version", "users", "groups", "printer="]
137       
138        # Initializes the command line tool
139        reportTool = RePyKota(doc=__doc__)
140        reportTool.deferredInit()
141       
142        # parse and checks the command line
143        (options, args) = reportTool.parseCommandline(sys.argv[1:], short_options, long_options, allownothing=1)
144       
145        # sets long options
146        options["help"] = options["h"] or options["help"]
147        options["version"] = options["v"] or options["version"]
148        options["users"] = options["u"] or options["users"]
149        options["groups"] = options["g"] or options["groups"]
150        options["printer"] = options["P"] or options["printer"] or defaults["printer"]
151       
152        if options["help"] :
153            reportTool.display_usage_and_quit()
154        elif options["version"] :
155            reportTool.display_version_and_quit()
156        elif options["users"] and options["groups"] :   
157            raise PyKotaToolError, _("incompatible options, see help.")
158        else :
159            retcode = reportTool.main(args, options)
160    except KeyboardInterrupt :       
161        sys.stderr.write("\nInterrupted with Ctrl+C !\n")
162    except SystemExit :       
163        pass
164    except :
165        try :
166            reportTool.crashed("repykota failed")
167        except :   
168            crashed("repykota failed")
169        retcode = -1
170
171    try :
172        reportTool.storage.close()
173    except (TypeError, NameError, AttributeError) :   
174        pass
175       
176    sys.exit(retcode)   
Note: See TracBrowser for help on using the browser.