summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael E Brown <michael_e_brown@dell.com>2007-10-17 11:32:43 -0500
committerMichael E Brown <michael_e_brown@dell.com>2007-10-17 11:32:43 -0500
commit969c671b484ee26da8a3c6eebc8cd1f649c68983 (patch)
treeda4353b41dd47c7d202e557902ee75cc63b6b922
parentb30e096317d3b2b05f0be80fd7fd74eeb64bdafc (diff)
downloadmock-969c671b484ee26da8a3c6eebc8cd1f649c68983.tar.gz
mock-969c671b484ee26da8a3c6eebc8cd1f649c68983.tar.xz
mock-969c671b484ee26da8a3c6eebc8cd1f649c68983.zip
add tracing, touch(), do() functions
-rw-r--r--src/py-libs/util.py75
1 files changed, 72 insertions, 3 deletions
diff --git a/src/py-libs/util.py b/src/py-libs/util.py
index dbd33f2..b4bf559 100644
--- a/src/py-libs/util.py
+++ b/src/py-libs/util.py
@@ -25,7 +25,7 @@ import os.path
# our imports
import mock.exception
-from mock.trace_decorator import trace
+from mock.trace_decorator import traceLog
# set up logging
log = logging.getLogger("mock.util")
@@ -38,7 +38,7 @@ class commandTimeoutExpired(mock.exception.Error):
self.resultcode = 10
# functions
-@trace
+@traceLog(log)
def mkdirIfAbsent(dir):
log.debug("ensuring that dir exists: %s" % dir)
if not os.path.exists(dir):
@@ -49,9 +49,78 @@ def mkdirIfAbsent(dir):
log.exception()
raise mock.exception.Error, "Could not create dir %s. Error: %s" % (dir, e)
+@traceLog(log)
+def touch(fileName):
+ log.debug("touching file: %s" % fileName)
+ fo = open(fileName, 'w')
+ fo.close()
-@trace
+@traceLog(log)
def umount(dir):
log.debug("NOT YET IMPLEMENTED: unmounting dir: %s" % dir)
+@traceLog(log)
+def do(command, timeout=0, *args, **kargs):
+ """execute given command outside of chroot"""
+ log.debug("Run cmd: %s" % cmd)
+
+ class alarmExc(Exception): pass
+ def alarmhandler(signum,stackframe):
+ raise alarmExc("timeout expired")
+
+ retval = 0
+ log.debug("Executing timeout(%s): %s" % (timeout, command))
+
+ output=""
+ (r,w) = os.pipe()
+ pid = os.fork()
+ if pid: #parent
+ rpid = ret = 0
+ os.close(w)
+ oldhandler=signal.signal(signal.SIGALRM,alarmhandler)
+ starttime = time.time()
+ # timeout=0 means disable alarm signal. no timeout
+ signal.alarm(timeout)
+
+ try:
+ # read output from child
+ r = os.fdopen(r, "r")
+ for line in r:
+ log.debug(line)
+ output += line
+
+ # close read handle, get child return status, etc
+ r.close()
+ (rpid, ret) = os.waitpid(pid, 0)
+ signal.alarm(0)
+ signal.signal(signal.SIGALRM,oldhandler)
+
+ except alarmExc:
+ os.kill(-pid, signal.SIGTERM)
+ time.sleep(1)
+ os.kill(-pid, signal.SIGKILL)
+ (rpid, ret) = os.waitpid(pid, 0)
+ signal.signal(signal.SIGALRM,oldhandler)
+ raise commandTimeoutExpired( "Timeout(%s) exceeded for command: %s" % (timeout, command))
+
+ # mask and return just return value, plus child output
+ return ((ret & 0xFF00) >> 8, output)
+
+ else: #child
+ os.close(r)
+ # become process group leader so that our parent
+ # can kill our children
+ os.setpgrp()
+
+ child = popen2.Popen4(command)
+ child.tochild.close()
+
+ w = os.fdopen(w, "w")
+ for line in child.fromchild:
+ w.write(line)
+ w.close()
+ retval=child.wait()
+ os._exit( (retval & 0xFF00) >> 8 )
+
+