root / pykota / trunk / bin / edpykota @ 775

Revision 775, 12.7 kB (checked in by jalet, 22 years ago)

typo

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