ruạṛ
# Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. # Licensed under the Universal Permissive License v 1.0 as shown at https://opensource.org/licenses/UPL. import logging import time import dnf.exceptions from osms import alxutils from osms import utils def package_remove(package_list): base = _dnf_base(load_system_repo=True, load_available_repos=False) installed = base.sack.query().installed() to_remove = [_package_tup2obj(installed, tup) for tup in package_list] return _dnf_transaction(base, remove=to_remove, allow_erasing=True) def package_update(package_list, cache_only=None): base = _dnf_base(load_system_repo=True, load_available_repos=True) installed = base.sack.query().installed() available = base.sack.query().available() # skip already installed packages err = None errmsgs = [] to_install = [] for package in package_list: if len(package) < 5: package.append('') (name, version, release, epoch, arch) = package if version == '' and release == '' and epoch == '' and arch == '' and installed.filter(name=name): logging.debug('Package %s is already installed', name) continue if epoch == '': epoch = 0 pkgs = installed.filter(name=name, arch=arch).latest() requested_pkg = _package_tup2obj(available, package) if not requested_pkg: err = 'Package %s is not available for installation' % _package_tup2str(package) logging.debug('E: %s', err) errmsgs.append(err) continue for pkg in pkgs: pkg_cmp = pkg.evr_cmp(requested_pkg) if pkg_cmp == 0: logging.debug('Package %s already installed', _package_tup2str(package)) break elif pkg_cmp > 0: logging.debug('More recent version of package %s is already installed', _package_tup2str(package)) break else: to_install.append(requested_pkg) # Don't proceed further with empty list, # since this would result into an empty yum transaction if not to_install: if err: ret = (32, "Failed: Packages failed to install properly:\n" + '\n'.join(errmsgs), {'version': '1', 'name': "package_install_failure"}) else: ret = (0, "Requested packages already installed", {}) # workaround for RhBug:1218071 base._plugins._unload() base.close() return ret return _dnf_transaction(base, install=to_install, cache_only=cache_only) def package_full_update(cache_only=None): base = _dnf_base(load_system_repo=True, load_available_repos=True) return _dnf_transaction(base, full_update=True, cache_only=cache_only) def _dnf_base(load_system_repo=True, load_available_repos=True): base = dnf.Base() if not base._plugins.plugins: base.init_plugins() if load_available_repos: base.pre_configure_plugins() base.read_all_repos() base.configure_plugins() base.fill_sack(load_system_repo=True, load_available_repos=True) return base def _dnf_transaction(base, install=[], remove=[], full_update=False, allow_erasing=False, cache_only=None): """command is an function excpecting dnf.Base() as an argument """ time_started = time.time() try: if full_update: base.upgrade_all() else: for pkg in install: if pkg: base.package_install(pkg) for pkg in remove: if pkg: base.package_remove(pkg) base.resolve(allow_erasing) logging.debug("Dependencies Resolved") if not len(base.transaction): raise dnf.exceptions.Error('empty transaction') if base.transaction.install_set: logging.debug("Downloading and installing: %s", [str(p) for p in base.transaction.install_set]) base.download_packages(base.transaction.install_set) if base.transaction.remove_set: logging.debug("Removing: %s", [str(p) for p in base.transaction.remove_set]) if not cache_only: base.do_transaction() if utils.is_alx(): time_ended = time.time() tid = base.history.last().tid exit_code = 0 except dnf.exceptions.MarkingError as e: data = {} data['version'] = "1" data['name'] = "package_install_failure" return (32, "Failed: Packages failed to install properly: %s" % str(e), data) except dnf.exceptions.MarkingError as e: data = {} data['version'] = 0 data['name'] = "rpmremoveerrors" return (15, "%s" % str(e), data) except dnf.exceptions.DepsolveError as e: data = {} data["version"] = "1" data["name"] = "failed_deps" return (18, "Failed: packages requested raised dependency problems: %s" % str(e), data) except dnf.exceptions.Error as e: status = 6 message = "Error while executing packages action: %s" % str(e) data = {} return (status, message, data) finally: # workaround for RhBug:1218071 base._plugins._unload() base.close() if utils.is_alx(): alxutils.send_yum_updates(alxutils.SUCCESS, exit_code, tid, time_started, time_ended) return (0, "Update Succeeded", {}) def _package_tup2obj(q, tup): (name, version, release, epoch) = tup[:4] arch = tup[4] if len(tup) > 4 else None query = {'name': name} if version: query['version'] = version if release: query['release'] = release if epoch: query['epoch'] = int(epoch) if arch: query['arch'] = arch pkgs = q.filter(**query).run() if pkgs: return pkgs[0] return None def _package_tup2str(package_tup): """ Create a package name from an rhn package tuple. """ n, v, r, e, a = package_tup[:] if not e: e = '0' pkginfo = '%s-%s:%s-%s' % (n, e, v, r) if a: pkginfo += '.%s' % (a) return (pkginfo,)
cải xoăn