root / pykota / trunk / bin / edpykota @ 1354

Revision 1354, 28.8 kB (checked in by jalet, 20 years ago)

domain names changed to example.com in the doc, according to RFC2606

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