root / pykota / trunk / bin / edpykota @ 1318

Revision 1318, 28.7 kB (checked in by jalet, 20 years ago)

New user/group deletion code

  • 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# -*- coding: ISO-8859-15 -*-
3
4# PyKota Print Quota Editor
5#
6# PyKota - Print Quotas for CUPS and LPRng
7#
8# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
9# This program is free software; you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation; either version 2 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program; if not, write to the Free Software
21# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
22#
23# $Id$
24#
25# $Log$
26# Revision 1.68  2004/01/28 10:05:22  jalet
27# New user/group deletion code
28#
29# Revision 1.67  2004/01/15 11:19:07  jalet
30# Typos in messages wrt gettext.
31#
32# Revision 1.66  2004/01/12 21:54:36  jalet
33# User's email address can now be set at user's creation time.
34#
35# Revision 1.65  2004/01/08 16:24:49  jalet
36# edpykota now supports adding printers to printer groups.
37#
38# Revision 1.64  2004/01/08 14:10:32  jalet
39# Copyright year changed.
40#
41# Revision 1.63  2003/11/24 16:50:58  jalet
42# Old help message deletedd
43#
44# Revision 1.62  2003/11/12 23:28:38  jalet
45# More work on new backend. This commit may be unstable.
46#
47# Revision 1.61  2003/11/12 13:06:35  jalet
48# Bug fix wrt no user/group name command line argument to edpykota
49#
50# Revision 1.60  2003/10/09 21:25:24  jalet
51# Multiple printer names or wildcards can be passed on the command line
52# separated with commas.
53# Beta phase.
54#
55# Revision 1.59  2003/10/07 09:07:27  jalet
56# Character encoding added to please latest version of Python
57#
58# Revision 1.58  2003/10/03 12:27:01  jalet
59# Several optimizations, especially with LDAP backend
60#
61# Revision 1.57  2003/08/20 16:01:19  jalet
62# Comment added.
63#
64# Revision 1.56  2003/07/29 20:55:17  jalet
65# 1.14 is out !
66#
67# Revision 1.55  2003/07/28 09:11:12  jalet
68# PyKota now tries to add its attributes intelligently in existing LDAP
69# directories.
70#
71# Revision 1.54  2003/07/21 06:32:42  jalet
72# Prevents email messages to be sent at modification/creation time for
73# a user/group quota
74#
75# Revision 1.53  2003/07/09 06:03:41  jalet
76# Fixed typo when using edpykota --prototype
77#
78# Revision 1.52  2003/07/07 12:11:13  jalet
79# Small fix
80#
81# Revision 1.51  2003/07/07 11:55:50  jalet
82# Small fix
83#
84# Revision 1.50  2003/07/05 12:33:53  jalet
85# More on previous fix.
86#
87# Revision 1.49  2003/07/05 12:32:07  jalet
88# Ensure that the user don't pass more than two prices for a printer.
89#
90# Revision 1.48  2003/06/25 19:52:30  jalet
91# Should be ready for testing :-)
92#
93# Revision 1.47  2003/06/25 14:10:01  jalet
94# Hey, it may work (edpykota --reset excepted) !
95#
96# Revision 1.46  2003/06/16 11:59:09  jalet
97# More work on LDAP
98#
99# Revision 1.45  2003/06/11 19:32:00  jalet
100# Severe bug wrt account balance setting should be corrected.
101#
102# Revision 1.44  2003/04/29 22:03:38  jalet
103# Better error handling.
104#
105# Revision 1.43  2003/04/23 22:13:56  jalet
106# Preliminary support for LPRng added BUT STILL UNTESTED.
107#
108# Revision 1.42  2003/04/17 13:38:47  jalet
109# Docstring corrected for better manual page
110#
111# Revision 1.41  2003/04/16 12:35:49  jalet
112# Groups quota work now !
113#
114# Revision 1.40  2003/04/16 08:22:09  jalet
115# More strict error detection.
116# Minor code rewrite to avoid some repetitive tests.
117#
118# Revision 1.39  2003/04/16 08:01:53  jalet
119# edpykota --charge command line option works now.
120#
121# Revision 1.38  2003/04/15 22:02:43  jalet
122# More complete docstring
123#
124# Revision 1.37  2003/04/15 21:58:33  jalet
125# edpykota now accepts a --delete option.
126# Preparation to allow edpykota to accept much more command line options
127# (WARNING : docstring is OK, but code isn't !)
128#
129# Revision 1.36  2003/04/15 13:55:28  jalet
130# Options --limitby and --balance added to edpykota
131#
132# Revision 1.35  2003/04/15 13:06:39  jalet
133# Allow to add a printer without any user
134#
135# Revision 1.34  2003/04/11 16:51:11  jalet
136# Bug fix for edpykota --add with users who already had a quota on the printer.
137#
138# Revision 1.33  2003/04/10 21:47:20  jalet
139# Job history added. Upgrade script neutralized for now !
140#
141# Revision 1.32  2003/04/08 21:31:39  jalet
142# (anything or 0) = anything !!! Go back to school Jerome !
143#
144# Revision 1.31  2003/04/08 21:13:44  jalet
145# Prepare --groups option to work.
146#
147# Revision 1.30  2003/04/08 21:10:18  jalet
148# Checks --groups option presence instead of --users because --users is the default.
149#
150# Revision 1.29  2003/04/05 09:28:56  jalet
151# Unnecessary message was logged
152#
153# Revision 1.28  2003/03/29 13:45:26  jalet
154# GPL paragraphs were incorrectly (from memory) copied into the sources.
155# Two README files were added.
156# Upgrade script for PostgreSQL pre 1.01 schema was added.
157#
158# Revision 1.27  2003/03/10 00:23:04  jalet
159# Bad english
160#
161# Revision 1.26  2003/03/10 00:11:27  jalet
162# Cleaner example.
163#
164# Revision 1.25  2003/03/09 23:56:21  jalet
165# Option noquota added to do accounting only.
166#
167# Revision 1.24  2003/02/27 23:48:41  jalet
168# Correctly maps PyKota's log levels to syslog log levels
169#
170# Revision 1.23  2003/02/27 22:55:20  jalet
171# WARN log priority doesn't exist.
172#
173# Revision 1.22  2003/02/27 09:37:02  jalet
174# Wildcards seem to work now
175#
176# Revision 1.21  2003/02/27 09:04:46  jalet
177# user and group names can be passed as wildcards if the --add option
178# is not set. The default is to act on all users or groups.
179#
180# Revision 1.20  2003/02/10 12:07:30  jalet
181# Now repykota should output the recorded total page number for each printer too.
182#
183# Revision 1.19  2003/02/09 13:40:29  jalet
184# typo
185#
186# Revision 1.18  2003/02/09 12:56:53  jalet
187# Internationalization begins...
188#
189# Revision 1.17  2003/02/08 22:47:23  jalet
190# Option --reset can now be used without having to use soft and hard limits
191# on the command line.
192#
193# Revision 1.16  2003/02/08 22:39:46  jalet
194# --reset command line option added
195#
196# Revision 1.15  2003/02/08 22:20:01  jalet
197# Clarification on why we don't check with /etc/passwd to see if the user
198# name is valid or not.
199#
200# Revision 1.14  2003/02/08 22:18:15  jalet
201# Now checks user and group names for validity before adding them
202#
203# Revision 1.13  2003/02/08 22:09:02  jalet
204# Only printer was added the first time.
205#
206# Revision 1.12  2003/02/08 21:44:49  jalet
207# Python 2.1 string module doesn't define ascii_letters
208#
209# Revision 1.11  2003/02/08 09:42:44  jalet
210# Better handle wrong or bad command line arguments
211#
212# Revision 1.10  2003/02/08 09:39:20  jalet
213# typos
214#
215# Revision 1.9  2003/02/08 09:38:06  jalet
216# Badly placed test
217#
218# Revision 1.8  2003/02/07 22:53:57  jalet
219# Checks if printer name is valid before adding it
220#
221# Revision 1.7  2003/02/07 22:17:58  jalet
222# Incomplete test
223#
224# Revision 1.6  2003/02/07 22:13:13  jalet
225# Perhaps edpykota is now able to add printers !!! Oh, stupid me !
226#
227# Revision 1.5  2003/02/06 14:49:04  jalet
228# edpykota should be ok now
229#
230# Revision 1.4  2003/02/06 14:28:59  jalet
231# edpykota should be ok, minus some typos
232#
233# Revision 1.3  2003/02/06 10:47:21  jalet
234# Documentation string and command line options didn't match.
235#
236# Revision 1.2  2003/02/06 10:39:23  jalet
237# Preliminary edpykota work.
238#
239# Revision 1.1  2003/02/05 21:41:09  jalet
240# Skeletons added for all command line tools
241#
242#
243#
244
245import sys
246
247from pykota import version
248from pykota.tool import PyKotaTool, PyKotaToolError
249from pykota.config import PyKotaConfigError
250from pykota.storage import PyKotaStorageError
251
252__doc__ = """edpykota v%s (c) 2003-2004 C@LL - Conseil Internet & Logiciels Libres
253A Print Quota editor for PyKota.
254
255command line usage :
256
257  edpykota [options] user1 user2 ... userN
258 
259  edpykota [options] group1 group2 ... groupN
260
261options :
262
263  -v | --version       Prints edpykota's version number then exits.
264  -h | --help          Prints this message then exits.
265 
266  -a | --add           Adds users and/or printers if they don't
267                       exist on the Quota Storage Server.
268                       
269  -d | --delete        Deletes users/groups from the quota storage.
270                       Printers are never deleted.
271                       
272  -c | --charge p[,j]  Sets the price per page and per job to charge
273                       for a particular printer. Job price is optional.
274                       If both are to be set, separate them with a comma.
275                       Floating point values are allowed.
276 
277  -i | --ingroups g1[,g2...]  Puts the users into each of the groups
278                              listed, separated by commas. The groups
279                              must already exist in the Quota Storage.
280 
281  -u | --users         Edit users print quotas, this is the default.
282 
283  -P | --printer p     Edit quotas on printer p only. Actually p can
284                       use wildcards characters to select only
285                       some printers. The default value is *, meaning
286                       all printers.
287                       You can specify several names or wildcards,
288                       by separating them with commas.
289 
290  -G | --pgroups pg1[,pg2...] Adds the printer(s) to the printer groups
291                       pg1, pg2, etc... which must already exist.
292                       A printer group is just like a normal printer,
293                       only that it is usually unknown from the printing
294                       system. Create printer groups exactly the same
295                       way that you create printers, then add other
296                       printers to them with this option.
297                       Accounting is done on a printer and on all
298                       the printer groups it belongs to, quota checking
299                       is done on a printer and on all the printer groups
300                       it belongs to.
301 
302  -g | --groups        Edit users groups print quotas instead of users.
303                         
304  -p | --prototype u|g Uses user u or group g as a prototype to set
305                       print quotas
306                       
307  -n | --noquota       Doesn't set a quota but only does accounting.
308 
309  -r | --reset         Resets the printed page counter for the user
310                       or group to zero. The life time page counter
311                       is kept unchanged.
312                       
313  -l | --limitby l     Choose if the user/group is limited in printing                     
314                       by its account balance or by its page quota.
315                       The default value is 'quota'. Allowed values
316                       are 'quota' and 'balance'.
317                       
318  -b | --balance b     Sets the user's account balance to b.                     
319                       Account balance may be increase or decreased
320                       if b is prefixed with + or -.
321                       WARNING : when decreasing account balance,
322                       the total paid so far by the user is decreased
323                       too.
324                       Groups don't have a real balance, but the
325                       sum of their users' account balance.
326                       
327  -S | --softlimit sl  Sets the quota soft limit to sl pages.                       
328 
329  -H | --hardlimit hl  Sets the quota hard limit to hl pages.
330 
331  user1 through userN and group1 through groupN can use wildcards
332  if the --add option is not set.
333 
334examples :                             
335
336  $ edpykota --add -p jerome john paul george ringo/ringo@yourdomain.com
337 
338  This will add users john, paul, george and ringo to the quota
339  database, and set their print quotas to the same values than user
340  jerome. User jerome must already exist.
341  User ringo's email address will also be set to 'ringo@yourdomain.com'
342 
343  $ edpykota --printer lp -S 50 -H 60 jerome
344 
345  This will set jerome's print quota on the lp printer to a soft limit
346  of 50 pages, and a hard limit of 60 pages. If either user jerome or
347  printer lp doesn't exist on the Quota Storage Server then nothing is done.
348
349  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome
350 
351  Same as above, but if either user jerome or printer lp doesn't exist
352  on the Quota Storage Server they are automatically added. Also
353  user jerome is put into the groups "coders" and "it" which must
354  already exist in the Quota Storage.
355           
356  $ edpykota -g -S 500 -H 550 financial support           
357 
358  This will set print quota soft limit to 500 pages and hard limit
359  to 550 pages for groups financial and support on all printers.
360 
361  $ edpykota --reset jerome "jo*"
362 
363  This will reset jerome's page counter to zero on all printers, as
364  well as every user whose name begins with 'jo'.
365  Their life time page counter on each printer will be kept unchanged.
366 
367  $ edpykota --printer hpcolor --noquota jerome
368 
369  This will tell PyKota to not limit jerome when printing on the
370  hpcolor printer. All his jobs will be allowed on this printer, but
371  accounting of the pages he prints will still be kept.
372  Print Quotas for jerome on other printers are unchanged.
373 
374  $ edpykota --limitby balance jerome
375 
376  This will tell PyKota to limit jerome by his account's balance
377  when printing.
378 
379  $ edpykota --balance +10.0 jerome
380 
381  This will increase jerome's account balance by 10.0 (in your
382  own currency). You can decrease the account balance with a
383  dash prefix, and set it to a fixed amount with no prefix.
384 
385  $ edpykota --delete jerome rachel
386 
387  This will completely delete jerome and rachel from the Quota Storage
388  database. All their quotas and jobs will be deleted too.
389 
390  $ edpykota --printer lp --charge 0.1
391 
392  This will set the page price for printer lp to 0.1. Job price
393  will not be changed.
394 
395  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP
396 
397  This will put printers hplj1 and hplj2 in printers groups Laser and HP.
398  When printing either on hplj1 or hplj2, print quota will also be
399  checked and accounted for on virtual printers Laser and HP.
400
401This program is free software; you can redistribute it and/or modify
402it under the terms of the GNU General Public License as published by
403the Free Software Foundation; either version 2 of the License, or
404(at your option) any later version.
405
406This program is distributed in the hope that it will be useful,
407but WITHOUT ANY WARRANTY; without even the implied warranty of
408MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
409GNU General Public License for more details.
410
411You should have received a copy of the GNU General Public License
412along with this program; if not, write to the Free Software
413Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
414
415Please e-mail bugs to: %s""" % (version.__version__, version.__author__)
416       
417class EdPyKota(PyKotaTool) :       
418    """A class for edpykota."""
419    def main(self, names, options) :
420        """Edit user or group quotas."""
421       
422        suffix = (options["groups"] and "Group") or "User"       
423       
424        softlimit = hardlimit = None   
425        if not options["noquota"] :
426            if options["softlimit"] :
427                try :
428                    softlimit = int(options["softlimit"].strip())
429                except ValueError :   
430                    raise PyKotaToolError, _("Invalid softlimit value %s.") % options["softlimit"]
431            if options["hardlimit"] :
432                try :
433                    hardlimit = int(options["hardlimit"].strip())
434                except ValueError :   
435                    raise PyKotaToolError, _("Invalid hardlimit value %s.") % options["hardlimit"]
436            if (softlimit is not None) and (hardlimit is not None) and (hardlimit < softlimit) :       
437                # error, exchange them
438                self.logger.log_message(_("Hard limit %i is less than soft limit %i, values will be exchanged.") % (hardlimit, softlimit))
439                (softlimit, hardlimit) = (hardlimit, softlimit)
440           
441        balance = options["balance"]
442        if balance :
443            balance = balance.strip()
444            try :
445                balancevalue = float(balance)
446            except ValueError :   
447                raise PyKotaToolError, _("Invalid balance value %s") % options["balance"]
448           
449        if options["charge"] :
450            try :
451                charges = [float(part) for part in options["charge"].split(',', 1)]
452            except ValueError :   
453                raise PyKotaToolError, _("Invalid charge amount value %s") % options["charge"]
454            else :   
455                if len(charges) > 2 :
456                    charges = charges[:2]
457                if len(charges) != 2 :
458                    charges = [charges[0], None]
459                   
460        limitby = options["limitby"]
461        if limitby :
462            limitby = limitby.strip().lower()
463        if limitby and (limitby not in ('quota', 'balance')) :   
464            raise PyKotaToolError, _("Invalid limitby value %s") % options["limitby"]
465           
466        if options["ingroups"] :   
467            groupnames = [gname.strip() for gname in options["ingroups"].split(',')]
468        else :   
469            groupnames = []
470           
471        if options["prototype"] :   
472            protoentry = getattr(self.storage, "get%s" % suffix)(options["prototype"])
473           
474        printeradded = 0
475        printers = self.storage.getMatchingPrinters(options["printer"])
476        if not printers :
477            pname = options["printer"]
478            if options["add"] and pname :
479                if self.isValidName(pname) :
480                    printers = [ self.storage.addPrinter(pname) ]
481                    if printers[0].Exists :
482                        printeradded = 1
483                    else :   
484                        raise PyKotaToolError, _("Impossible to add printer %s") % pname
485                else :   
486                    raise PyKotaToolError, _("Invalid printer name %s") % pname
487            else :
488                raise PyKotaToolError, _("There's no printer matching %s") % pname
489        if not names :   
490            if options["add"] :
491                if not printeradded :
492                    raise PyKotaToolError, _("You have to pass user or group names on the command line")
493                else :   
494                    names = getattr(self.storage, "getAll%ssNames" % suffix)()
495            else :   
496                names = [ "*" ] # all users
497               
498        printersgroups = []       
499        if options["pgroups"] :       
500            printersgroups = self.storage.getMatchingPrinters(options["pgroups"])
501           
502        todelete = {}   
503        changed = {} # tracks changes made at the user/group level
504        for printer in printers :
505            for pgroup in printersgroups :
506                pgroup.addPrinterToGroup(printer)   
507               
508            if options["charge"] :
509                (perpage, perjob) = charges
510                printer.setPrices(perpage, perjob)   
511               
512            if options["prototype"] :
513                if protoentry.Exists :
514                    protoquota = getattr(self.storage, "get%sPQuota" % suffix)(protoentry, printer)
515                    if not protoquota.Exists :
516                        self.logger.log_message(_("Prototype %s not found in Quota Storage for printer %s.") % (protoentry.Name, printer.Name))
517                        continue    # skip this printer
518                    else :   
519                        (softlimit, hardlimit) = (protoquota.SoftLimit, protoquota.HardLimit)
520                else :       
521                    self.logger.log_message(_("Prototype object %s not found in Quota Storage.") % protoentry.Name)
522                   
523            if not options["noquota"] :   
524                if hardlimit is None :   
525                    hardlimit = softlimit
526                    if hardlimit is not None :
527                        self.logger.log_message(_("Undefined hard limit set to soft limit (%s) on printer %s.") % (str(hardlimit), printer.Name))
528                if softlimit is None :   
529                    softlimit = hardlimit
530                    if softlimit is not None :
531                        self.logger.log_message(_("Undefined soft limit set to hard limit (%s) on printer %s.") % (str(softlimit), printer.Name))
532                       
533            if options["add"] :   
534                allentries = []   
535                for name in names :
536                    email = ""
537                    if not options["groups"] :
538                        splitname = name.split('/', 1)     # username/email
539                        if len(splitname) == 1 :
540                            splitname.append("")
541                        (name, email) = splitname
542                        if email and (email.count('@') != 1) :
543                            self.logger.log_message(_("Invalid email address %s") % email)
544                            email = ""
545                    entry = getattr(self.storage, "get%s" % suffix)(name)
546                    if email and not options["groups"] :
547                        entry.Email = email
548                    entrypquota = getattr(self.storage, "get%sPQuota" % suffix)(entry, printer)
549                    allentries.append((entry, entrypquota))
550            else :   
551                allentries = getattr(self.storage, "getPrinter%ssAndQuotas" % suffix)(printer, names)
552               
553            for (entry, entrypquota) in allentries :
554                if not changed.has_key(entry.Name) :
555                    changed[entry.Name] = {}
556                    if not options["groups"] :
557                        changed[entry.Name]["ingroups"] = []
558                       
559                if not entry.Exists :       
560                    # not found
561                    if options["add"] :
562                        # In case we want to add something, it is crucial
563                        # that we DON'T check with the system accounts files
564                        # like /etc/passwd because users may be defined
565                        # only remotely
566                        if self.isValidName(entry.Name) :
567                            entry = getattr(self.storage, "add%s" % suffix)(entry)
568                        else :   
569                            if options["groups"] :
570                                self.logger.log_message(_("Invalid group name %s") % entry.Name)
571                            else :   
572                                self.logger.log_message(_("Invalid user name %s") % entry.Name)
573                               
574                if entry.Exists and (not entrypquota.Exists) :
575                    # not found
576                    if options["add"] :
577                        entrypquota = getattr(self.storage, "add%sPQuota" % suffix)(entry, printer)
578                       
579                if not entrypquota.Exists :     
580                    self.logger.log_message(_("Quota not found for object %s on printer %s.") % (entry.Name, printer.Name))
581                else :   
582                    if options["delete"] :
583                        todelete[entry.Name] = entry # will be done for each printer, we don't care.
584                    else :
585                        if options["noquota"] or options["prototype"] or ((softlimit is not None) and (hardlimit is not None)) :
586                            entrypquota.setLimits(softlimit, hardlimit)
587                        if limitby :
588                            if changed[entry.Name].get("limitby") is None :
589                                entry.setLimitBy(limitby)
590                                changed[entry.Name]["limitby"] = limitby
591                       
592                        if not options["groups"] :
593                            if options["reset"] :
594                                entrypquota.reset()
595                               
596                            if balance :
597                                if changed[entry.Name].get("balance") is None :
598                                    if balance.startswith("+") or balance.startswith("-") :
599                                        newbalance = float(entry.AccountBalance or 0.0) + balancevalue
600                                        newlifetimepaid = float(entry.LifeTimePaid or 0.0) + balancevalue
601                                        entry.setAccountBalance(newbalance, newlifetimepaid)
602                                    else :
603                                        diff = balancevalue - float(entry.AccountBalance or 0.0)
604                                        newlifetimepaid = float(entry.LifeTimePaid or 0.0) + diff
605                                        entry.setAccountBalance(balancevalue, newlifetimepaid)
606                                    changed[entry.Name]["balance"] = balance
607                                   
608                            for groupname in groupnames :       
609                                # not executed if option --ingroups is not used
610                                if groupname not in changed[entry.Name]["ingroups"] :
611                                    group = self.storage.getGroup(groupname)
612                                    if group.Exists :
613                                        self.storage.addUserToGroup(entry, group)
614                                        changed[entry.Name]["ingroups"].append(groupname)
615                                    else :
616                                        self.logger.log_message(_("Group %s not found in the PyKota Storage.") % groupname)
617                                       
618                        # This line disabled to prevent sending of unwanted email                 
619                        # messages if quota is reached at creation/modification time.
620                        # The check will be done at print time anyway.
621                        # getattr(self, "warn%sPQuota" % suffix)(entrypquota)   
622                       
623        # Now delete what has to be deleted               
624        for (name, entry) in todelete.items() :               
625            entry.delete()
626                     
627if __name__ == "__main__" : 
628    retcode = 0
629    try :
630        defaults = { \
631                     "printer" : "*", \
632                   }
633        short_options = "vhdc:l:b:i:naugrp:P:S:H:G:"
634        long_options = ["help", "version", "charge=", "delete", "limitby=", "balance=", "ingroups=", "noquota", "add", "users", "groups", "reset", "prototype=", "printer=", "softlimit=", "hardlimit=", "pgroups="]
635       
636        # Initializes the command line tool
637        editor = EdPyKota(doc=__doc__)
638       
639        # parse and checks the command line
640        (options, args) = editor.parseCommandline(sys.argv[1:], short_options, long_options)
641       
642        # sets long options
643        options["help"] = options["h"] or options["help"]
644        options["version"] = options["v"] or options["version"]
645        options["add"] = options["a"] or options["add"]
646        options["users"] = options["u"] or options["users"]
647        options["groups"] = options["g"] or options["groups"]
648        options["prototype"] = options["p"] or options["prototype"]
649        options["printer"] = options["P"] or options["printer"] or defaults["printer"]
650        options["softlimit"] = options["S"] or options["softlimit"]
651        options["hardlimit"] = options["H"] or options["hardlimit"] 
652        options["reset"] = options["r"] or options["reset"] 
653        options["noquota"] = options["n"] or options["noquota"]
654        options["limitby"] = options["l"] or options["limitby"]
655        options["balance"] = options["b"] or options["balance"] 
656        options["delete"] = options["d"] or options["delete"] 
657        options["ingroups"] = options["i"] or options["ingroups"]
658        options["charge"] = options["c"] or options["charge"]
659        options["pgroups"] = options["G"] or options["pgroups"]
660       
661        if options["help"] :
662            editor.display_usage_and_quit()
663        elif options["version"] :
664            editor.display_version_and_quit()
665        elif options["users"] and options["groups"] :   
666            raise PyKotaToolError, _("incompatible options, see help.")
667        elif (options["add"] or options["prototype"]) and options["delete"] :   
668            raise PyKotaToolError, _("incompatible options, see help.")
669        elif (options["softlimit"] or options["hardlimit"]) and options["prototype"] :   
670            raise PyKotaToolError, _("incompatible options, see help.")
671        elif options["noquota"] and (options["prototype"] or options["hardlimit"] or options["softlimit"]) :
672            raise PyKotaToolError, _("incompatible options, see help.")
673        elif options["groups"] and (options["balance"] or options["ingroups"]) :
674            raise PyKotaToolError, _("incompatible options, see help.")
675        else :
676            retcode = editor.main(args, options)
677    except (PyKotaToolError, PyKotaConfigError, PyKotaStorageError), msg :           
678        sys.stderr.write("%s\n" % msg)
679        sys.stderr.flush()
680        retcode = -1
681
682    try :
683        editor.storage.close()
684    except (TypeError, NameError, AttributeError) :   
685        pass
686       
687    sys.exit(retcode)   
Note: See TracBrowser for help on using the browser.