root / pykota / trunk / bin / edpykota @ 895

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

(anything or 0) = anything !!! Go back to school Jerome !

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