|
@@ -20,9 +20,55 @@ DELQ = "postsuper -d"
|
|
|
|
|
|
|
|
|
|
from optparse import OptionParser, OptionGroup # needs python >= 2.3
|
|
from optparse import OptionParser, OptionGroup # needs python >= 2.3
|
|
-import sys, popen2, fnmatch
|
|
+import sys, os, popen2, fcntl, select, fnmatch
|
|
|
|
|
|
-class mailqueue:
|
|
+class Proc:
|
|
|
|
+
|
|
|
|
+ def run(self, command):
|
|
|
|
+ child = popen2.Popen3(command, 1)
|
|
|
|
+ child.tochild.close()
|
|
|
|
+ outfile = child.fromchild
|
|
|
|
+ outfd = outfile.fileno()
|
|
|
|
+ errfile = child.childerr
|
|
|
|
+ errfd = errfile.fileno()
|
|
|
|
+
|
|
|
|
+ # avoid deadlocks
|
|
|
|
+ self.set_no_block(outfd)
|
|
|
|
+ self.set_no_block(errfd)
|
|
|
|
+
|
|
|
|
+ outdata = errdata = ''
|
|
|
|
+ outeof = erreof = False
|
|
|
|
+
|
|
|
|
+ while True:
|
|
|
|
+ # wait for activity
|
|
|
|
+ ready = select.select([outfd,errfd],[],[])
|
|
|
|
+ if outfd in ready[0]:
|
|
|
|
+ outchunk = outfile.read()
|
|
|
|
+ if outchunk == '':
|
|
|
|
+ outeof = True
|
|
|
|
+ outdata = outdata + outchunk
|
|
|
|
+ if errfd in ready[0]:
|
|
|
|
+ errchunk = errfile.read()
|
|
|
|
+ if errchunk == '':
|
|
|
|
+ erreof = True
|
|
|
|
+ errdata = errdata + errchunk
|
|
|
|
+ if outeof and erreof:
|
|
|
|
+ break
|
|
|
|
+ # give a little time for buffers to fill
|
|
|
|
+ select.select([],[],[],.1)
|
|
|
|
+
|
|
|
|
+ err = child.wait()
|
|
|
|
+
|
|
|
|
+ return err, outdata, errdata
|
|
|
|
+
|
|
|
|
+ def set_no_block(self, fd):
|
|
|
|
+ fl = fcntl.fcntl(fd, fcntl.F_GETFL)
|
|
|
|
+ try:
|
|
|
|
+ fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NDELAY)
|
|
|
|
+ except AttributeError:
|
|
|
|
+ fcntl.fcntl(fd, fcntl.F_SETFL, fl | fcntl.FNDELAY)
|
|
|
|
+
|
|
|
|
+class Mailqueue:
|
|
|
|
|
|
def __init__(self):
|
|
def __init__(self):
|
|
self.mailqueue = []
|
|
self.mailqueue = []
|
|
@@ -42,24 +88,21 @@ class mailqueue:
|
|
|
|
|
|
|
|
|
|
def parse(self):
|
|
def parse(self):
|
|
|
|
+ p_ret, p_stdout, p_stderr = Proc().run(MAILQ)
|
|
|
|
|
|
- proc = popen2.Popen3(MAILQ, True)
|
|
|
|
-
|
|
|
|
# mail system down ?
|
|
# mail system down ?
|
|
- p_ret = proc.wait()
|
|
|
|
if p_ret != 0:
|
|
if p_ret != 0:
|
|
- sys.stderr.write ("ERR : %s\n" % "".join(proc.childerr.readline()).strip())
|
|
+ sys.stderr.write ("ERR : %s\n" % ", ".join(p_stderr.strip().split("\n")))
|
|
sys.exit (-1)
|
|
sys.exit (-1)
|
|
-
|
|
+
|
|
- # checking empty mail queue
|
|
+ buffer = p_stdout.strip().split('\n');
|
|
- buffer = proc.fromchild.readlines()
|
|
+ # checking empty mail queue
|
|
if len(buffer)>0 and buffer[0].strip() == "Mail queue is empty":
|
|
if len(buffer)>0 and buffer[0].strip() == "Mail queue is empty":
|
|
sys.stderr.write ("INFO : %s\n" % buffer[0].strip())
|
|
sys.stderr.write ("INFO : %s\n" % buffer[0].strip())
|
|
return None
|
|
return None
|
|
|
|
|
|
# skip first and last line
|
|
# skip first and last line
|
|
- buffer = "".join(buffer[1:-1]).strip()
|
|
+ buffer = "\n".join(buffer[1:-1]).strip()
|
|
-
|
|
|
|
for block in buffer.split("\n\n"):
|
|
for block in buffer.split("\n\n"):
|
|
lines = block.split("\n")
|
|
lines = block.split("\n")
|
|
|
|
|
|
@@ -193,7 +236,7 @@ def main():
|
|
|
|
|
|
(options, args) = parser.parse_args()
|
|
(options, args) = parser.parse_args()
|
|
|
|
|
|
- m = mailqueue()
|
|
+ m = Mailqueue()
|
|
m.add_filter("email", options.email)
|
|
m.add_filter("email", options.email)
|
|
m.add_filter("msg", options.msg)
|
|
m.add_filter("msg", options.msg)
|
|
m.add_filter("lowsize", options.lowsize)
|
|
m.add_filter("lowsize", options.lowsize)
|