root / pykota / trunk / bin / warnpykota @ 1901

Revision 1810, 10.8 kB (checked in by jalet, 20 years ago)

alreadydone mapping was reset in each iteration, this is fixed.

  • 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 Warning sender
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.36  2004/10/12 17:08:32  jalet
27# alreadydone mapping was reset in each iteration, this is fixed.
28#
29# Revision 1.35  2004/10/12 09:14:03  jalet
30# Ensures that warnpykota still test other quota entries for each user if
31# he has not been warned, even if limited by his account balance.
32#
33# Revision 1.34  2004/10/12 09:09:04  jalet
34# Now warnpykota warns users limited by balance only once per launch.
35#
36# Revision 1.33  2004/10/12 08:58:53  jalet
37# Now warnpykota only warns users who have already printed, to not confuse
38# users who have just opened their account.
39#
40# Revision 1.32  2004/10/11 22:53:05  jalet
41# Postponed string interpolation to help message's output method
42#
43# Revision 1.31  2004/10/11 12:49:06  jalet
44# Renders help translatable
45#
46# Revision 1.30  2004/10/06 10:05:47  jalet
47# Minor changes to allow any PyKota administrator to launch enhanced versions
48# of the commands, and not only the root user.
49#
50# Revision 1.29  2004/06/18 13:34:49  jalet
51# Now all tracebacks include PyKota's version number
52#
53# Revision 1.28  2004/06/07 18:43:41  jalet
54# Fixed over-verbose exits when displaying help or version number
55#
56# Revision 1.27  2004/06/03 21:50:34  jalet
57# Improved error logging.
58# crashrecipient directive added.
59# Now exports the job's size in bytes too.
60#
61# Revision 1.26  2004/01/08 14:10:32  jalet
62# Copyright year changed.
63#
64# Revision 1.25  2003/10/09 21:25:26  jalet
65# Multiple printer names or wildcards can be passed on the command line
66# separated with commas.
67# Beta phase.
68#
69# Revision 1.24  2003/10/07 09:07:28  jalet
70# Character encoding added to please latest version of Python
71#
72# Revision 1.23  2003/08/18 16:35:28  jalet
73# New pychecker pass, on the tools this time.
74#
75# Revision 1.22  2003/07/29 20:55:17  jalet
76# 1.14 is out !
77#
78# Revision 1.21  2003/07/07 12:19:52  jalet
79# Now repykota and warnpykota --groups check the groups the user is a member of
80# in the print quota database, not in the system passwd/group files
81#
82# Revision 1.20  2003/06/25 14:10:01  jalet
83# Hey, it may work (edpykota --reset excepted) !
84#
85# Revision 1.19  2003/04/29 22:03:38  jalet
86# Better error handling.
87#
88# Revision 1.18  2003/04/23 22:13:56  jalet
89# Preliminary support for LPRng added BUT STILL UNTESTED.
90#
91# Revision 1.17  2003/04/17 13:32:17  jalet
92# bad documentation string
93#
94# Revision 1.16  2003/04/16 12:35:49  jalet
95# Groups quota work now !
96#
97# Revision 1.15  2003/04/10 21:47:20  jalet
98# Job history added. Upgrade script neutralized for now !
99#
100# Revision 1.14  2003/04/08 21:31:39  jalet
101# (anything or 0) = anything !!! Go back to school Jerome !
102#
103# Revision 1.13  2003/04/08 21:13:44  jalet
104# Prepare --groups option to work.
105#
106# Revision 1.12  2003/04/08 21:10:18  jalet
107# Checks --groups option presence instead of --users because --users is the default.
108#
109# Revision 1.11  2003/03/29 13:45:27  jalet
110# GPL paragraphs were incorrectly (from memory) copied into the sources.
111# Two README files were added.
112# Upgrade script for PostgreSQL pre 1.01 schema was added.
113#
114# Revision 1.10  2003/03/25 11:45:32  jalet
115# Clearer help.
116#
117# Revision 1.9  2003/03/09 23:39:14  jalet
118# Simplified translations.
119#
120# Revision 1.8  2003/02/10 12:07:30  jalet
121# Now repykota should output the recorded total page number for each printer too.
122#
123# Revision 1.7  2003/02/09 13:40:29  jalet
124# typo
125#
126# Revision 1.6  2003/02/09 12:56:53  jalet
127# Internationalization begins...
128#
129# Revision 1.5  2003/02/07 23:24:38  jalet
130# Empty line deleted
131#
132# Revision 1.4  2003/02/06 23:25:40  jalet
133# Cleaner docstring
134#
135# Revision 1.3  2003/02/06 23:20:02  jalet
136# warnpykota doesn't need any user/group name argument, mimicing the
137# warnquota disk quota tool.
138#
139# Revision 1.2  2003/02/06 22:54:33  jalet
140# warnpykota should be ok
141#
142#
143#
144
145import sys
146import os
147import pwd
148
149from pykota.tool import PyKotaTool, PyKotaToolError, crashed, N_
150from pykota.config import PyKotaConfigError
151from pykota.storage import PyKotaStorageError
152
153__doc__ = N_("""warnpykota v%s (c) 2003-2004 C@LL - Conseil Internet & Logiciels Libres
154
155Sends mail to users over print quota.
156
157command line usage :
158
159  warnpykota  [options]  [names]
160
161options :
162
163  -v | --version       Prints warnpykota's version number then exits.
164  -h | --help          Prints this message then exits.
165 
166  -u | --users         Warns users over their print quota, this is the
167                       default.
168 
169  -g | --groups        Warns users whose groups quota are over limit.
170 
171  -P | --printer p     Verify quotas on this printer only. Actually p can
172                       use wildcards characters to select only
173                       some printers. The default value is *, meaning
174                       all printers.
175                       You can specify several names or wildcards,
176                       by separating them with commas.
177 
178examples :                             
179
180  $ warnpykota --printer lp
181 
182  This will warn all users of the lp printer who have exceeded their
183  print quota.
184
185  $ warnpykota
186 
187  This will warn all users  who have exceeded their print quota on
188  any printer.
189
190  $ warnpykota --groups --printer "laserjet*" "dev*"
191 
192  This will warn all users of groups which names begins with "dev" and
193  who have exceeded their print quota on any printer which name begins
194  with "laserjet"
195 
196  If launched by an user who is not a PyKota administrator, additionnal
197  arguments representing users or groups names are ignored, and only the
198  current user/group is reported.
199
200This program is free software; you can redistribute it and/or modify
201it under the terms of the GNU General Public License as published by
202the Free Software Foundation; either version 2 of the License, or
203(at your option) any later version.
204
205This program is distributed in the hope that it will be useful,
206but WITHOUT ANY WARRANTY; without even the implied warranty of
207MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
208GNU General Public License for more details.
209
210You should have received a copy of the GNU General Public License
211along with this program; if not, write to the Free Software
212Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
213
214Please e-mail bugs to: %s""")
215       
216class WarnPyKota(PyKotaTool) :       
217    """A class for warnpykota."""
218    def main(self, ugnames, options) :
219        """Warn users or groups over print quota."""
220        if self.config.isAdmin :
221            # PyKota administrator
222            if not ugnames :
223                # no username, means all usernames
224                ugnames = [ "*" ]
225        else :       
226            # not a PyKota administrator
227            # warns only the current user
228            # the utility of this is discutable, but at least it
229            # protects other users from mail bombing if they are
230            # over quota.
231            username = pwd.getpwuid(os.geteuid())[0]
232            if options["groups"] :
233                user = self.storage.getUser(username)
234                if user.Exists :
235                    ugnames = [ g.Name for g in self.storage.getUserGroups(user) ]
236                else :   
237                    ugnames = [ ]
238            else :
239                ugnames = [ username ]
240       
241        printers = self.storage.getMatchingPrinters(options["printer"])
242        if not printers :
243            raise PyKotaToolError, _("There's no printer matching %s") % options["printer"]
244        alreadydone = {}
245        for printer in printers :
246            if options["groups"] :
247                for (group, grouppquota) in self.storage.getPrinterGroupsAndQuotas(printer, ugnames) :
248                    self.warnGroupPQuota(grouppquota)
249            else :
250                for (user, userpquota) in self.storage.getPrinterUsersAndQuotas(printer, ugnames) :
251                    # we only want to warn users who have ever printed something
252                    # and don't want to warn users who have never printed
253                    if (user.AccountBalance and (user.AccountBalance != user.LifeTimePaid)) or \
254                       userpquota.PageCounter or userpquota.LifePageCounter or \
255                       self.storage.getUserNbJobsFromHistory(user) :
256                        done = alreadydone.get(user.Name)
257                        if (user.LimitBy.lower() != 'balance') or not done :
258                            action = self.warnUserPQuota(userpquota)
259                            if not done :
260                                alreadydone[user.Name] = (action in ('WARN', 'DENY'))
261                     
262if __name__ == "__main__" : 
263    retcode = 0
264    try :
265        defaults = { \
266                     "printer" : "*", \
267                   }
268        short_options = "vhugP:"
269        long_options = ["help", "version", "users", "groups", "printer="]
270       
271        # Initializes the command line tool
272        sender = WarnPyKota(doc=__doc__)
273       
274        # parse and checks the command line
275        (options, args) = sender.parseCommandline(sys.argv[1:], short_options, long_options, allownothing=1)
276       
277        # sets long options
278        options["help"] = options["h"] or options["help"]
279        options["version"] = options["v"] or options["version"]
280        options["users"] = options["u"] or options["users"]
281        options["groups"] = options["g"] or options["groups"]
282        options["printer"] = options["P"] or options["printer"] or defaults["printer"]
283       
284        if options["help"] :
285            sender.display_usage_and_quit()
286        elif options["version"] :
287            sender.display_version_and_quit()
288        elif options["users"] and options["groups"] :   
289            raise PyKotaToolError, _("incompatible options, see help.")
290        else :
291            retcode = sender.main(args, options)
292    except SystemExit :       
293        pass
294    except :
295        try :
296            sender.crashed("warnpykota failed")
297        except :   
298            crashed("warnpykota failed")
299        retcode = -1
300       
301    try :
302        sender.storage.close()
303    except (TypeError, NameError, AttributeError) :   
304        pass
305       
306    sys.exit(retcode)   
Note: See TracBrowser for help on using the browser.