root / pykota / trunk / bin / repykota @ 2609

Revision 2609, 6.5 kB (checked in by jerome, 19 years ago)

Insufficient permission to run a command now exits with status -2.
Error in command line options now exits with status -2.
Processing interrupted with Ctrl+C (or SIGTERM) now exits with status -3.

  • 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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, PyKotaCommandLineError, crashed, N_
34from pykota import reporter
35
36__doc__ = N_("""repykota v%(__version__)s (c) %(__years__)s %(__author__)s
37
38Generates print quota reports.
39
40command line usage :
41
42  repykota [options]
43
44options :
45
46  -v | --version       Prints repykota's version number then exits.
47  -h | --help          Prints this message then exits.
48 
49  -u | --users         Generates a report on users quota, this is
50                       the default.
51 
52  -g | --groups        Generates a report on group quota instead of users.
53 
54  -i | --ingroups g1[,g2...]  Only lists users who are members of these
55                              groups. Reserved to PyKota Administrators.
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""")
84       
85class RePyKota(PyKotaTool) :       
86    """A class for repykota."""
87    def main(self, ugnames, options) :
88        """Print Quota reports generator."""
89        if self.config.isAdmin :
90            # PyKota administrator
91            if not ugnames :
92                # no username, means all usernames
93                ugnames = [ "*" ]
94               
95            if options["ingroups"] :
96                groupsnames = options["ingroups"].split(",")
97                groups = [self.storage.getGroup(gname) for gname in groupsnames]
98                members = {}
99                for group in groups :
100                    if not group.Exists :
101                        self.printInfo("Group %s doesn't exist." % group.Name, "warn")
102                    else :   
103                        for user in self.storage.getGroupMembers(group) :
104                            members[user.Name] = user
105                ugnames = [ m for m in members.keys() if self.matchString(m, ugnames) ]
106        else :       
107            # reports only the current user
108            if options["ingroups"] :
109                raise PyKotaCommandLineError, _("Option --ingroups is reserved to PyKota Administrators.")
110               
111            username = pwd.getpwuid(os.geteuid())[0]
112            if options["groups"] :
113                user = self.storage.getUser(username)
114                if user.Exists :
115                    ugnames = [ g.Name for g in self.storage.getUserGroups(user) ]
116                else :   
117                    ugnames = [ ]
118            else :
119                ugnames = [ username ]
120       
121        printers = self.storage.getMatchingPrinters(options["printer"])
122        if not printers :
123            raise PyKotaCommandLineError, _("There's no printer matching %s") % options["printer"]
124           
125        self.reportingtool = reporter.openReporter(self, "text", printers, ugnames, (options["groups"] and 1) or 0)   
126        print self.reportingtool.generateReport()
127                   
128if __name__ == "__main__" : 
129    retcode = 0
130    try :
131        defaults = { \
132                     "printer" : "*", \
133                   }
134        short_options = "vhugi:P:"
135        long_options = ["help", "version", "users", "groups", "ingroups=", "printer="]
136       
137        # Initializes the command line tool
138        reportTool = RePyKota(doc=__doc__)
139        reportTool.deferredInit()
140       
141        # parse and checks the command line
142        (options, args) = reportTool.parseCommandline(sys.argv[1:], short_options, long_options, allownothing=1)
143       
144        # sets long options
145        options["help"] = options["h"] or options["help"]
146        options["version"] = options["v"] or options["version"]
147        options["users"] = options["u"] or options["users"]
148        options["groups"] = options["g"] or options["groups"]
149        options["printer"] = options["P"] or options["printer"] or defaults["printer"]
150        options["ingroups"] = options["i"] or options["ingroups"]
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"] or options["ingroups"]) and options["groups"] :
157            raise PyKotaCommandLineError, _("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        retcode = -3
163    except PyKotaCommandLineError, msg :   
164        sys.stderr.write("%s : %s\n" % (sys.argv[0], msg))
165        retcode = -2
166    except SystemExit :       
167        pass
168    except :
169        try :
170            reportTool.crashed("repykota failed")
171        except :   
172            crashed("repykota failed")
173        retcode = -1
174
175    try :
176        reportTool.storage.close()
177    except (TypeError, NameError, AttributeError) :   
178        pass
179       
180    sys.exit(retcode)   
Note: See TracBrowser for help on using the browser.