From b4184f9825e1a5ef0b5ad6caea75be2010d100c9 Mon Sep 17 00:00:00 2001 From: Martin Krizek Date: Tue, 10 Oct 2017 16:07:31 +0200 Subject: [PATCH] yum: fix crashes installing from file/url (cherry picked from commit 24c360287ee39c076b9a969ac6ba0281ba22bccf) --- lib/ansible/modules/packaging/os/yum.py | 46 +++++++++++++++---------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/lib/ansible/modules/packaging/os/yum.py b/lib/ansible/modules/packaging/os/yum.py index 7f17a4ca25..911948c36f 100644 --- a/lib/ansible/modules/packaging/os/yum.py +++ b/lib/ansible/modules/packaging/os/yum.py @@ -727,31 +727,41 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, i downgrade_candidate = False # check if pkgspec is installed (if possible for idempotence) - # localpkg - if spec.endswith('.rpm') and '://' not in spec: - # get the pkg name-v-r.arch - if not os.path.exists(spec): + if spec.endswith('.rpm'): + if '://' not in spec and not os.path.exists(spec): res['msg'] += "No RPM file matching '%s' found on system" % spec res['results'].append("No RPM file matching '%s' found on system" % spec) - res['rc'] = 127 # Ensure the task fails in with-loop + res['rc'] = 127 # Ensure the task fails in with-loop module.fail_json(**res) - envra = local_envra(module, spec) + if '://' in spec: + package = fetch_rpm_from_url(spec, module=module) + else: + package = spec - # look for them in the rpmdb - if is_installed(module, repoq, envra, conf_file, en_repos=en_repos, dis_repos=dis_repos, installroot=installroot): - # if they are there, skip it - continue - pkg = spec - - # URL - elif '://' in spec: - # download package so that we can check if it's already installed - package = fetch_rpm_from_url(spec, module=module) + # most common case is the pkg is already installed envra = local_envra(module, package) - if is_installed(module, repoq, envra, conf_file, en_repos=en_repos, dis_repos=dis_repos, installroot=installroot): - # if it's there, skip it + installed_pkgs = is_installed(module, repoq, envra, conf_file, en_repos=en_repos, dis_repos=dis_repos, installroot=installroot) + if installed_pkgs: + res['results'].append('%s providing %s is already installed' % (installed_pkgs[0], package)) continue + + (name, ver, rel, epoch, arch) = splitFilename(envra) + installed_pkgs = is_installed(module, repoq, name, conf_file, en_repos=en_repos, dis_repos=dis_repos, installroot=installroot) + + # TODO support downgrade for rpm files + if len(installed_pkgs) == 1: + installed_pkg = installed_pkgs[0] + (cur_name, cur_ver, cur_rel, cur_epoch, cur_arch) = splitFilename(installed_pkg) + cur_epoch = cur_epoch or '0' + compare = compareEVR((cur_epoch, cur_ver, cur_rel), (epoch, ver, rel)) + + # compare > 0 (higher version is installed) or compare == 0 (exact version is installed) + if compare >= 0: + continue + # else: if there are more installed packages with the same name, that would mean + # kernel, gpg-pubkey or like, so just let yum deal with it and try to install it + pkg = package # groups