Esempio n. 1
0
    def save_settings(self,
                      component: PanelComponent) -> Tuple[bool, List[str]]:
        config = read_config()

        form_env = component.components[0]

        config['environment']['electron']['version'] = str(
            form_env.get_component('electron_version').get_value()).strip()

        if len(config['environment']['electron']['version']) == 0:
            config['environment']['electron']['version'] = None

        system_nativefier = form_env.get_component('nativefier').get_selected()

        if system_nativefier and not nativefier.is_available():
            return False, [
                self.i18n['web.settings.env.nativefier.system.not_installed'].
                format('Nativefier')
            ]

        config['environment']['system'] = system_nativefier

        try:
            save_config(config, CONFIG_FILE)
            return True, None
        except:
            return False, [traceback.format_exc()]
Esempio n. 2
0
    def can_work(self) -> bool:
        if BS4_AVAILABLE and LXML_AVAILABLE:
            config = read_config(update_file=True)
            use_system_env = config['environment']['system']

            if not use_system_env:
                return True

            return nativefier.is_available()

        return False
Esempio n. 3
0
    def get_settings(self, screen_width: int,
                     screen_height: int) -> ViewComponent:
        config = read_config()
        max_width = floor(screen_width * 0.15)

        input_electron = TextInputComponent(
            label=self.i18n['web.settings.electron.version.label'],
            value=config['environment']['electron']['version'],
            tooltip=self.i18n['web.settings.electron.version.tooltip'],
            placeholder='{}: 7.1.0'.format(self.i18n['example.short']),
            max_width=max_width,
            id_='electron_version')

        native_opts = [
            InputOption(
                label=self.i18n['web.settings.nativefier.env'].capitalize(),
                value=False,
                tooltip=self.i18n['web.settings.nativefier.env.tooltip'].
                format(app=self.context.app_name)),
            InputOption(
                label=self.i18n['web.settings.nativefier.system'].capitalize(),
                value=True,
                tooltip=self.i18n['web.settings.nativefier.system.tooltip'])
        ]

        select_nativefier = SingleSelectComponent(
            label="Nativefier",
            options=native_opts,
            default_option=[
                o for o in native_opts
                if o.value == config['environment']['system']
            ][0],
            type_=SelectViewType.COMBO,
            tooltip=self.i18n['web.settings.nativefier.tip'],
            max_width=max_width,
            id_='nativefier')

        form_env = FormComponent(
            label=self.i18n['web.settings.nativefier.env'].capitalize(),
            components=[input_electron, select_nativefier])

        return PanelComponent([form_env])
