Exemple #1
0
 def register_task(self, taskman: Optional[TaskManager]):
     self._taskman = taskman
     if taskman:
         self._taskman.register_task(
             id_=self.task_id,
             label=self.i18n['task.download_suggestions'],
             icon_path=get_icon_path())
Exemple #2
0
    def run(self):
        self.taskman.register_task(self.task_id, self.i18n['arch.task.mirrors'], get_icon_path())
        self.logger.info("Refreshing mirrors")

        handler = ProcessHandler()
        try:
            self.taskman.update_progress(self.task_id, 10, '')
            success, output = handler.handle_simple(pacman.refresh_mirrors(self.root_password), output_handler=self._notify_output)

            if success:

                if self.sort_limit is not None and self.sort_limit >= 0:
                    self.taskman.update_progress(self.task_id, 50, self.i18n['arch.custom_action.refresh_mirrors.status.updating'])
                    try:
                        handler.handle_simple(pacman.sort_fastest_mirrors(self.root_password, self.sort_limit), output_handler=self._notify_output)
                    except:
                        self.logger.error("Could not sort mirrors by speed")
                        traceback.print_exc()

                mirrors.register_sync(self.logger)
            else:
                self.logger.error("It was not possible to refresh mirrors")
        except:
            self.logger.error("It was not possible to refresh mirrors")
            traceback.print_exc()

        self.taskman.update_progress(self.task_id, 100, None)
        self.taskman.finish_task(self.task_id)
        self.logger.info("Finished")
Exemple #3
0
    def run(self):
        if not any([self.aur, self.repositories]):
            return

        ti = time.time()
        self.task_man.register_task(self.task_id, self.i18n['arch.task.disk_cache'], get_icon_path())

        self.logger.info('Pre-caching installed Arch packages data to disk')

        installed = self.controller.read_installed(disk_loader=None, internet_available=self.internet_available,
                                                   only_apps=False, pkg_types=None, limit=-1).installed

        self.task_man.update_progress(self.task_id, 0, self.i18n['arch.task.disk_cache.reading'])

        saved = 0
        pkgs = {p.name: p for p in installed if ((self.aur and p.repository == 'aur') or (self.repositories and p.repository != 'aur')) and not os.path.exists(p.get_disk_cache_path())}

        self.to_index = len(pkgs)
        self.progress = self.to_index * 2
        self.update_prepared(None, add=False)

        saved += disk.save_several(pkgs, when_prepared=self.update_prepared, after_written=self.update_indexed)
        self.task_man.update_progress(self.task_id, 100, None)
        self.task_man.finish_task(self.task_id)

        tf = time.time()
        time_msg = 'Took {0:.2f} seconds'.format(tf - ti)
        self.logger.info('Pre-cached data of {} Arch packages to the disk. {}'.format(saved, time_msg))
Exemple #4
0
def request_providers(providers_map: Dict[str, Set[str]], repo_map: Dict[str, str], watcher: ProcessWatcher, i18n: I18n) -> Set[str]:
    msg = "<p>{}.</p><p>{}.</p>".format(i18n['arch.dialog.providers.line1'],
                                        i18n['arch.dialog.providers.line2'])

    repo_icon_path = get_repo_icon_path()
    aur_icon_path = get_icon_path()

    form = FormComponent([], label='')

    for dep, providers in providers_map.items():
        opts = []

        providers_list = [*providers]
        providers_list.sort()

        for p in providers_list:
            repo = repo_map.get(p, 'aur')
            opts.append(InputOption(label=p,
                                    value=p,
                                    icon_path=aur_icon_path if repo == 'aur' else repo_icon_path,
                                    tooltip='{}: {}'.format(i18n['repository'].capitalize(), repo)))

        form.components.append(SingleSelectComponent(label=bold(dep.lower()),
                                                     options=opts,
                                                     default_option=opts[0],
                                                     type_=SelectViewType.COMBO,
                                                     max_per_line=1))

    if watcher.request_confirmation(title=i18n['arch.providers'].capitalize(),
                                    body=msg,
                                    components=[form],
                                    confirmation_label=i18n['proceed'].capitalize(),
                                    deny_label=i18n['cancel'].capitalize()):

        return {s.get_selected() for s in form.components}
