| 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 : |
# 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,)