root / pykota / trunk / bin / edpykota @ 766

Revision 766, 11.0 kB (checked in by jalet, 21 years ago)

Now checks user and group names for validity before adding them

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