Exemple #5
0
    def run(self) -> None:
        self.logger.info("Synchronizing databases")
        self.taskman.register_task(self.task_id,
                                   self.i18n['arch.sync_databases.substatus'],
                                   get_icon_path())

        if self.refresh_mirrors and self.refresh_mirrors.is_alive():
            self.taskman.update_progress(
                self.task_id, 0, self.i18n['arch.task.sync_databases.waiting'])
            self.refresh_mirrors.join()

        progress = 10
        dbs = pacman.get_databases()
        self.taskman.update_progress(self.task_id, progress, None)

        if dbs:
            inc = 90 / len(dbs)
            try:
                p = new_root_subprocess(['pacman', '-Syy'], self.root_password)

                dbs_read, last_db = 0, None

                for o in p.stdout:
                    line = o.decode().strip()

                    if line and line.startswith('downloading'):
                        db = line.split(' ')[1].strip()

                        if last_db is None or last_db != db:
                            last_db = db
                            dbs_read += 1
                            progress = dbs_read * inc
                        else:
                            progress += 0.25

                        self.taskman.update_progress(
                            self.task_id, progress,
                            self.i18n['arch.task.sync_sb.status'].format(db))

                for o in p.stderr:
                    o.decode()

                p.wait()

                if p.returncode == 0:
                    database.register_sync(self.logger)
                else:
                    self.logger.error("Could not synchronize database")

            except:
                self.logger.info("Error while synchronizing databases")
                traceback.print_exc()

        self.taskman.update_progress(self.task_id, 100, None)
        self.taskman.finish_task(self.task_id)
        self.logger.info("Finished")
Exemple #6
0
 def __init__(self, taskman: TaskManager, root_password: str, i18n: I18n,
              logger: logging.Logger, create_config: CreateConfigFile):
     super(RefreshMirrors, self).__init__(daemon=True)
     self.taskman = taskman
     self.i18n = i18n
     self.logger = logger
     self.root_password = root_password
     self.task_id = "arch_mirrors"
     self.create_config = create_config
     self.refreshed = False
     self.task_name = self.i18n['arch.task.mirrors']
     self.taskman.register_task(self.task_id, self.task_name,
                                get_icon_path())
Exemple #7
0
    def run(self):
        if not any([self.aur, self.repositories]):
            return

        ti = time.time()
        self.task_man.register_task(self.task_id, self.i18n['arch.task.disk_cache'], get_icon_path())

        self.task_man.update_progress(self.task_id, 1, '')

        self.logger.info("Checking already cached package data")

        cache_dirs = [fpath for fpath in glob.glob('{}/*'.format(self.installed_cache_dir)) if os.path.isdir(fpath)]

        not_cached_names = None

        if cache_dirs:  # if there are cache data
            installed_names = pacman.list_installed_names()
            cached_pkgs = {cache_dir.split('/')[-1] for cache_dir in cache_dirs}

            not_cached_names = installed_names.difference(cached_pkgs)
            if not not_cached_names:
                self.task_man.update_progress(self.task_id, 100, '')
                self.task_man.finish_task(self.task_id)
                tf = time.time()
                time_msg = '{0:.2f} seconds'.format(tf - ti)
                self.logger.info('Finished: no package data to cache ({})'.format(time_msg))
                return

        self.logger.info('Pre-caching installed Arch packages data to disk')

        installed = self.controller.read_installed(disk_loader=None, internet_available=self.internet_available,
                                                   only_apps=False, pkg_types=None, limit=-1, names=not_cached_names,
                                                   wait_disk_cache=False).installed

        self.task_man.update_progress(self.task_id, 0, self.i18n['arch.task.disk_cache.reading'])

        saved = 0
        pkgs = {p.name: p for p in installed if ((self.aur and p.repository == 'aur') or (self.repositories and p.repository != 'aur')) and not os.path.exists(p.get_disk_cache_path())}

        self.to_index = len(pkgs)
        self.progress = self.to_index * 2
        self.update_prepared(None, add=False)

        # overwrite == True because the verification already happened
        saved += disk.save_several(pkgs, when_prepared=self.update_prepared, after_written=self.update_indexed, overwrite=True)
        self.task_man.update_progress(self.task_id, 100, None)
        self.task_man.finish_task(self.task_id)

        tf = time.time()
        time_msg = '{0:.2f} seconds'.format(tf - ti)
        self.logger.info('Finished: pre-cached data of {} Arch packages to the disk ({})'.format(saved, time_msg))
