root / pykota / trunk / bin / edpykota @ 820

Revision 820, 13.8 kB (checked in by jalet, 21 years ago)

Wildcards seem to work now

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