pre-downloading electron files during bauh initialization

This commit is contained in:
Vinícius Moreira
2019-12-10 16:26:47 -03:00
parent 7a97ef8531
commit d4c8d67433
4 changed files with 82 additions and 8 deletions

View File

@@ -9,4 +9,7 @@ NODE_BIN_PATH = '{}/bin/node'.format(NODE_DIR_PATH)
NPM_BIN_PATH = '{}/bin/npm'.format(NODE_DIR_PATH) NPM_BIN_PATH = '{}/bin/npm'.format(NODE_DIR_PATH)
NODE_MODULES_PATH = '{}/node_modules'.format(BIN_PATH) NODE_MODULES_PATH = '{}/node_modules'.format(BIN_PATH)
NATIVEFIER_BIN_PATH = '{}/.bin/nativefier'.format(NODE_MODULES_PATH) NATIVEFIER_BIN_PATH = '{}/.bin/nativefier'.format(NODE_MODULES_PATH)
ELECTRON_PATH = '{}/.cache/electron'.format(HOME_PATH)
ELECTRON_DOWNLOAD_URL = 'https://github.com/electron/electron/releases/download/v{version}/electron-v{version}-linux-{arch}.zip'
ELECTRON_SHA256_URL = 'https://github.com/electron/electron/releases/download/v{version}/SHASUMS256.txt'
ELECTRON_VERSION = '0.5.12'

View File

@@ -96,9 +96,12 @@ class WebApplicationManager(SoftwareManager):
def requires_root(self, action: str, pkg: SoftwarePackage): def requires_root(self, action: str, pkg: SoftwarePackage):
return False return False
def _update_environment(self):
self.node_updater.update_environment(self.context.is_system_x86_64())
def prepare(self): def prepare(self):
if bool(int(os.getenv('BAUH_WEB_UPDATE_NODE', 1))): if bool(int(os.getenv('BAUH_WEB_UPDATE_NODE', 1))):
Thread(daemon=True, target=self.node_updater.update_environment).start() Thread(daemon=True, target=self._update_environment).start()
def list_updates(self, internet_available: bool) -> List[PackageUpdate]: def list_updates(self, internet_available: bool) -> List[PackageUpdate]:
pass pass

View File

@@ -9,8 +9,9 @@ from bauh.api.abstract.download import FileDownloader
from bauh.api.abstract.handler import ProcessWatcher from bauh.api.abstract.handler import ProcessWatcher
from bauh.api.exception import NoInternetException from bauh.api.exception import NoInternetException
from bauh.commons import system from bauh.commons import system
from bauh.commons.system import new_subprocess, SimpleProcess, ProcessHandler 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 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, ELECTRON_VERSION
from bauh.view.util.translation import I18n from bauh.view.util.translation import I18n
@@ -135,8 +136,75 @@ class NodeUpdater:
self.logger.info("Nativefier is already installed") self.logger.info("Nativefier is already installed")
return True return True
def update_environment(self, handler: ProcessHandler = None): def _download_electron(self, version: str, is_x86_x64_arch: bool, watcher: ProcessWatcher) -> bool:
if not self.update_node(handler.watcher if handler else None): self.logger.info("Downloading Electron {}".format(version))
arch = 'ia32' if not is_x86_x64_arch else 'x64'
Path(ELECTRON_PATH).mkdir(parents=True, exist_ok=True)
electron_url = ELECTRON_DOWNLOAD_URL.format(arch=arch, version=version)
electron_path = '{}/{}'.format(ELECTRON_PATH, electron_url.split('/')[-1])
return self.file_downloader.download(file_url=electron_url, watcher=watcher, output_path=electron_path,cwd=ELECTRON_PATH)
def _download_electron_sha256(self, version: str, watcher: ProcessWatcher) -> bool:
self.logger.info("Downloading Electron {} sha526".format(version))
Path(ELECTRON_PATH).mkdir(parents=True, exist_ok=True)
sha256_url = ELECTRON_SHA256_URL.format(version=version)
sha256_path = '{}/{}'.format(ELECTRON_PATH, sha256_url.split('/')[-1])
return self.file_downloader.download(file_url=sha256_url, watcher=watcher, output_path=sha256_path, cwd=ELECTRON_PATH)
def install_electron(self, version: str, is_x86_x64_arch: bool, watcher: ProcessWatcher) -> bool:
self.logger.info("Checking installed Electron")
if not os.path.exists(ELECTRON_PATH):
self.logger.info("Electron is not installed")
self._download_electron(version=version, is_x86_x64_arch=is_x86_x64_arch, watcher=watcher)
else:
files = run_cmd('ls', print_error=False, cwd=ELECTRON_PATH)
if files:
file_list = files.split('\n')
file_name = ELECTRON_DOWNLOAD_URL.format(version=version, arch='x64' if is_x86_x64_arch else 'ia32').split('/')[-1]
electron_file = [f for f in file_list if f == file_name]
if electron_file:
self.logger.info("Electron {} already downloaded".format(version))
else:
if not self._download_electron(version=version, is_x86_x64_arch=is_x86_x64_arch, watcher=watcher):
return False
file_name = ELECTRON_SHA256_URL.split('/')[-1]
sha256_file = [f for f in file_list if f == file_name]
if sha256_file:
self.logger.info("Electron {} sha256 already downloaded".format(version))
return True
else:
return self._download_electron_sha256(version=version, watcher=watcher)
self.logger.info('No Electron file found')
if self._download_electron(version=version, is_x86_x64_arch=is_x86_x64_arch, watcher=watcher):
return self._download_electron_sha256(version=version, watcher=watcher)
return False return False
return self.install_nativefier(handler=handler) def update_environment(self, is_x86_x64_arch: bool, handler: ProcessHandler = None):
if not self.update_node(handler.watcher if handler else None):
self.logger.warning('Could not update the environment')
return False
if not self.install_nativefier(handler=handler):
self.logger.warning('Could not update the environment')
return False
res = self.install_electron(version=ELECTRON_VERSION, is_x86_x64_arch=is_x86_x64_arch, watcher=handler.watcher if handler else None)
if res:
self.logger.info('Environment updated')
else:
self.logger.warning('Could not update the environment')
return res

View File

@@ -65,7 +65,7 @@ class AdaptableFileDownloader(FileDownloader):
self.logger.info('Removing downloaded file {}'.format(to_delete)) self.logger.info('Removing downloaded file {}'.format(to_delete))
os.remove(to_delete) os.remove(to_delete)
def download(self, file_url: str, watcher: ProcessWatcher, output_path: str, cwd: str) -> bool: def download(self, file_url: str, watcher: ProcessWatcher, output_path: str = None, cwd: str = None) -> bool:
self.logger.info('Downloading {}'.format(file_url)) self.logger.info('Downloading {}'.format(file_url))
handler = ProcessHandler(watcher) handler = ProcessHandler(watcher)
file_name = file_url.split('/')[-1] file_name = file_url.split('/')[-1]