root / pykota / trunk / pykota / accounters / software.py @ 1687

Revision 1687, 4.8 kB (checked in by jalet, 20 years ago)

Introduction of the new 'onaccountererror' configuration directive.
Small fix for software accounter's return code which can't be None anymore.
Make software and hardware accounting code look similar : will be factorized
later.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1# PyKota
2# -*- coding: ISO-8859-15 -*-
3#
4# PyKota - Print Quotas for CUPS and LPRng
5#
6# (c) 2003-2004 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 2 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, write to the Free Software
19# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
20#
21# $Id$
22#
23# $Log$
24# Revision 1.10  2004/08/31 23:29:53  jalet
25# Introduction of the new 'onaccountererror' configuration directive.
26# Small fix for software accounter's return code which can't be None anymore.
27# Make software and hardware accounting code look similar : will be factorized
28# later.
29#
30# Revision 1.9  2004/08/25 22:34:39  jalet
31# Now both software and hardware accounting raise an exception when no valid
32# result can be extracted from the subprocess' output.
33# Hardware accounting now reads subprocess' output until an integer is read
34# or data is exhausted : it now behaves just like software accounting in this
35# aspect.
36#
37# Revision 1.8  2004/08/22 14:04:47  jalet
38# Tries to fix problem with subprocesses outputting more datas than needed
39#
40# Revision 1.7  2004/08/06 13:45:51  jalet
41# Fixed french translation problem.
42# Fixed problem with group quotas and strict enforcement.
43#
44# Revision 1.6  2004/07/01 19:56:43  jalet
45# Better dispatching of error messages
46#
47# Revision 1.5  2004/06/10 22:42:06  jalet
48# Better messages in logs
49#
50# Revision 1.4  2004/06/02 21:51:14  jalet
51# Moved the sigterm capturing elsewhere
52#
53# Revision 1.3  2004/05/24 22:45:49  jalet
54# New 'enforcement' directive added
55# Polling loop improvements
56#
57# Revision 1.2  2004/05/18 14:49:23  jalet
58# Big code changes to completely remove the need for "requester" directives,
59# jsut use "hardware(... your previous requester directive's content ...)"
60#
61# Revision 1.1  2004/05/13 13:59:30  jalet
62# Code simplifications
63#
64#
65
66import sys
67import os
68import popen2
69from pykota.accounter import AccounterBase, PyKotaAccounterError
70
71class Accounter(AccounterBase) :
72    def computeJobSize(self) :   
73        """Feeds an external command with our datas to let it compute the job size, and return its value."""
74        self.filter.printInfo(_("Launching SOFTWARE(%s)...") % self.arguments)
75        MEGABYTE = 1024*1024
76        self.filter.jobdatastream.seek(0)
77        child = popen2.Popen4(self.arguments)
78        try :
79            data = self.filter.jobdatastream.read(MEGABYTE)   
80            while data :
81                child.tochild.write(data)
82                data = self.filter.jobdatastream.read(MEGABYTE)
83            child.tochild.flush()
84            child.tochild.close()   
85        except (IOError, OSError), msg :   
86            msg = "%s : %s" % (self.arguments, msg) 
87            self.filter.printInfo(_("Unable to compute job size with accounter %s") % msg)
88       
89        pagecounter = None
90        try :
91            answer = child.fromchild.read()
92        except (IOError, OSError), msg :   
93            msg = "%s : %s" % (self.arguments, msg) 
94            self.filter.printInfo(_("Unable to compute job size with accounter %s") % msg)
95        else :   
96            lines = [l.strip() for l in answer.split("\n")]
97            for i in range(len(lines)) : 
98                try :
99                    pagecounter = int(lines[i])
100                except (AttributeError, ValueError) :
101                    self.filter.printInfo(_("Line [%s] skipped in accounter's output. Trying again...") % lines[i])
102                else :   
103                    break
104        child.fromchild.close()
105       
106        try :
107            status = child.wait()
108        except OSError, msg :   
109            self.filter.printInfo(_("Problem while waiting for software accounter pid %s to exit : %s") % (child.pid, msg))
110        else :   
111            if os.WIFEXITED(status) :
112                status = os.WEXITSTATUS(status)
113            self.filter.printInfo(_("Software accounter %s exit code is %s") % (self.arguments, str(status)))
114           
115        if pagecounter is None :   
116            message = _("Unable to compute job size with accounter %s") % self.arguments
117            if self.onerror == "CONTINUE" :
118                self.filter.printInfo(message, "error")
119            else :
120                raise PyKotaAccounterError, message
121           
122        self.filter.logdebug("Software accounter %s said job is %s pages long." % (self.arguments, repr(pagecounter)))
123        return pagecounter or 0
Note: See TracBrowser for help on using the browser.