root / pykota / trunk / bin / edpykota @ 1789

Revision 1789, 30.4 kB (checked in by jalet, 20 years ago)

Now edpykota refuses to launch if the user is not a PyKota administrator.
dumpykota : now has the same error message than edpykota in this case.

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