diff --git a/bauh/gems/web/__init__.py b/bauh/gems/web/__init__.py index e74837f1..8274253a 100644 --- a/bauh/gems/web/__init__.py +++ b/bauh/gems/web/__init__.py @@ -1,7 +1,7 @@ import os from pathlib import Path -from bauh.api.constants import HOME_PATH, DESKTOP_ENTRIES_DIR +from bauh.api.constants import HOME_PATH, DESKTOP_ENTRIES_DIR, CONFIG_PATH ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) WEB_PATH = '{}/.local/share/bauh/web'.format(Path.home()) @@ -24,4 +24,4 @@ UA_CHROME = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gec TEMP_PATH = '/tmp/bauh/web' SEARCH_INDEX_FILE = '{}/index.yaml'.format(TEMP_PATH) SUGGESTIONS_CACHE_FILE = '{}/suggestions.yaml'.format(TEMP_PATH) -CONFIG_FILE = '{}/.config/bauh/web/config.yaml'.format(Path.home()) +CONFIG_FILE = '{}/web.yaml'.format(CONFIG_PATH) diff --git a/bauh/gems/web/config.py b/bauh/gems/web/config.py new file mode 100644 index 00000000..7f154282 --- /dev/null +++ b/bauh/gems/web/config.py @@ -0,0 +1,22 @@ +import os +from pathlib import Path + +import yaml + +from bauh.api.constants import CONFIG_PATH +from bauh.gems.web import CONFIG_FILE + + +def read_config() -> dict: + if not os.path.exists(CONFIG_FILE): + config = {'environment': {'system': False}} + + Path(CONFIG_PATH).mkdir(parents=True, exist_ok=True) + + with open(CONFIG_FILE, 'w+') as f: + f.write(yaml.dump(config)) + else: + with open(CONFIG_FILE) as f: + config = yaml.safe_load(f.read()) + + return config diff --git a/bauh/gems/web/controller.py b/bauh/gems/web/controller.py index ebb9e0c0..be39ec7d 100644 --- a/bauh/gems/web/controller.py +++ b/bauh/gems/web/controller.py @@ -26,6 +26,7 @@ from bauh.commons.html import bold from bauh.commons.system import ProcessHandler, get_dir_size, get_human_size_str from bauh.gems.web import INSTALLED_PATH, nativefier, DESKTOP_ENTRY_PATH_PATTERN, URL_FIX_PATTERN, ENV_PATH, UA_CHROME, \ SEARCH_INDEX_FILE, SUGGESTIONS_CACHE_FILE +from bauh.gems.web.config import read_config from bauh.gems.web.environment import EnvironmentUpdater from bauh.gems.web.model import WebApplication from bauh.gems.web.worker import SuggestionsDownloader, SearchIndexGenerator @@ -62,7 +63,6 @@ class WebApplicationManager(SoftwareManager): self.env_thread = None self.suggestions_downloader = suggestions_downloader self.suggestions = {} - self.config = {} def _get_lang_header(self) -> str: try: @@ -143,9 +143,8 @@ class WebApplicationManager(SoftwareManager): super(WebApplicationManager, self).serialize_to_disk(pkg=pkg, icon_bytes=None, only_icon=False) def _map_url(self, url: str) -> "BeautifulSoup": - url_res = self.http_client.get(url, - headers={'Accept-language': self._get_lang_header(), 'User-Agent': UA_CHROME}, - ignore_ssl=True, single_call=True) + headers = {'Accept-language': self._get_lang_header(), 'User-Agent': UA_CHROME} + url_res = self.http_client.get(url, headers=headers, ignore_ssl=True, single_call=True) if url_res: return BeautifulSoup(url_res.text, 'lxml', parse_only=SoupStrainer('head')) @@ -481,9 +480,18 @@ class WebApplicationManager(SoftwareManager): watcher.print('Fix found for {}'.format(pkg.url)) install_options.append('--inject={}'.format(fix_path)) + config = read_config() + watcher.change_substatus(self.i18n['web.install.substatus.call_nativefier'].format(bold('nativefier'))) + + system_env = config['environment'].get('system', False) + + if system_env: + self.logger.warning("Using system's nativefier to install {}".format(pkg.url)) + installed = handler.handle_simple(nativefier.install(url=pkg.url, name=app_id, output_dir=app_dir, electron_version=self.env_settings['electron']['version'], + system=system_env, cwd=INSTALLED_PATH, extra_options=install_options)) @@ -565,7 +573,16 @@ class WebApplicationManager(SoftwareManager): self.enabled = enabled def can_work(self) -> bool: - return BS4_AVAILABLE and LXML_AVAILABLE + if BS4_AVAILABLE and LXML_AVAILABLE: + config = read_config() + use_system_env = config['environment']['system'] + + if not use_system_env: + return True + + return nativefier.is_available() + + return False def requires_root(self, action: str, pkg: SoftwarePackage): return False diff --git a/bauh/gems/web/environment.py b/bauh/gems/web/environment.py index 4b025aed..93bcb34a 100644 --- a/bauh/gems/web/environment.py +++ b/bauh/gems/web/environment.py @@ -12,9 +12,11 @@ from bauh.api.abstract.handler import ProcessWatcher 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.commons.system import SimpleProcess, ProcessHandler from bauh.gems.web import ENV_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 + ELECTRON_PATH, ELECTRON_DOWNLOAD_URL, ELECTRON_SHA256_URL, URL_ENVIRONMENT_SETTINGS, NPM_BIN_PATH, NODE_PATHS, \ + nativefier +from bauh.gems.web.config import read_config from bauh.view.util.translation import I18n @@ -134,7 +136,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, extra_paths=NODE_PATHS) + installed_version = nativefier.get_version() if installed_version: installed_version = installed_version.strip() @@ -215,19 +217,22 @@ class EnvironmentUpdater: except requests.exceptions.ConnectionError: return - def update_environment(self, is_x86_x64_arch: bool, handler: ProcessHandler = None) -> dict: + def update_environment(self, is_x86_x64_arch: bool, config: dict = None, handler: ProcessHandler = None) -> dict: settings = self.read_settings() if settings is None: return - if not self.update_node(version=settings['nodejs']['version'], version_url=settings['nodejs']['url'], - watcher=handler.watcher if handler else None): + current_config = config if config else read_config() + system_env = current_config['environment']['system'] + + if not system_env and not self.update_node(version=settings['nodejs']['version'], version_url=settings['nodejs']['url'], + watcher=handler.watcher if handler else None): self.logger.warning('Could not install / update NodeJS') return - if not self.install_nativefier(version=settings['nativefier']['version'], handler=handler): + if not system_env and not self.install_nativefier(version=settings['nativefier']['version'], handler=handler): self.logger.warning('Could not install / update nativefier') return diff --git a/bauh/gems/web/nativefier.py b/bauh/gems/web/nativefier.py index 737d1a45..ddffd522 100644 --- a/bauh/gems/web/nativefier.py +++ b/bauh/gems/web/nativefier.py @@ -1,13 +1,24 @@ from typing import List -from bauh.commons.system import SimpleProcess +from bauh.commons.system import SimpleProcess, run_cmd 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: - cmd = [NATIVEFIER_BIN_PATH, url, '--name', name, '-e', electron_version, output_dir] +def install(url: str, name: str, output_dir: str, electron_version: str, cwd: str, system: bool, extra_options: List[str] = None) -> SimpleProcess: + cmd = [NATIVEFIER_BIN_PATH if not system else 'nativefier', url, '--name', name, '-e', electron_version, output_dir] if extra_options: cmd.extend(extra_options) - return SimpleProcess(cmd, cwd=cwd, extra_paths=NODE_PATHS) + return SimpleProcess(cmd, cwd=cwd, extra_paths=NODE_PATHS if not system else None) + + +def is_available() -> bool: + res = run_cmd('which nativefier', print_error=False) + return res and not res.strip().startswith('which ') + + +def get_version() -> str: + return run_cmd('{} --version'.format(NATIVEFIER_BIN_PATH), print_error=False, extra_paths=NODE_PATHS) + +