Esempio n. 4
0
    def install(self, pkg: WebApplication, root_password: str,
                watcher: ProcessWatcher) -> bool:

        continue_install, install_options = self._ask_install_options(
            pkg, watcher)

        if not continue_install:
            watcher.print("Installation aborted by the user")
            return False

        watcher.change_substatus(self.i18n['web.env.checking'])
        handler = ProcessHandler(watcher)

        env_settings = self.env_updater.read_settings()
        local_config = read_config()

        if local_config['environment'][
                'system'] and not nativefier.is_available():
            watcher.show_message(
                title=self.i18n['error'].capitalize(),
                body=self.i18n['web.install.global_nativefier.unavailable'].
                format(n=bold('Nativefier'), app=bold(pkg.name)) + '.',
                type_=MessageType.ERROR)
            return False

        env_components = self.env_updater.check_environment(
            app=pkg,
            local_config=local_config,
            env=env_settings,
            is_x86_x64_arch=self.context.is_system_x86_64())

        comps_to_update = [c for c in env_components if c.update]

        if comps_to_update and not self._ask_update_permission(
                comps_to_update, watcher):
            return False

        if not self.env_updater.update(components=comps_to_update,
                                       handler=handler):
            watcher.show_message(title=self.i18n['error'],
                                 body=self.i18n['web.env.error'].format(
                                     bold(pkg.name)),
                                 type_=MessageType.ERROR)
            return False

        Path(INSTALLED_PATH).mkdir(parents=True, exist_ok=True)

        app_id, treated_name = self._gen_app_id(pkg.name)
        pkg.id = app_id
        app_dir = '{}/{}'.format(INSTALLED_PATH, app_id)

        watcher.change_substatus(
            self.i18n['web.install.substatus.checking_fixes'])
        fix = self._get_fix_for(
            url_no_protocol=self._strip_url_protocol(pkg.url))
        fix_path = '{}/fix.js'.format(app_dir)

        if fix:
            # just adding the fix as an installation option. The file will be written later
            self.logger.info('Fix found for {}'.format(pkg.url))
            watcher.print('Fix found for {}'.format(pkg.url))
            install_options.append('--inject={}'.format(fix_path))

        # if a custom icon is defined for an app suggestion:
        icon_path, icon_bytes = None, None
        if pkg.icon_url and pkg.save_icon and not {
                o
                for o in install_options if o.startswith('--icon')
        }:
            download = self._download_suggestion_icon(pkg, app_dir)

            if download and download[1]:
                icon_path, icon_bytes = download[0], download[1]
                pkg.custom_icon = icon_path

                # writting the icon in a temporary folder to be used by the nativefier process
                temp_icon_path = '{}/{}'.format(TEMP_PATH,
                                                pkg.icon_url.split('/')[-1])
                install_options.append('--icon={}'.format(temp_icon_path))

                self.logger.info("Writing a temp suggestion icon at {}".format(
                    temp_icon_path))
                with open(temp_icon_path, 'wb+') as f:
                    f.write(icon_bytes)

        watcher.change_substatus(
            self.i18n['web.install.substatus.call_nativefier'].format(
                bold('nativefier')))

        electron_version = str(
            next((c for c in env_components if c.id == 'electron')).version)
        installed = handler.handle_simple(
            nativefier.install(url=pkg.url,
                               name=app_id,
                               output_dir=app_dir,
                               electron_version=electron_version,
                               system=bool(
                                   local_config['environment']['system']),
                               cwd=INSTALLED_PATH,
                               extra_options=install_options))

        if not installed:
            msg = '{}.{}.'.format(
                self.i18n['wen.install.error'].format(bold(pkg.name)),
                self.i18n['web.install.nativefier.error.unknown'].format(
                    bold(self.i18n['details'].capitalize())))
            watcher.show_message(title=self.i18n['error'],
                                 body=msg,
                                 type_=MessageType.ERROR)
            return False

        inner_dir = os.listdir(app_dir)

        if not inner_dir:
            msg = '{}.{}.'.format(
                self.i18n['wen.install.error'].format(bold(pkg.name)),
                self.i18n['web.install.nativefier.error.inner_dir'].format(
                    bold(app_dir)))
            watcher.show_message(title=self.i18n['error'],
                                 body=msg,
                                 type_=MessageType.ERROR)
            return False

        # bringing the inner app folder to the 'installed' folder level:
        inner_dir = '{}/{}'.format(app_dir, inner_dir[0])
        temp_dir = '{}/tmp_{}'.format(INSTALLED_PATH, treated_name)
        os.rename(inner_dir, temp_dir)
        shutil.rmtree(app_dir)
        os.rename(temp_dir, app_dir)

        # injecting a fix
        if fix:
            self.logger.info('Writting JS fix at {}'.format(fix_path))
            with open(fix_path, 'w+') as f:
                f.write(fix)

        # persisting the custom suggestion icon in the defitive directory
        if icon_bytes:
            self.logger.info(
                "Writting the final custom suggestion icon at {}".format(
                    icon_path))
            with open(icon_path, 'wb+') as f:
                f.write(icon_bytes)

        pkg.installation_dir = app_dir

        version_path = '{}/version'.format(app_dir)

        if os.path.exists(version_path):
            with open(version_path, 'r') as f:
                pkg.version = f.read().strip()
                pkg.latest_version = pkg.version

        watcher.change_substatus(self.i18n['web.install.substatus.shortcut'])

        desktop_entry_path = self._gen_desktop_entry_path(app_id)

        entry_content = self._gen_desktop_entry_content(pkg)

        Path(DESKTOP_ENTRIES_DIR).mkdir(parents=True, exist_ok=True)

        with open(desktop_entry_path, 'w+') as f:
            f.write(entry_content)

        pkg.desktop_entry = desktop_entry_path

        if '--tray=start-in-tray' in install_options:
            autostart_dir = '{}/.config/autostart'.format(Path.home())
            Path(autostart_dir).mkdir(parents=True, exist_ok=True)

            with open(pkg.get_autostart_path(), 'w+') as f:
                f.write(entry_content)

        if install_options:
            pkg.options_set = install_options

        return True
Esempio n. 5
0
 def _fill_config_async(self, output: dict):
     output.update(read_config())