root / pykota / trunk / bin / edpykota @ 815

Revision 815, 13.6 kB (checked in by jalet, 21 years ago)

user and group names can be passed as wildcards if the --add option
is not set. The default is to act on all users or groups.

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