root / pykota / trunk / bin / warnpykota @ 3319

Revision 3295, 6.6 kB (checked in by jerome, 17 years ago)

Made the CGI scripts work again.
Moved even more functions to the utils module.
Removed the cgifuncs module, moved (and changed) content into utils.
If no output encoding defined, use UTF-8 : when wget is used to try
the CGI scripts, it doesn't set by default the accepted charset and
language headers.

  • 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: UTF-8 -*-
3#
4# PyKota : Print Quotas for CUPS
5#
6# (c) 2003, 2004, 2005, 2006, 2007, 2008 Jerome Alet <alet@librelogiciel.com>
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation, either version 3 of the License, or
10# (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program.  If not, see <http://www.gnu.org/licenses/>.
19#
20# $Id$
21#
22#
23
24import sys
25import os
26import pwd
27
28import pykota.appinit
29from pykota.utils import *
30
31from pykota.errors import PyKotaCommandLineError
32from pykota.tool import PyKotaTool
33
34__doc__ = N_("""warnpykota v%(__version__)s (c) %(__years__)s %(__author__)s
35
36Sends mail to users over print quota.
37
38command line usage :
39
40  warnpykota  [options]  [names]
41
42options :
43
44  -v | --version       Prints warnpykota's version number then exits.
45  -h | --help          Prints this message then exits.
46 
47  -u | --users         Warns users over their print quota, this is the
48                       default.
49 
50  -g | --groups        Warns users whose groups quota are over limit.
51 
52  -P | --printer p     Verify quotas on this printer only. Actually p can
53                       use wildcards characters to select only
54                       some printers. The default value is *, meaning
55                       all printers.
56                       You can specify several names or wildcards,
57                       by separating them with commas.
58 
59examples :                             
60
61  $ warnpykota --printer lp
62 
63  This will warn all users of the lp printer who have exceeded their
64  print quota.
65
66  $ warnpykota
67 
68  This will warn all users  who have exceeded their print quota on
69  any printer.
70
71  $ warnpykota --groups --printer "laserjet*" "dev*"
72 
73  This will warn all users of groups which names begins with "dev" and
74  who have exceeded their print quota on any printer which name begins
75  with "laserjet"
76 
77  If launched by an user who is not a PyKota administrator, additionnal
78  arguments representing users or groups names are ignored, and only the
79  current user/group is reported.
80""")
81       
82class WarnPyKota(PyKotaTool) :       
83    """A class for warnpykota."""
84    def main(self, ugnames, options) :
85        """Warn users or groups over print quota."""
86        if self.config.isAdmin :
87            # PyKota administrator
88            if not ugnames :
89                # no username, means all usernames
90                ugnames = [ "*" ]
91        else :       
92            # not a PyKota administrator
93            # warns only the current user
94            # the utility of this is discutable, but at least it
95            # protects other users from mail bombing if they are
96            # over quota.
97            username = pwd.getpwuid(os.geteuid())[0]
98            if options["groups"] :
99                user = self.storage.getUser(username)
100                if user.Exists :
101                    ugnames = [ g.Name for g in self.storage.getUserGroups(user) ]
102                else :   
103                    ugnames = [ ]
104            else :
105                ugnames = [ username ]
106       
107        printers = self.storage.getMatchingPrinters(options["printer"])
108        if not printers :
109            raise PyKotaCommandLineError, _("There's no printer matching %s") % options["printer"]
110        alreadydone = {}
111        for printer in printers :
112            if options["groups"] :
113                for (group, grouppquota) in self.storage.getPrinterGroupsAndQuotas(printer, ugnames) :
114                    self.warnGroupPQuota(grouppquota)
115            else :
116                for (user, userpquota) in self.storage.getPrinterUsersAndQuotas(printer, ugnames) :
117                    # we only want to warn users who have ever printed something
118                    # and don't want to warn users who have never printed
119                    if ((user.AccountBalance > self.config.getBalanceZero()) and \
120                       (user.AccountBalance != user.LifeTimePaid)) or \
121                       userpquota.PageCounter or userpquota.LifePageCounter or \
122                       self.storage.getUserNbJobsFromHistory(user) :
123                        done = alreadydone.get(user.Name)
124                        if (user.LimitBy == 'quota') or not done :
125                            action = self.warnUserPQuota(userpquota)
126                            if not done :
127                                alreadydone[user.Name] = (action in ('WARN', 'DENY'))
128                     
129if __name__ == "__main__" : 
130    retcode = 0
131    try :
132        defaults = { \
133                     "printer" : "*", \
134                   }
135        short_options = "vhugP:"
136        long_options = ["help", "version", "users", "groups", "printer="]
137       
138        # Initializes the command line tool
139        sender = WarnPyKota(doc=__doc__)
140        sender.deferredInit()
141       
142        # parse and checks the command line
143        (options, args) = sender.parseCommandline(sys.argv[1:], short_options, long_options, allownothing=1)
144       
145        # sets long options
146        options["help"] = options["h"] or options["help"]
147        options["version"] = options["v"] or options["version"]
148        options["users"] = options["u"] or options["users"]
149        options["groups"] = options["g"] or options["groups"]
150        options["printer"] = options["P"] or options["printer"] or defaults["printer"]
151       
152        if options["help"] :
153            sender.display_usage_and_quit()
154        elif options["version"] :
155            sender.display_version_and_quit()
156        elif options["users"] and options["groups"] :   
157            raise PyKotaCommandLineError, _("incompatible options, see help.")
158        else :
159            retcode = sender.main(args, options)
160    except KeyboardInterrupt :       
161        logerr("\nInterrupted with Ctrl+C !\n")
162        retcode = -3
163    except PyKotaCommandLineError, msg :   
164        logerr("%s : %s\n" % (sys.argv[0], msg))
165        retcode = -2
166    except SystemExit :       
167        pass
168    except :
169        try :
170            sender.crashed("warnpykota failed")
171        except :   
172            crashed("warnpykota failed")
173        retcode = -1
174       
175    try :
176        sender.storage.close()
177    except (TypeError, NameError, AttributeError) :   
178        pass
179       
180    sys.exit(retcode)   
Note: See TracBrowser for help on using the browser.