Exemple #8
0
    def run(self):
        if not any([self.aur, self.repositories]):
            return

        ti = time.time()
        self.task_man.register_task(self.task_id,
                                    self.i18n['arch.task.disk_cache'],
                                    get_icon_path())

        self.logger.info('Pre-caching installed Arch packages data to disk')
        installed = pacman.map_installed(repositories=self.repositories,
                                         aur=self.aur)

        self.task_man.update_progress(
            self.task_id, 0, self.i18n['arch.task.disk_cache.reading'])
        for k in ('signed', 'not_signed'):
            installed[k] = {
                p
                for p in installed[k]
                if not os.path.exists(ArchPackage.disk_cache_path(p))
            }

        saved = 0
        pkgs = {*installed['signed'], *installed['not_signed']}

        repo_map = {}

        if installed['not_signed']:
            repo_map.update({p: 'aur' for p in installed['not_signed']})

        if installed['signed']:
            repo_map.update(pacman.map_repositories(installed['signed']))

        self.to_index = len(pkgs)
        self.progress = self.to_index * 2
        self.update_prepared(None, add=False)

        saved += disk.save_several(pkgs,
                                   repo_map,
                                   when_prepared=self.update_prepared,
                                   after_written=self.update_indexed)
        self.task_man.update_progress(self.task_id, 100, None)
        self.task_man.finish_task(self.task_id)

        tf = time.time()
        time_msg = 'Took {0:.2f} seconds'.format(tf - ti)
        self.logger.info(
            'Pre-cached data of {} Arch packages to the disk. {}'.format(
                saved, time_msg))
Exemple #9
0
 def __init__(self, taskman: TaskManager, root_password: str, i18n: I18n,
              logger: logging.Logger, refresh_mirrors: RefreshMirrors,
              create_config: CreateConfigFile):
     super(SyncDatabases, self).__init__(daemon=True)
     self.task_man = taskman
     self.i18n = i18n
     self.taskman = taskman
     self.task_id = "arch_dbsync"
     self.root_password = root_password
     self.refresh_mirrors = refresh_mirrors
     self.logger = logger
     self.create_config = create_config
     self.task_name = self.i18n['arch.sync_databases.substatus']
     self.taskman.register_task(self.task_id, self.task_name,
                                get_icon_path())
     self.synchronized = False
Exemple #10
0
 def __init__(self,
              context: ApplicationContext,
              taskman: TaskManager,
              create_config: Optional[CreateConfigFile] = None,
              arch_config: Optional[dict] = None):
     super(AURIndexUpdater, self).__init__(daemon=True)
     self.http_client = context.http_client
     self.i18n = context.i18n
     self.logger = context.logger
     self.taskman = taskman
     self.task_id = 'index_aur'
     self.create_config = create_config
     self.config = arch_config
     self.taskman.register_task(self.task_id,
                                self.i18n['arch.task.aur.index.status'],
                                get_icon_path())
Exemple #11
0
    def run(self):
        if not self.optimizations:
            self.logger.info(
                "Arch packages compilation optimizations are disabled")

            if os.path.exists(CUSTOM_MAKEPKG_FILE):
                self.logger.info(
                    "Removing custom 'makepkg.conf' -> '{}'".format(
                        CUSTOM_MAKEPKG_FILE))
                os.remove(CUSTOM_MAKEPKG_FILE)

            self.logger.info('Finished')
        else:
            if self.task_man:
                self.task_man.register_task(
                    self.task_id, self.i18n['arch.task.optimizing'].format(
                        bold('makepkg.conf')), get_icon_path())

            self.optimize()
Exemple #12
0
 def __init__(self,
              i18n: I18n,
              logger: logging.Logger,
              taskman: TaskManager,
              create_config: Optional[CreateConfigFile] = None):
     super(ArchCompilationOptimizer, self).__init__(daemon=True)
     self.logger = logger
     self.i18n = i18n
     self.re_compress_xz = re.compile(r'#?\s*COMPRESSXZ\s*=\s*.+')
     self.re_compress_zst = re.compile(r'#?\s*COMPRESSZST\s*=\s*.+')
     self.re_build_env = re.compile(r'\s+BUILDENV\s*=.+')
     self.re_ccache = re.compile(r'!?ccache')
     self.taskman = taskman
     self.task_id = 'arch_make_optm'
     self.create_config = create_config
     self.taskman.register_task(
         self.task_id,
         self.i18n['arch.task.optimizing'].format(bold('makepkg.conf')),
         get_icon_path())
