403Webshell
Server IP : 74.91.139.10  /  Your IP : 10.45.147.122
Web Server : Apache/2.4.67 (Unix)
System : Linux prod-iad-shwpweb1001d 5.14.0-687.26.1.el9_8.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Jul 14 16:32:02 EDT 2026 x86_64
User : FAsyXTyKGY ( 3004)
PHP Version : 8.2.30
Disable Function : passthru,shell_exec,system
MySQL : ON  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : ON
Directory :  /usr/share/oracle-cloud-agent/plugins/osms/osms/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /usr/share/oracle-cloud-agent/plugins/osms/osms/dnfutils.py
#   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,)

Youez - 2016 - github.com/yon3zu
LinuXploit