root / pykota / trunk / bin / edpykota @ 772

Revision 772, 12.6 kB (checked in by jalet, 21 years ago)

Internationalization begins...

  • 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
3# PyKota Print Quota Editor
4#
5# PyKota - Print Quotas for CUPS
6#
7# (c) 2003 Jerome Alet <alet@librelogiciel.com>
8# You're welcome to redistribute this software under the
9# terms of the GNU General Public Licence version 2.0
10# or, at your option, any higher version.
11#
12# You can read the complete GNU GPL in the file COPYING
13# which should come along with this software, or visit
14# the Free Software Foundation's WEB site http://www.fsf.org
15#
16# $Id$
17#
18# $Log$
19# Revision 1.18  2003/02/09 12:56:53  jalet
20# Internationalization begins...
21#
22# Revision 1.17  2003/02/08 22:47:23  jalet
23# Option --reset can now be used without having to use soft and hard limits
24# on the command line.
25#
26# Revision 1.16  2003/02/08 22:39:46  jalet
27# --reset command line option added
28#
29# Revision 1.15  2003/02/08 22:20:01  jalet
30# Clarification on why we don't check with /etc/passwd to see if the user
31# name is valid or not.
32#
33# Revision 1.14  2003/02/08 22:18:15  jalet
34# Now checks user and group names for validity before adding them
35#
36# Revision 1.13  2003/02/08 22:09:02  jalet
37# Only printer was added the first time.
38#
39# Revision 1.12  2003/02/08 21:44:49  jalet
40# Python 2.1 string module doesn't define ascii_letters
41#
42# Revision 1.11  2003/02/08 09:42:44  jalet
43# Better handle wrong or bad command line arguments
44#
45# Revision 1.10  2003/02/08 09:39:20  jalet
46# typos
47#
48# Revision 1.9  2003/02/08 09:38:06  jalet
49# Badly placed test
50#
51# Revision 1.8  2003/02/07 22:53:57  jalet
52# Checks if printer name is valid before adding it
53#
54# Revision 1.7  2003/02/07 22:17:58  jalet
55# Incomplete test
56#
57# Revision 1.6  2003/02/07 22:13:13  jalet
58# Perhaps edpykota is now able to add printers !!! Oh, stupid me !
59#
60# Revision 1.5  2003/02/06 14:49:04  jalet
61# edpykota should be ok now
62#
63# Revision 1.4  2003/02/06 14:28:59  jalet
64# edpykota should be ok, minus some typos
65#
66# Revision 1.3  2003/02/06 10:47:21  jalet
67# Documentation string and command line options didn't match.
68#
69# Revision 1.2  2003/02/06 10:39:23  jalet
70# Preliminary edpykota work.
71#
72# Revision 1.1  2003/02/05 21:41:09  jalet
73# Skeletons added for all command line tools
74#
75#
76#
77
78import sys
79
80from pykota import version
81from pykota.tool import PyKotaTool, PyKotaToolError
82
83__doc__ = """edpykota v%s (C) 2003 C@LL - Conseil Internet & Logiciels Libres
84A Print Quota editor for PyKota.
85
86command line usage :
87
88  edpykota [options] user1 user2 ... userN
89  edpykota [options] group1 group2 ... groupN
90
91options :
92
93  -v | --version       Prints edpykota's version number then exits.
94  -h | --help          Prints this message then exits.
95 
96  -a | --add           Adds users and/or printers if they don't
97                       exist on the Quota Storage Server.
98                       
99  -u | --users         Edit users print quotas, this is the default.
100 
101  -P | --printer p     Edit quotas on printer p only. Actually p can
102                       use wildcards characters to select only
103                       some printers. The default value is *, meaning
104                       all printers.
105 
106  -g | --groups        Edit groups print quotas instead of users.
107                         
108  -p | --prototype u|g Uses user u or group g as a prototype to set
109                       print quotas
110                       
111  -r | --reset         Resets the printed page counter for the user
112                       or group to zero. The life time page counter
113                       is kept unchanged.
114                       
115  -S | --softlimit sl  Sets the quota soft limit to sl pages.                       
116 
117  -H | --hardlimit hl  Sets the quota hard limit to hl pages.
118 
119examples :                             
120
121  $ edpykota -p jerome john paul george ringo
122 
123  This will set print quotas for the users john, paul, george and ringo
124  to the same values than user jerome. User jerome must exist.
125 
126  $ edpykota --printer lp -S 50 -H 60 jerome
127 
128  This will set jerome's print quota on the lp printer to a soft limit
129  of 50 pages, and a hard limit of 60 pages. If either user jerome or
130  printer lp doesn't exist on the Quota Storage Server then nothing is done.
131
132  $ edpykota --add --printer lp -S 50 -H 60 jerome
133 
134  Same as above, but if either user jerome or printer lp doesn't exist
135  on the Quota Storage Server they are automatically added.
136  WARNING : the CUPS PPD file for this printer must still be modified
137            manually, as well as pykota's configuration file for a
138            new printer to be managed successfully.
139           
140  $ edpykota -g -S 500 -H 550 financial support           
141 
142  This will set print quota soft limit to 500 pages and hard limit
143  to 550 pages for groups financial and support on all printers.
144 
145  $ edpykota --reset jerome
146 
147  This will reset jerome's page counter to zero on all printers.
148  His life time page counter on each printer will be kept unchanged.
149
150This program is free software; you can redistribute it and/or modify
151it under the terms of the GNU General Public License as published by
152the Free Software Foundation; either version 2 of the License, or
153(at your option) any later version.
154
155This program is distributed in the hope that it will be useful,
156but WITHOUT ANY WARRANTY; without even the implied warranty of
157MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
158GNU General Public License for more details.
159
160You should have received a copy of the GNU General Public License
161along with this program; if not, write to the Free Software
162Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
163
164Please e-mail bugs to: %s""" % (version.__version__, version.__author__)
165       
166class EdPyKota(PyKotaTool) :       
167    """A class for edpykota."""
168    def main(self, names, options) :
169        """Edit user or group quotas."""
170        printernames = self.storage.getMatchingPrinters(options["printer"])
171        if not printernames :
172            pname = options["printer"]
173            if options["add"] and pname :
174                if self.isValidName(pname) :
175                    self.storage.addPrinter(pname)
176                    printernames = [ pname ]
177                else :   
178                    raise PyKotaToolError, _("Invalid printer name %s") % pname
179            else :
180                raise PyKotaToolError, _("There's no printer matching %s") % pname
181        softlimit = hardlimit = None   
182        if options["softlimit"] :
183            try :
184                softlimit = int(options["softlimit"].strip())
185            except ValueError :   
186                raise PyKotaToolError, _("Invalid softlimit value %s.") % options["softlimit"]
187        if options["hardlimit"] :
188            try :
189                hardlimit = int(options["hardlimit"].strip())
190            except ValueError :   
191                raise PyKotaToolError, _("Invalid hardlimit value %s.") % options["hardlimit"]
192        if (softlimit is not None) and (hardlimit is not None) and (hardlimit < softlimit) :       
193            # error, exchange them
194            self.logger.log_message(_("Hard limit %i is less than soft limit %i, values will be exchanged.") % (hardlimit, softlimit), "warn")
195            (softlimit, hardlimit) = (hardlimit, softlimit)
196        for printer in printernames :
197            if options["prototype"] :
198                if options["users"] :
199                    prototype = self.storage.getUserPQuota(options["prototype"], printer)
200                else :     
201                    prototype = self.storage.getGroupPQuota(options["prototype"], printer)
202                if prototype is None :
203                    self.logger.log_message(_("Prototype %s not found in Quota Storage for printer %s.") % (options["prototype"], printer))
204                    continue    # skip this printer
205                else :   
206                    (softlimit, hardlimit) = (prototype["softlimit"], prototype["hardlimit"])
207            if hardlimit is None :   
208                hardlimit = softlimit
209                self.logger.log_message(_("Undefined hard limit set to soft limit (%s) on printer %s.") % (str(hardlimit), printer))
210            if softlimit is None :   
211                softlimit = hardlimit
212                self.logger.log_message(_("Undefined soft limit set to hard limit (%s) on printer %s.") % (str(softlimit), printer))
213            if (not options["reset"]) and ((hardlimit is None) or (softlimit is None)) :       
214                raise PyKotaToolError, _("Both hard and soft limits must be set ! Aborting.")
215            for name in names :
216                if options["users"] :
217                    quota = self.storage.getUserPQuota(name, printer)
218                else :
219                    quota = self.storage.getGroupPQuota(name, printer)
220                if quota is None :
221                    # not found
222                    if options["add"] :
223                        # In case we want to add something, it is crucial
224                        # that we DON'T check with the system accounts files
225                        # like /etc/passwd because users may be defined
226                        # only remotely
227                        if options["users"] :
228                            if self.isValidName(name) :
229                                self.storage.addUserPQuota(name, printer)
230                                quota = self.storage.getUserPQuota(name, printer)
231                            else :   
232                                self.logger.log_message(_("Invalid user name %s") % name)
233                        else :
234                            if self.isValidName(name) :
235                                self.storage.addGroupPQuota(name, printer)
236                                quota = self.storage.getGroupPQuota(name, printer)
237                            else :   
238                                self.logger.log_message(_("Invalid group name %s") % name)
239                if quota is None :     
240                    self.logger.log_message(_("Quota not found for object %s on printer %s.") % (name, printer))
241                else :   
242                    if options["users"] :
243                        if (softlimit is not None) and (hardlimit is not None) :
244                            self.storage.setUserPQuota(name, printer, softlimit, hardlimit)
245                        if options["reset"] :
246                            self.storage.resetUserPQuota(name, printer)
247                    else :
248                        if (softlimit is not None) and (hardlimit is not None) :
249                            self.storage.setGroupPQuota(name, printer, softlimit, hardlimit)
250                        if options["reset"] :
251                            self.storage.resetGroupPQuota(name, printer)
252                     
253if __name__ == "__main__" : 
254    try :
255        defaults = { \
256                     "users"  : 1, \
257                     "groups" : 0, \
258                     "printer" : "*", \
259                   }
260        short_options = "vhaugrp:P:S:H:"
261        long_options = ["help", "version", "add", "users", "groups", "reset", "prototype=", "printer=", "softlimit=", "hardlimit="]
262       
263        # Initializes the command line tool
264        editor = EdPyKota(doc=__doc__)
265       
266        # parse and checks the command line
267        (options, args) = editor.parseCommandline(sys.argv[1:], short_options, long_options)
268       
269        # sets long options
270        options["help"] = options["h"] or options["help"]
271        options["version"] = options["v"] or options["version"]
272        options["add"] = options["a"] or options["add"]
273        options["users"] = options["u"] or options["users"] or defaults["users"]
274        options["groups"] = options["g"] or options["groups"] or defaults["groups"]
275        options["prototype"] = options["p"] or options["prototype"]
276        options["printer"] = options["P"] or options["printer"] or defaults["printer"]
277        options["softlimit"] = options["S"] or options["softlimit"]
278        options["hardlimit"] = options["H"] or options["hardlimit"] 
279        options["reset"] = options["r"] or options["reset"] 
280       
281        if options["help"] :
282            editor.display_usage_and_quit()
283        elif options["version"] :
284            editor.display_version_and_quit()
285        elif options["users"] and options["groups"] :   
286            raise PyKotaToolError, _("edpykota: options --users and --groups are incompatible.")
287        elif (options["softlimit"] or options["hardlimit"]) and options["prototype"] :   
288            raise PyKotaToolError, _("edpykota: options --softlimit or --hardlimit and --prototype are incompatible.")
289        elif options["groups"] :   
290            raise PyKotaToolError, _("edpykota: options --groups is currently not implemented.")
291        else :
292            sys.exit(editor.main(args, options))
293    except PyKotaToolError, msg :           
294        sys.stderr.write("%s\n" % msg)
295        sys.stderr.flush()
296        sys.exit(-1)
Note: See TracBrowser for help on using the browser.