diff --git a/bauh/commons/system.py b/bauh/commons/system.py index 6837bb93..9c001e26 100644 --- a/bauh/commons/system.py +++ b/bauh/commons/system.py @@ -4,7 +4,7 @@ import sys import time from io import StringIO from subprocess import PIPE -from typing import List, Tuple +from typing import List, Tuple, Set # default environment variables for subprocesses. from bauh.api.abstract.handler import ProcessWatcher @@ -25,7 +25,7 @@ USE_GLOBAL_INTERPRETER = bool(os.getenv('VIRTUAL_ENV')) SIZE_MULTIPLIERS = ((0.001, 'Kb'), (0.000001, 'Mb'), (0.000000001, 'Gb'), (0.000000000001, 'Tb')) -def gen_env(global_interpreter: bool, lang: str = DEFAULT_LANG) -> dict: +def gen_env(global_interpreter: bool, lang: str = DEFAULT_LANG, extra_paths: Set[str] = None) -> dict: res = {} if lang: @@ -36,6 +36,9 @@ def gen_env(global_interpreter: bool, lang: str = DEFAULT_LANG) -> dict: else: res['PATH'] = PATH + if extra_paths: + res['PATH'] += ':' + ':'.join(extra_paths) + return res @@ -60,8 +63,9 @@ 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, root_password: str = None): + 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, + extra_paths: Set[str] = None): pwdin, final_cmd = None, [] if root_password is not None: @@ -70,17 +74,17 @@ class SimpleProcess: final_cmd.extend(cmd) - self.instance = self._new(final_cmd, cwd, global_interpreter, lang, stdin=pwdin) + self.instance = self._new(final_cmd, cwd, global_interpreter, lang, stdin=pwdin, extra_paths=extra_paths) self.expected_code = expected_code - def _new(self, cmd: List[str], cwd: str, global_interpreter: bool, lang: str, stdin = None) -> subprocess.Popen: + def _new(self, cmd: List[str], cwd: str, global_interpreter: bool, lang: str, stdin = None, extra_paths: Set[str] = None) -> subprocess.Popen: args = { "stdout": subprocess.PIPE, "stderr": subprocess.STDOUT, "bufsize": -1, "cwd": cwd, - "env": gen_env(global_interpreter, lang) + "env": gen_env(global_interpreter, lang, extra_paths=extra_paths) } if stdin: @@ -166,7 +170,7 @@ class ProcessHandler: def run_cmd(cmd: str, expected_code: int = 0, ignore_return_code: bool = False, print_error: bool = True, - cwd: str = '.', global_interpreter: bool = USE_GLOBAL_INTERPRETER) -> str: + cwd: str = '.', global_interpreter: bool = USE_GLOBAL_INTERPRETER, extra_paths: Set[str] = None) -> str: """ runs a given command and returns its default output :param cmd: @@ -179,7 +183,7 @@ def run_cmd(cmd: str, expected_code: int = 0, ignore_return_code: bool = False, args = { "shell": True, "stdout": PIPE, - "env": gen_env(global_interpreter), + "env": gen_env(global_interpreter, extra_paths=extra_paths), 'cwd': cwd } diff --git a/bauh/gems/web/__init__.py b/bauh/gems/web/__init__.py index 58c753e7..b801d238 100644 --- a/bauh/gems/web/__init__.py +++ b/bauh/gems/web/__init__.py @@ -6,6 +6,7 @@ ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) BIN_PATH = '{}/.local/share/bauh/web'.format(HOME_PATH) INSTALLED_PATH = '{}/installed'.format(BIN_PATH) NODE_DIR_PATH = '{}/node'.format(BIN_PATH) +NODE_PATHS = {NODE_DIR_PATH + '/bin'} NODE_BIN_PATH = '{}/bin/node'.format(NODE_DIR_PATH) NPM_BIN_PATH = '{}/bin/npm'.format(NODE_DIR_PATH) NODE_MODULES_PATH = '{}/node_modules'.format(BIN_PATH) diff --git a/bauh/gems/web/environment.py b/bauh/gems/web/environment.py index 3fbc7f6f..b94ba65b 100644 --- a/bauh/gems/web/environment.py +++ b/bauh/gems/web/environment.py @@ -13,8 +13,8 @@ from bauh.api.http import HttpClient from bauh.commons import system from bauh.commons.html import bold from bauh.commons.system import SimpleProcess, ProcessHandler, run_cmd -from bauh.gems.web import BIN_PATH, NODE_DIR_PATH, NODE_BIN_PATH, NPM_BIN_PATH, NODE_MODULES_PATH, NATIVEFIER_BIN_PATH, \ - ELECTRON_PATH, ELECTRON_DOWNLOAD_URL, ELECTRON_SHA256_URL, URL_ENVIRONMENT_SETTINGS +from bauh.gems.web import BIN_PATH, NODE_DIR_PATH, NODE_BIN_PATH, NODE_MODULES_PATH, NATIVEFIER_BIN_PATH, \ + ELECTRON_PATH, ELECTRON_DOWNLOAD_URL, ELECTRON_SHA256_URL, URL_ENVIRONMENT_SETTINGS, NPM_BIN_PATH, NODE_PATHS from bauh.view.util.translation import I18n @@ -92,10 +92,15 @@ class EnvironmentUpdater: if handler and handler.watcher: handler.watcher.change_substatus(self.i18n['web.environment.install'].format(bold('nativefier'))) - proc = SimpleProcess([NPM_BIN_PATH, 'install', 'nativefier@{}'.format(version)], cwd=BIN_PATH) + proc = SimpleProcess([NPM_BIN_PATH, 'install', 'nativefier@{}'.format(version)], cwd=BIN_PATH, extra_paths=NODE_PATHS) if handler: - return handler.handle_simple(proc)[0] + installed = handler.handle_simple(proc)[0] + + if installed: + self.logger.info("nativifier {} successfully installed".format(version)) + + return installed else: proc.instance.wait() @@ -104,6 +109,10 @@ class EnvironmentUpdater: return True else: self.logger.error("Could not install nativefier {}".format(version)) + for err in proc.instance.stdout: + if err: + print(err.decode()) + return False def _is_nativefier_installed(self) -> bool: @@ -125,7 +134,7 @@ class EnvironmentUpdater: if not self._is_nativefier_installed(): return self._install_nativefier(version=version, handler=handler) - installed_version = run_cmd('{} --version'.format(NATIVEFIER_BIN_PATH), print_error=False) + installed_version = run_cmd('{} --version'.format(NATIVEFIER_BIN_PATH), print_error=False, extra_paths=NODE_PATHS) if installed_version: installed_version = installed_version.strip() diff --git a/bauh/gems/web/nativefier.py b/bauh/gems/web/nativefier.py index a006c3de..737d1a45 100644 --- a/bauh/gems/web/nativefier.py +++ b/bauh/gems/web/nativefier.py @@ -1,7 +1,7 @@ from typing import List from bauh.commons.system import SimpleProcess -from bauh.gems.web import NATIVEFIER_BIN_PATH +from bauh.gems.web import NATIVEFIER_BIN_PATH, NODE_PATHS def install(url: str, name: str, output_dir: str, electron_version: str, cwd: str, extra_options: List[str] = None) -> SimpleProcess: @@ -10,4 +10,4 @@ def install(url: str, name: str, output_dir: str, electron_version: str, cwd: st if extra_options: cmd.extend(extra_options) - return SimpleProcess(cmd, cwd=cwd) + return SimpleProcess(cmd, cwd=cwd, extra_paths=NODE_PATHS)