root / pykota / trunk / bin / edpykota @ 719

Revision 719, 9.4 kB (checked in by jalet, 21 years ago)

edpykota should be ok, minus some typos

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