[elbe-devel] [PATCH v3 12/52] do and chroot in 'shellhelper.py'
dion at linutronix.de
dion at linutronix.de
Thu Jun 27 14:44:26 CEST 2019
From: Olivier Dion <dion at linutronix.de>
'do' and 'chroot', formerly 'ASCIIDocLog::do' and
'ASCIIDocLog::chroot', are now global functions.
* chroot
Is a wrapper around 'do' and simply put "chroot" in front of the
command to excute.
* do
Will call 'Popen' and redirect its outputs to 'logging'.
* get_command_out
Work similary to 'do', but only print stderr.
Signed-off-by: Olivier Dion <dion at linutronix.de>
---
elbepack/shellhelper.py | 61 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 61 insertions(+)
diff --git a/elbepack/shellhelper.py b/elbepack/shellhelper.py
index 8de9e8c2..0895c0b0 100644
--- a/elbepack/shellhelper.py
+++ b/elbepack/shellhelper.py
@@ -6,8 +6,16 @@
# SPDX-License-Identifier: GPL-3.0-or-later
import os
+import logging
+
from subprocess import Popen, PIPE, STDOUT, call
+from elbepack.log import async_logging
+
+
+log = logging.getLogger("log")
+soap = logging.getLogger("soap")
+
class CommandError(Exception):
def __init__(self, cmd, returncode):
@@ -84,3 +92,56 @@ def system_out_stderr(cmd, stdin=None, allow_fail=False, env_add=None):
raise CommandError(cmd, code)
return out, err
+
+
+def do(cmd, allow_fail=False, stdin=None, env_add=None):
+ new_env = os.environ.copy()
+ if env_add:
+ new_env.update(env_add)
+
+ logging.info(cmd, extra={"context":"[CMD] "})
+
+ r, w = os.pipe()
+
+ if stdin is None:
+ p = Popen(cmd, shell=True, stdout=w, stderr=STDOUT, env=new_env)
+ else:
+ p = Popen(cmd, shell=True, stdin=PIPE, stdout=w, stderr=STDOUT, env=new_env)
+
+ async_logging(r, w, soap, log)
+ p.communicate(input=stdin)
+
+ if p.returncode and not allow_fail:
+ raise CommandError(cmd, p.returncode)
+
+
+
+def chroot(directory, cmd, env_add=None, **kwargs):
+ new_env = {"LANG":"C",
+ "LANGUAGE":"C",
+ "LC_ALL":"C"}
+ if env_add:
+ new_env.update(env_add)
+ chcmd = 'chroot %s %s' % (directory, cmd)
+ do(chcmd, env_add=new_env, **kwargs)
+
+def get_command_out(cmd, stdin=None, allow_fail=False, env_add={}):
+ new_env = os.environ.copy()
+ new_env.update(env_add)
+
+ logging.info(cmd, extra={"context":"[CMD] "})
+
+ r, w = os.pipe()
+
+ if stdin is None:
+ p = Popen(cmd, shell=True, stdout=PIPE, stderr=w, env=new_env)
+ else:
+ p = Popen(cmd, shell=True, stdin=PIPE, stdout=w, stderr=STDOUT, env=new_env)
+
+ async_logging(r, w, soap, log)
+ stdout, stderr = p.communicate(input=stdin)
+
+ if p.returncode and not allow_fail:
+ raise CommandError(cmd, p.returncode)
+
+ return stdout
--
2.11.0
More information about the elbe-devel
mailing list