From cbd1da645756e6d6fbd255bde37d9be452c547fe Mon Sep 17 00:00:00 2001 From: Cove Schneider Date: Sun, 16 Feb 2014 11:20:56 -0800 Subject: [PATCH 1/5] add yum module downgrade support --- library/packaging/yum | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/library/packaging/yum b/library/packaging/yum index 61bb836b43a..8a1a59458be 100644 --- a/library/packaging/yum +++ b/library/packaging/yum @@ -28,6 +28,7 @@ import yum try: from yum.misc import find_unfinished_transactions, find_ts_remaining from rpmUtils.miscutils import splitFilename + from rpmUtils.miscutils import compareEVR transaction_helpers = True except: transaction_helpers = False @@ -38,7 +39,7 @@ module: yum version_added: historical short_description: Manages packages with the I(yum) package manager description: - - Installs, upgrade, removes, and lists packages and groups with the I(yum) package manager. + - Installs, upgrades, downgrades, removes and lists packages and groups with the I(yum) package manager. options: name: description: @@ -461,6 +462,7 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos): res['msg'] = '' res['rc'] = 0 res['changed'] = False + downgrade = False for spec in items: pkg = None @@ -535,12 +537,30 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos): if found: continue + + # downgrade - the yum install command will only install or upgrade to a spec version, it will + # not install an older version of an RPM even if specifed by the install spec. So we need to + # determine if this is a downgrade, and then use the yum downgrade command to install the RPM. + pkg_name = splitFilename(spec)[0] + pkgs = is_installed(module, repoq, pkg_name, conf_file, en_repos=en_repos, dis_repos=dis_repos, is_pkg=True) + if pkgs: + (cur_name, cur_ver, cur_rel, cur_epoch, cur_arch) = splitFilename(pkgs[0]) + (new_name, new_ver, new_rel, new_epoch, new_arch) = splitFilename(spec) + + compare = compareEVR((cur_epoch, cur_ver, cur_rel), (new_epoch, new_ver, new_rel)) + if compare > 0: + downgrade = True + # if not - then pass in the spec as what to install # we could get here if nothing provides it but that's not # the error we're catching here pkg = spec - cmd = yum_basecmd + ['install', pkg] + operation = 'install' + if downgrade: + operation = 'downgrade' + + cmd = yum_basecmd + [operation, pkg] if module.check_mode: module.exit_json(changed=True) From f47fe7af62bc4e24974c752d9fa1310eb6b86799 Mon Sep 17 00:00:00 2001 From: Cove Schneider Date: Sun, 16 Feb 2014 11:23:00 -0800 Subject: [PATCH 2/5] add sponsor copyright/attribution --- library/packaging/yum | 1 + 1 file changed, 1 insertion(+) diff --git a/library/packaging/yum b/library/packaging/yum index 8a1a59458be..d40e9226f0e 100644 --- a/library/packaging/yum +++ b/library/packaging/yum @@ -1,6 +1,7 @@ #!/usr/bin/python -tt # -*- coding: utf-8 -*- +# (c) 2014, Epic Games, Inc. # (c) 2012, Red Hat, Inc # Written by Seth Vidal # From 29f1528492d82a6b6650b3142e3cc9b69a0e828a Mon Sep 17 00:00:00 2001 From: Cove Schneider Date: Sun, 16 Feb 2014 15:06:46 -0800 Subject: [PATCH 3/5] change order of copyright --- library/packaging/yum | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/packaging/yum b/library/packaging/yum index d40e9226f0e..09ce5b6dd60 100644 --- a/library/packaging/yum +++ b/library/packaging/yum @@ -1,9 +1,9 @@ #!/usr/bin/python -tt # -*- coding: utf-8 -*- -# (c) 2014, Epic Games, Inc. # (c) 2012, Red Hat, Inc # Written by Seth Vidal +# (c) 2014, Epic Games, Inc. # # This file is part of Ansible # From 9244283122bd3167a36755dee5c3cc399ee1ac2f Mon Sep 17 00:00:00 2001 From: Richard C Isaacson Date: Fri, 7 Mar 2014 13:53:31 -0600 Subject: [PATCH 4/5] Spelling and formatting. --- library/packaging/yum | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/library/packaging/yum b/library/packaging/yum index 09ce5b6dd60..15f086f6b81 100644 --- a/library/packaging/yum +++ b/library/packaging/yum @@ -110,7 +110,7 @@ EXAMPLES = ''' - name: remove the Apache package yum: name=httpd state=removed -- name: install the latest version of Apche from the testing repo +- name: install the latest version of Apache from the testing repo yum: name=httpd enablerepo=testing state=installed - name: upgrade all packages @@ -463,6 +463,7 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos): res['msg'] = '' res['rc'] = 0 res['changed'] = False + downgrade = False for spec in items: @@ -540,7 +541,7 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos): continue # downgrade - the yum install command will only install or upgrade to a spec version, it will - # not install an older version of an RPM even if specifed by the install spec. So we need to + # not install an older version of an RPM even if specified by the install spec. So we need to # determine if this is a downgrade, and then use the yum downgrade command to install the RPM. pkg_name = splitFilename(spec)[0] pkgs = is_installed(module, repoq, pkg_name, conf_file, en_repos=en_repos, dis_repos=dis_repos, is_pkg=True) From 47b2dc611ce649b4087f751de253ab3fd8d9404b Mon Sep 17 00:00:00 2001 From: Richard C Isaacson Date: Fri, 7 Mar 2014 15:01:39 -0600 Subject: [PATCH 5/5] Look at the filename and if it has a version defined possibly process this as a downgrade. --- library/packaging/yum | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/library/packaging/yum b/library/packaging/yum index 15f086f6b81..1a77cf0f0b0 100644 --- a/library/packaging/yum +++ b/library/packaging/yum @@ -543,15 +543,18 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos): # downgrade - the yum install command will only install or upgrade to a spec version, it will # not install an older version of an RPM even if specified by the install spec. So we need to # determine if this is a downgrade, and then use the yum downgrade command to install the RPM. - pkg_name = splitFilename(spec)[0] - pkgs = is_installed(module, repoq, pkg_name, conf_file, en_repos=en_repos, dis_repos=dis_repos, is_pkg=True) - if pkgs: - (cur_name, cur_ver, cur_rel, cur_epoch, cur_arch) = splitFilename(pkgs[0]) - (new_name, new_ver, new_rel, new_epoch, new_arch) = splitFilename(spec) + split_pkg_name = splitFilename(spec) + # if the Name and Version match a version was not provided and this is not a downgrade. + if split_pkg_name[0] == split_pkg_name[1]: + pkg_name = split_pkg_name[0] + pkgs = is_installed(module, repoq, pkg_name, conf_file, en_repos=en_repos, dis_repos=dis_repos, is_pkg=True) + if pkgs: + (cur_name, cur_ver, cur_rel, cur_epoch, cur_arch) = splitFilename(pkgs[0]) + (new_name, new_ver, new_rel, new_epoch, new_arch) = splitFilename(spec) - compare = compareEVR((cur_epoch, cur_ver, cur_rel), (new_epoch, new_ver, new_rel)) - if compare > 0: - downgrade = True + compare = compareEVR((cur_epoch, cur_ver, cur_rel), (new_epoch, new_ver, new_rel)) + if compare > 0: + downgrade = True # if not - then pass in the spec as what to install # we could get here if nothing provides it but that's not