root / pykota / trunk / bin / edpykota @ 886

Revision 886, 15.5 kB (checked in by jalet, 21 years ago)

Unnecessary message was logged

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