#!/usr/bin/env python # # (C) 2002 Markku Hänninen (hmm@iki.fi) # import sys, os, os.path logf = None class stdlog: fp = None opencount = 0 def __init__(self, path, origfp, tee = 1): self.closed = 0 self.mode = origfp.mode self.name = path self.softspace = 0 if not self.fp: stdlog.fp = open(path, "a") stdlog.opencount = stdlog.opencount + 1 self.origfp = origfp self.tee = tee def getorig(self): return self.origfp def close(self): stdlog.opencount = stdlog.opencount - 1 if not stdlog.opencount: stdlog.fp.close() stdlog.fp = None def flush(self): self.fp.flush() self.origfp.flush() def isatty(self): return self.origfp.isatty() def read(self, size): return origfp.read(size) def readlines(self, size): return origfp.readlines(size) def seek(self, offset, whence): return origfp.seek(size) def tell(self): return origfp.tell() def truncate(self, size): return origfp.truncate(size) def write(self, str): self.fp.write(str) if self.tee: self.origfp.write(str) def log(self, str): self.fp.write(str) def logln(self, str): self.fp.write(str + "\n") def writeln(self, str): self.write(str + "\n") def writelines(self, sequence): self.fp.writelines(sequence) if self.tee: self.origfp.writelines(sequence) def setlog(path, tostdout = 1): rotatefiles(path, 10) sys.stdout = stdlog(path, sys.stdout, tostdout) sys.stderr = stdlog(path, sys.stderr, tostdout) return sys.stdout def setlogf(path, tostdout = 1): global logf logf = setlog(path, tostdout) def logln(s): global logf if logf: logf.logln(s) def resetlog(): fpout = sys.stdout fperr = sys.stderr sys.stdout = sys.stdout.getorig() sys.stderr = sys.stderr.getorig() fpout.close() fperr.close() def rotatefiles(path, count = 10): paths = map(lambda x, pp=path: "%s.%d" % (pp, x), range(count, 0, -1)) paths.append(path) prevp = None for p in paths: if os.path.exists(p) and prevp: os.rename(p, prevp) prevp = p def run(cmd, nostdout = 1): if logf: logf.logln(cmd) fp = os.popen(cmd + " 2>&1" , "r") while 1: l = fp.readline() if not l: break if not nostdout: print l, if logf: logf.log(l) return fp.close()