root / pykota / trunk / bin / edpykota @ 1755

Revision 1755, 30.1 kB (checked in by jalet, 20 years ago)

Added the --hardreset command line option to edpykota

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