Exemple #13
0
 def __init__(self, taskman: TaskManager, i18n: I18n,
              logger: logging.Logger, controller: "ArchManager",
              internet_available: bool, aur_indexer: Thread,
              create_config: CreateConfigFile):
     super(ArchDiskCacheUpdater, self).__init__(daemon=True)
     self.logger = logger
     self.taskman = taskman
     self.task_id = 'arch_cache_up'
     self.i18n = i18n
     self.indexed = 0
     self.indexed_template = self.i18n[
         'arch.task.disk_cache.indexed'] + ': {}/ {}'
     self.to_index = 0
     self.progress = 0  # progress is defined by the number of packages prepared and indexed
     self.controller = controller
     self.internet_available = internet_available
     self.installed_hash_path = '{}/installed.sha1'.format(ARCH_CACHE_PATH)
     self.installed_cache_dir = '{}/installed'.format(ARCH_CACHE_PATH)
     self.aur_indexer = aur_indexer
     self.create_config = create_config
     self.taskman.register_task(self.task_id,
                                self.i18n['arch.task.disk_cache'],
                                get_icon_path())
Exemple #14
0
    def run(self) -> None:
        self.taskman.update_progress(
            self.task_id, 0, self.i18n['task.waiting_task'].format(
                bold(self.create_config.task_name)))
        self.create_config.join()

        self.taskman.update_progress(
            self.task_id, 0, self.i18n['task.waiting_task'].format(
                bold(self.refresh_mirrors.task_name)))
        self.refresh_mirrors.join()

        self.taskman.update_progress(self.task_id, 1,
                                     self.i18n['arch.task.checking_settings'])

        arch_config = self.create_config.config
        aur_supported = aur.is_supported(arch_config)
        if not self.is_enabled(arch_config, aur_supported):
            self.taskman.update_progress(self.task_id, 100,
                                         self.i18n['arch.task.disabled'])
            self.taskman.finish_task(self.task_id)
            return

        shoud_sync = self.refresh_mirrors.refreshed or (database.should_sync(
            arch_config, aur_supported, None, self.logger))

        if not shoud_sync:
            self.taskman.update_progress(
                self.task_id, 100,
                self.i18n['arch.sync_databases.substatus.synchronized'])
            self.taskman.finish_task(self.task_id)
            self.synchronized = True
            return

        self.logger.info("Synchronizing databases")
        self.taskman.register_task(self.task_id,
                                   self.i18n['arch.sync_databases.substatus'],
                                   get_icon_path())

        progress = 10
        dbs = pacman.get_databases()
        self.taskman.update_progress(self.task_id, progress, None)

        if dbs:
            inc = 90 / len(dbs)
            try:
                p = new_root_subprocess(['pacman', '-Syy'], self.root_password)

                dbs_read, last_db = 0, None

                for o in p.stdout:
                    line = o.decode().strip()

                    if line:
                        self.task_man.update_output(self.task_id, line)
                        if line.startswith('downloading'):
                            db = line.split(' ')[1].strip()

                            if last_db is None or last_db != db:
                                last_db = db
                                dbs_read += 1
                                progress = dbs_read * inc
                            else:
                                progress += 0.25

                            self.taskman.update_progress(
                                self.task_id, progress,
                                self.i18n['arch.task.sync_sb.status'].format(
                                    db))

                for o in p.stderr:
                    line = o.decode().strip()

                    if line:
                        self.task_man.update_output(self.task_id, line)

                p.wait()

                if p.returncode == 0:
                    database.register_sync(self.logger)
                    self.synchronized = True
                else:
                    self.logger.error("Could not synchronize database")

            except:
                self.logger.info("Error while synchronizing databases")
                traceback.print_exc()

        self.taskman.update_progress(self.task_id, 100, None)
        self.taskman.finish_task(self.task_id)
        self.logger.info("Finished")