root / pykota / trunk / bin / edpykota @ 825

Revision 825, 13.9 kB (checked in by jalet, 21 years ago)

Correctly maps PyKota's log levels to syslog log levels

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