diff --git a/bauh/commons/system.py b/bauh/commons/system.py index 4437e7df..726b177a 100644 --- a/bauh/commons/system.py +++ b/bauh/commons/system.py @@ -58,15 +58,34 @@ class SystemProcess: class SimpleProcess: - def __init__(self, cmd: List[str], cwd: str = '.', expected_code: int = None, global_interpreter: bool = USE_GLOBAL_INTERPRETER, lang: str = DEFAULT_LANG): - self.instance = subprocess.Popen(cmd, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - bufsize=-1, - cwd=cwd, - env=gen_env(global_interpreter, lang)) + def __init__(self, cmd: List[str], cwd: str = '.', expected_code: int = None, global_interpreter: bool = USE_GLOBAL_INTERPRETER, + lang: str = DEFAULT_LANG, root_password: str = None): + pwdin, final_cmd = None, [] + + if root_password is not None: + final_cmd.extend(['sudo', '-S']) + pwdin = self._new(['echo', root_password], cwd, global_interpreter, lang).stdout + + final_cmd.extend(cmd) + + self.instance = self._new(final_cmd, cwd, global_interpreter, lang, stdin=pwdin) self.expected_code = expected_code + def _new(self, cmd: List[str], cwd: str, global_interpreter: bool, lang: str, stdin = None) -> subprocess.Popen: + + args = { + "stdout": subprocess.PIPE, + "stderr": subprocess.STDOUT, + "bufsize": -1, + "cwd": cwd, + "env": gen_env(global_interpreter, lang) + } + + if stdin: + args['stdin'] = stdin + + return subprocess.Popen(cmd, **args) + class ProcessHandler: diff --git a/bauh/gems/arch/controller.py b/bauh/gems/arch/controller.py index 26072684..a63d2250 100644 --- a/bauh/gems/arch/controller.py +++ b/bauh/gems/arch/controller.py @@ -501,9 +501,8 @@ class ArchManager(SoftwareManager): handler.watcher.change_substatus(self.i18n['arch.checking.conflicts'].format(bold(pkgname))) - for check_out in new_root_subprocess(['pacman', '-U', pkgpath], root_password=root_password, cwd=pkgdir).stdout: - if check_out: - check_install_output.append(check_out.decode()) + for check_out in SimpleProcess(['pacman', '-U', pkgpath], root_password=root_password, cwd=pkgdir).instance.stdout: + check_install_output.append(check_out.decode()) self._update_progress(handler.watcher, 70, change_progress) if check_install_output and 'conflict' in check_install_output[-1]: