[PATCHv2] Do not mix stdout and stderr when running utilities unless requested
David Lehman
dlehman at redhat.com
Thu Jan 22 20:03:28 UTC 2015
On 01/22/2015 05:00 AM, Vratislav Podzimek wrote:
> We only gather data from stdout and stderr contents may confuse our parsing
> code. However, we may still be interested in the stderr so log it and allow
> caller code to specify that stderr should go to stdout.
>
> Signed-off-by: Vratislav Podzimek <vpodzime at redhat.com>
> ---
> blivet/fcoe.py | 4 ++--
> blivet/util.py | 17 ++++++++++++++---
> 2 files changed, 16 insertions(+), 5 deletions(-)
>
> diff --git a/blivet/fcoe.py b/blivet/fcoe.py
> index 707ec50..81c5c97 100644
> --- a/blivet/fcoe.py
> +++ b/blivet/fcoe.py
> @@ -119,13 +119,13 @@ class fcoe(object):
> util.run_program(["dcbtool", "sc", nic, "app:fcoe",
> "e:1", "a:1", "w:1"])
> rc, out = util.run_program_and_capture_output(["fipvlan", "-c", "-s", "-f",
> - "-fcoe", nic])
> + "-fcoe", nic], stderr_to_stdout=True)
> else:
> if auto_vlan:
> # certain network configrations require the VLAN layer module:
> util.run_program(["modprobe", "8021q"])
> rc, out = util.run_program_and_capture_output(["fipvlan", '-c', '-s', '-f',
> - "-fcoe", nic])
> + "-fcoe", nic], stderr_to_stdout=True)
> else:
> f = open("/sys/module/libfcoe/parameters/create", "w")
> f.write(nic)
> diff --git a/blivet/util.py b/blivet/util.py
> index e3670a9..3e60e0b 100644
> --- a/blivet/util.py
> +++ b/blivet/util.py
> @@ -23,7 +23,7 @@ from threading import Lock
> program_log_lock = Lock()
>
>
> -def _run_program(argv, root='/', stdin=None, env_prune=None):
> +def _run_program(argv, root='/', stdin=None, env_prune=None, stderr_to_stdout=False):
> if env_prune is None:
> env_prune = []
>
> @@ -40,19 +40,30 @@ def _run_program(argv, root='/', stdin=None, env_prune=None):
> for var in env_prune:
> env.pop(var, None)
>
> + if stderr_to_stdout:
> + stderr_dir = subprocess.STDOUT
> + else:
> + stderr_dir = subprocess.PIPE
> try:
> proc = subprocess.Popen(argv,
> stdin=stdin,
> stdout=subprocess.PIPE,
> - stderr=subprocess.STDOUT,
> + stderr=stderr_dir,
> close_fds=True,
> preexec_fn=chroot, cwd=root, env=env)
>
> - out = proc.communicate()[0]
> + out, err = proc.communicate()
> if out:
> + if not stderr_to_stdout:
> + program_log.info("stdout:")
> for line in out.splitlines():
> program_log.info("%s", line)
>
> + if not stderr_to_stdout and err:
> + program_log.info("stderr:")
> + for line in err.splitlines():
> + program_log.info("%s", line)
> +
> except OSError as e:
> program_log.error("Error running %s: %s", argv[0], e.strerror)
> raise
>
Looks good to me. Thanks.
David
More information about the anaconda-patches
mailing list