From 373455026e37d93c699e4ced579c75e2af8042aa Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Mon, 17 Jan 2011 09:17:08 -0500 Subject: Add a way to print output from commands Instead pof always capturing the output, make it possible to let it go to the standard output pipes. Use this in ipactl to let init scripts show their output. Fixes: https://fedorahosted.org/freeipa/ticket/765 --- ipapython/ipautil.py | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) (limited to 'ipapython') diff --git a/ipapython/ipautil.py b/ipapython/ipautil.py index 8ce8bb97..69a410f4 100644 --- a/ipapython/ipautil.py +++ b/ipapython/ipautil.py @@ -92,7 +92,8 @@ def write_tmp_file(txt): return fd -def run(args, stdin=None, raiseonerr=True, nolog=(), env=None): +def run(args, stdin=None, raiseonerr=True, + nolog=(), env=None, capture_output=True): """ Execute a command and return stdin, stdout and the process return code. @@ -116,14 +117,23 @@ def run(args, stdin=None, raiseonerr=True, nolog=(), env=None): If an value isn't found in the list it is silently ignored. """ + p_in = None + p_out = None + p_err = None + if env is None: env={"PATH": "/bin:/sbin:/usr/kerberos/bin:/usr/kerberos/sbin:/usr/bin:/usr/sbin"} if stdin: - p = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True, env=env) - stdout,stderr = p.communicate(stdin) - else: - p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True, env=env) - stdout,stderr = p.communicate() + p_in = subprocess.PIPE + if capture_output: + p_out = subprocess.PIPE + p_err = subprocess.PIPE + elif len(nolog): + raise RuntimeError("Can't use nolog if output is not captured") + + p = subprocess.Popen(args, stdin=p_in, stdout=p_out, stderr=p_err, + close_fds=True, env=env) + stdout,stderr = p.communicate(stdin) # The command and its output may include passwords that we don't want # to log. Run through the nolog items. @@ -137,8 +147,9 @@ def run(args, stdin=None, raiseonerr=True, nolog=(), env=None): stdout = stdout.replace(quoted, 'XXXXXXXX') stderr = stderr.replace(quoted, 'XXXXXXXX') logging.info('args=%s' % args) - logging.info('stdout=%s' % stdout) - logging.info('stderr=%s' % stderr) + if capture_output: + logging.info('stdout=%s' % stdout) + logging.info('stderr=%s' % stderr) if p.returncode != 0 and raiseonerr: raise CalledProcessError(p.returncode, args) -- cgit