root / pykota / trunk / bin / edpykota @ 891

Revision 891, 15.8 kB (checked in by jalet, 21 years ago)

Prepare --groups option to work.

  • 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# This program is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation; either version 2 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program; if not, write to the Free Software
20# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
21#
22# $Id$
23#
24# $Log$
25# Revision 1.31  2003/04/08 21:13:44  jalet
26# Prepare --groups option to work.
27#
28# Revision 1.30  2003/04/08 21:10:18  jalet
29# Checks --groups option presence instead of --users because --users is the default.
30#
31# Revision 1.29  2003/04/05 09:28:56  jalet
32# Unnecessary message was logged
33#
34# Revision 1.28  2003/03/29 13:45:26  jalet
35# GPL paragraphs were incorrectly (from memory) copied into the sources.
36# Two README files were added.
37# Upgrade script for PostgreSQL pre 1.01 schema was added.
38#
39# Revision 1.27  2003/03/10 00:23:04  jalet
40# Bad english
41#
42# Revision 1.26  2003/03/10 00:11:27  jalet
43# Cleaner example.
44#
45# Revision 1.25  2003/03/09 23:56:21  jalet
46# Option noquota added to do accounting only.
47#
48# Revision 1.24  2003/02/27 23:48:41  jalet
49# Correctly maps PyKota's log levels to syslog log levels
50#
51# Revision 1.23  2003/02/27 22:55:20  jalet
52# WARN log priority doesn't exist.
53#
54# Revision 1.22  2003/02/27 09:37:02  jalet
55# Wildcards seem to work now
56#
57# Revision 1.21  2003/02/27 09:04:46  jalet
58# user and group names can be passed as wildcards if the --add option
59# is not set. The default is to act on all users or groups.
60#
61# Revision 1.20  2003/02/10 12:07:30  jalet
62# Now repykota should output the recorded total page number for each printer too.
63#
64# Revision 1.19  2003/02/09 13:40:29  jalet
65# typo
66#
67# Revision 1.18  2003/02/09 12:56:53  jalet
68# Internationalization begins...
69#
70# Revision 1.17  2003/02/08 22:47:23  jalet
71# Option --reset can now be used without having to use soft and hard limits
72# on the command line.
73#
74# Revision 1.16  2003/02/08 22:39:46  jalet
75# --reset command line option added
76#
77# Revision 1.15  2003/02/08 22:20:01  jalet
78# Clarification on why we don't check with /etc/passwd to see if the user
79# name is valid or not.
80#
81# Revision 1.14  2003/02/08 22:18:15  jalet
82# Now checks user and group names for validity before adding them
83#
84# Revision 1.13  2003/02/08 22:09:02  jalet
85# Only printer was added the first time.
86#
87# Revision 1.12  2003/02/08 21:44:49  jalet
88# Python 2.1 string module doesn't define ascii_letters
89#
90# Revision 1.11  2003/02/08 09:42:44  jalet
91# Better handle wrong or bad command line arguments
92#
93# Revision 1.10  2003/02/08 09:39:20  jalet
94# typos
95#
96# Revision 1.9  2003/02/08 09:38:06  jalet
97# Badly placed test
98#
99# Revision 1.8  2003/02/07 22:53:57  jalet
100# Checks if printer name is valid before adding it
101#
102# Revision 1.7  2003/02/07 22:17:58  jalet
103# Incomplete test
104#
105# Revision 1.6  2003/02/07 22:13:13  jalet
106# Perhaps edpykota is now able to add printers !!! Oh, stupid me !
107#
108# Revision 1.5  2003/02/06 14:49:04  jalet
109# edpykota should be ok now
110#
111# Revision 1.4  2003/02/06 14:28:59  jalet
112# edpykota should be ok, minus some typos
113#
114# Revision 1.3  2003/02/06 10:47:21  jalet
115# Documentation string and command line options didn't match.
116#
117# Revision 1.2  2003/02/06 10:39:23  jalet
118# Preliminary edpykota work.
119#
120# Revision 1.1  2003/02/05 21:41:09  jalet
121# Skeletons added for all command line tools
122#
123#
124#
125
126import sys
127
128from pykota import version
129from pykota.tool import PyKotaTool, PyKotaToolError
130
131__doc__ = """edpykota v%s (C) 2003 C@LL - Conseil Internet & Logiciels Libres
132A Print Quota editor for PyKota.
133
134command line usage :
135
136  edpykota [options] user1 user2 ... userN
137  edpykota [options] group1 group2 ... groupN
138
139options :
140
141  -v | --version       Prints edpykota's version number then exits.
142  -h | --help          Prints this message then exits.
143 
144  -a | --add           Adds users and/or printers if they don't
145                       exist on the Quota Storage Server.
146                       
147  -u | --users         Edit users print quotas, this is the default.
148 
149  -P | --printer p     Edit quotas on printer p only. Actually p can
150                       use wildcards characters to select only
151                       some printers. The default value is *, meaning
152                       all printers.
153 
154  -g | --groups        Edit groups print quotas instead of users.
155                         
156  -p | --prototype u|g Uses user u or group g as a prototype to set
157                       print quotas
158                       
159  -n | --noquota       Doesn't set a quota but only does accounting.
160 
161  -r | --reset         Resets the printed page counter for the user
162                       or group to zero. The life time page counter
163                       is kept unchanged.
164                       
165  -S | --softlimit sl  Sets the quota soft limit to sl pages.                       
166 
167  -H | --hardlimit hl  Sets the quota hard limit to hl pages.
168 
169  user1 through userN and group1 through groupN can use wildcards
170  if the --add option is not set.
171 
172examples :                             
173
174  $ edpykota -p jerome john paul george ringo
175 
176  This will set print quotas for the users john, paul, george and ringo
177  to the same values than user jerome. User jerome must exist.
178 
179  $ edpykota --printer lp -S 50 -H 60 jerome
180 
181  This will set jerome's print quota on the lp printer to a soft limit
182  of 50 pages, and a hard limit of 60 pages. If either user jerome or
183  printer lp doesn't exist on the Quota Storage Server then nothing is done.
184
185  $ edpykota --add --printer lp -S 50 -H 60 jerome
186 
187  Same as above, but if either user jerome or printer lp doesn't exist
188  on the Quota Storage Server they are automatically added.
189  WARNING : the CUPS PPD file for this printer must still be modified
190            manually, as well as pykota's configuration file for a
191            new printer to be managed successfully.
192           
193  $ edpykota -g -S 500 -H 550 financial support           
194 
195  This will set print quota soft limit to 500 pages and hard limit
196  to 550 pages for groups financial and support on all printers.
197 
198  $ edpykota --reset jerome "jo*"
199 
200  This will reset jerome's page counter to zero on all printers, as
201  well as every user whose name begins with 'jo'.
202  Their life time page counter on each printer will be kept unchanged.
203 
204  $ edpykota --printer hpcolor --noquota jerome
205 
206  This will tell PyKota to not limit jerome when printing on the
207  hpcolor printer. All his jobs will be allowed on this printer, but
208  accounting of the pages he prints will still be kept.
209  Print Quotas for jerome on other printers are unchanged.
210
211This program is free software; you can redistribute it and/or modify
212it under the terms of the GNU General Public License as published by
213the Free Software Foundation; either version 2 of the License, or
214(at your option) any later version.
215
216This program is distributed in the hope that it will be useful,
217but WITHOUT ANY WARRANTY; without even the implied warranty of
218MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
219GNU General Public License for more details.
220
221You should have received a copy of the GNU General Public License
222along with this program; if not, write to the Free Software
223Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
224
225Please e-mail bugs to: %s""" % (version.__version__, version.__author__)
226       
227class EdPyKota(PyKotaTool) :       
228    """A class for edpykota."""
229    def main(self, names, options) :
230        """Edit user or group quotas."""
231        printernames = self.storage.getMatchingPrinters(options["printer"])
232        if not printernames :
233            pname = options["printer"]
234            if options["add"] and pname :
235                if self.isValidName(pname) :
236                    self.storage.addPrinter(pname)
237                    printernames = [ (pname, 0) ]
238                else :   
239                    raise PyKotaToolError, _("Invalid printer name %s") % pname
240            else :
241                raise PyKotaToolError, _("There's no printer matching %s") % pname
242        softlimit = hardlimit = None   
243        if options["softlimit"] :
244            try :
245                softlimit = int(options["softlimit"].strip())
246            except ValueError :   
247                raise PyKotaToolError, _("Invalid softlimit value %s.") % options["softlimit"]
248        if options["hardlimit"] :
249            try :
250                hardlimit = int(options["hardlimit"].strip())
251            except ValueError :   
252                raise PyKotaToolError, _("Invalid hardlimit value %s.") % options["hardlimit"]
253        if (softlimit is not None) and (hardlimit is not None) and (hardlimit < softlimit) :       
254            # error, exchange them
255            self.logger.log_message(_("Hard limit %i is less than soft limit %i, values will be exchanged.") % (hardlimit, softlimit))
256            (softlimit, hardlimit) = (hardlimit, softlimit)
257        if not names :   
258            if options["add"] :
259                raise PyKotaToolError, _("You have to pass user names on the command line")
260            else :   
261                names = [ "*" ] # all users
262        for (printer, printerpagecounter) in printernames :
263            if options["prototype"] :
264                if options["groups"] :
265                    prototype = self.storage.getGroupPQuota(options["prototype"], printer)
266                else :     
267                    # default is user quota edition
268                    prototype = self.storage.getUserPQuota(options["prototype"], printer)
269                if prototype is None :
270                    self.logger.log_message(_("Prototype %s not found in Quota Storage for printer %s.") % (options["prototype"], printer))
271                    continue    # skip this printer
272                else :   
273                    (softlimit, hardlimit) = (prototype["softlimit"], prototype["hardlimit"])
274            if hardlimit is None :   
275                hardlimit = softlimit
276                if hardlimit is not None :
277                    self.logger.log_message(_("Undefined hard limit set to soft limit (%s) on printer %s.") % (str(hardlimit), printer))
278            if softlimit is None :   
279                softlimit = hardlimit
280                if softlimit is not None :
281                    self.logger.log_message(_("Undefined soft limit set to hard limit (%s) on printer %s.") % (str(softlimit), printer))
282            if (not options["reset"] and not options["noquota"]) and ((hardlimit is None) or (softlimit is None)) :
283                raise PyKotaToolError, _("Both hard and soft limits must be set ! Aborting.")
284            if options["add"] :   
285                allnames = names
286            else :   
287                if options["groups"] :   
288                    allnames = self.storage.getPrinterGroups(printer)
289                else :   
290                    allnames = self.storage.getPrinterUsers(printer)
291            for name in [n for n in allnames if self.matchString(n, names)]:
292                if options["groups"] :
293                    quota = self.storage.getGroupPQuota(name, printer)
294                else :
295                    quota = self.storage.getUserPQuota(name, printer)
296                if quota is None :
297                    # not found
298                    if options["add"] :
299                        # In case we want to add something, it is crucial
300                        # that we DON'T check with the system accounts files
301                        # like /etc/passwd because users may be defined
302                        # only remotely
303                        if options["groups"] :
304                            if self.isValidName(name) :
305                                self.storage.addGroupPQuota(name, printer)
306                                quota = self.storage.getGroupPQuota(name, printer)
307                            else :   
308                                self.logger.log_message(_("Invalid group name %s") % name)
309                        else :
310                            if self.isValidName(name) :
311                                self.storage.addUserPQuota(name, printer)
312                                quota = self.storage.getUserPQuota(name, printer)
313                            else :   
314                                self.logger.log_message(_("Invalid user name %s") % name)
315                if quota is None :     
316                    self.logger.log_message(_("Quota not found for object %s on printer %s.") % (name, printer))
317                else :   
318                    if options["groups"] :
319                        if options["noquota"] or ((softlimit is not None) and (hardlimit is not None)) :
320                            self.storage.setGroupPQuota(name, printer, softlimit, hardlimit)
321                        if options["reset"] :
322                            self.storage.resetGroupPQuota(name, printer)
323                    else :
324                        if options["noquota"] or ((softlimit is not None) and (hardlimit is not None)) :
325                            self.storage.setUserPQuota(name, printer, softlimit, hardlimit)
326                        if options["reset"] :
327                            self.storage.resetUserPQuota(name, printer)
328                     
329if __name__ == "__main__" : 
330    try :
331        defaults = { \
332                     "users"  : 0, \
333                     "groups" : 0, \
334                     "printer" : "*", \
335                   }
336        short_options = "vhnaugrp:P:S:H:"
337        long_options = ["help", "version", "noquota", "add", "users", "groups", "reset", "prototype=", "printer=", "softlimit=", "hardlimit="]
338       
339        # Initializes the command line tool
340        editor = EdPyKota(doc=__doc__)
341       
342        # parse and checks the command line
343        (options, args) = editor.parseCommandline(sys.argv[1:], short_options, long_options)
344       
345        # sets long options
346        options["help"] = options["h"] or options["help"]
347        options["version"] = options["v"] or options["version"]
348        options["add"] = options["a"] or options["add"]
349        options["users"] = options["u"] or options["users"] or defaults["users"]
350        options["groups"] = options["g"] or options["groups"] or defaults["groups"]
351        options["prototype"] = options["p"] or options["prototype"]
352        options["printer"] = options["P"] or options["printer"] or defaults["printer"]
353        options["softlimit"] = options["S"] or options["softlimit"]
354        options["hardlimit"] = options["H"] or options["hardlimit"] 
355        options["reset"] = options["r"] or options["reset"] 
356        options["noquota"] = options["n"] or options["noquota"]
357       
358        if options["help"] :
359            editor.display_usage_and_quit()
360        elif options["version"] :
361            editor.display_version_and_quit()
362        elif options["users"] and options["groups"] :   
363            raise PyKotaToolError, _("incompatible options, see help.")
364        elif (options["softlimit"] or options["hardlimit"]) and options["prototype"] :   
365            raise PyKotaToolError, _("incompatible options, see help.")
366        elif options["noquota"] and (options["prototype"] or options["hardlimit"] or options["softlimit"]) :
367            raise PyKotaToolError, _("incompatible options, see help.")
368        elif options["groups"] :   
369            raise PyKotaToolError, _("option --groups is currently not implemented.")
370        else :
371            sys.exit(editor.main(args, options))
372    except PyKotaToolError, msg :           
373        sys.stderr.write("%s\n" % msg)
374        sys.stderr.flush()
375        sys.exit(-1)
Note: See TracBrowser for help on using the browser.