mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
include upgraded packages in pacman upgrade action (#20713)
* include upgraded packages in pacman upgrade action * display upgraded packages as diff output for pacman upgrade * document the packages return key * add --diff support for installing, removing and checking packages * include package versions in pacman diff output
This commit is contained in:
parent
7f35220744
commit
f1d8d7ba13
1 changed files with 79 additions and 11 deletions
|
@ -91,6 +91,14 @@ options:
|
||||||
version_added: "2.0"
|
version_added: "2.0"
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
RETURN = '''
|
||||||
|
packages:
|
||||||
|
description: a list of packages that have been changed
|
||||||
|
returned: when upgrade is set to yes
|
||||||
|
type: list of strings
|
||||||
|
sample: ['package', 'other-package']
|
||||||
|
'''
|
||||||
|
|
||||||
EXAMPLES = '''
|
EXAMPLES = '''
|
||||||
# Install package foo
|
# Install package foo
|
||||||
- pacman:
|
- pacman:
|
||||||
|
@ -189,22 +197,43 @@ def update_package_db(module, pacman_path):
|
||||||
|
|
||||||
def upgrade(module, pacman_path):
|
def upgrade(module, pacman_path):
|
||||||
cmdupgrade = "%s -Suq --noconfirm" % (pacman_path)
|
cmdupgrade = "%s -Suq --noconfirm" % (pacman_path)
|
||||||
cmdneedrefresh = "%s -Qqu" % (pacman_path)
|
cmdneedrefresh = "%s -Qu" % (pacman_path)
|
||||||
rc, stdout, stderr = module.run_command(cmdneedrefresh, check_rc=False)
|
rc, stdout, stderr = module.run_command(cmdneedrefresh, check_rc=False)
|
||||||
|
data = stdout.split('\n')
|
||||||
|
data.remove('')
|
||||||
|
packages = []
|
||||||
|
diff = {
|
||||||
|
'before': '',
|
||||||
|
'after': '',
|
||||||
|
}
|
||||||
|
|
||||||
if rc == 0:
|
if rc == 0:
|
||||||
|
regex = re.compile('(\w+) ((?:\S+)-(?:\S+)) -> ((?:\S+)-(?:\S+))')
|
||||||
|
b = []
|
||||||
|
a = []
|
||||||
|
for p in data:
|
||||||
|
m = regex.search(p)
|
||||||
|
packages.append(m.group(1))
|
||||||
|
if module._diff:
|
||||||
|
diff['before'] += "%s-%s\n" % (m.group(1), m.group(2))
|
||||||
|
diff['after'] += "%s-%s\n" % (m.group(1), m.group(3))
|
||||||
if module.check_mode:
|
if module.check_mode:
|
||||||
data = stdout.split('\n')
|
module.exit_json(changed=True, msg="%s package(s) would be upgraded" % (len(data)), packages=packages, diff=diff)
|
||||||
module.exit_json(changed=True, msg="%s package(s) would be upgraded" % (len(data) - 1))
|
|
||||||
rc, stdout, stderr = module.run_command(cmdupgrade, check_rc=False)
|
rc, stdout, stderr = module.run_command(cmdupgrade, check_rc=False)
|
||||||
if rc == 0:
|
if rc == 0:
|
||||||
module.exit_json(changed=True, msg='System upgraded')
|
module.exit_json(changed=True, msg='System upgraded', packages=packages, diff=diff)
|
||||||
else:
|
else:
|
||||||
module.fail_json(msg="Could not upgrade")
|
module.fail_json(msg="Could not upgrade")
|
||||||
else:
|
else:
|
||||||
module.exit_json(changed=False, msg='Nothing to upgrade')
|
module.exit_json(changed=False, msg='Nothing to upgrade', packages=packages)
|
||||||
|
|
||||||
def remove_packages(module, pacman_path, packages):
|
def remove_packages(module, pacman_path, packages):
|
||||||
|
data = []
|
||||||
|
diff = {
|
||||||
|
'before': '',
|
||||||
|
'after': '',
|
||||||
|
}
|
||||||
|
|
||||||
if module.params["recurse"] or module.params["force"]:
|
if module.params["recurse"] or module.params["force"]:
|
||||||
if module.params["recurse"]:
|
if module.params["recurse"]:
|
||||||
args = "Rs"
|
args = "Rs"
|
||||||
|
@ -226,14 +255,20 @@ def remove_packages(module, pacman_path, packages):
|
||||||
cmd = "%s -%s %s --noconfirm --noprogressbar" % (pacman_path, args, package)
|
cmd = "%s -%s %s --noconfirm --noprogressbar" % (pacman_path, args, package)
|
||||||
rc, stdout, stderr = module.run_command(cmd, check_rc=False)
|
rc, stdout, stderr = module.run_command(cmd, check_rc=False)
|
||||||
|
|
||||||
|
if module._diff:
|
||||||
|
d = stdout.split('\n')[2].split(' ')[2:]
|
||||||
|
for i, pkg in enumerate(d):
|
||||||
|
d[i] = re.sub('-[0-9].*$', '', d[i].split('/')[-1])
|
||||||
|
diff['before'] += "%s\n" % pkg
|
||||||
|
data.append('\n'.join(d))
|
||||||
|
|
||||||
if rc != 0:
|
if rc != 0:
|
||||||
module.fail_json(msg="failed to remove %s" % (package))
|
module.fail_json(msg="failed to remove %s" % (package))
|
||||||
|
|
||||||
remove_c += 1
|
remove_c += 1
|
||||||
|
|
||||||
if remove_c > 0:
|
if remove_c > 0:
|
||||||
|
module.exit_json(changed=True, msg="removed %s package(s)" % remove_c, diff=diff)
|
||||||
module.exit_json(changed=True, msg="removed %s package(s)" % remove_c)
|
|
||||||
|
|
||||||
module.exit_json(changed=False, msg="package(s) already absent")
|
module.exit_json(changed=False, msg="package(s) already absent")
|
||||||
|
|
||||||
|
@ -242,6 +277,11 @@ def install_packages(module, pacman_path, state, packages, package_files):
|
||||||
install_c = 0
|
install_c = 0
|
||||||
package_err = []
|
package_err = []
|
||||||
message = ""
|
message = ""
|
||||||
|
data = []
|
||||||
|
diff = {
|
||||||
|
'before': '',
|
||||||
|
'after': '',
|
||||||
|
}
|
||||||
|
|
||||||
to_install_repos = []
|
to_install_repos = []
|
||||||
to_install_files = []
|
to_install_files = []
|
||||||
|
@ -262,6 +302,12 @@ def install_packages(module, pacman_path, state, packages, package_files):
|
||||||
if to_install_repos:
|
if to_install_repos:
|
||||||
cmd = "%s -S %s --noconfirm --noprogressbar --needed" % (pacman_path, " ".join(to_install_repos))
|
cmd = "%s -S %s --noconfirm --noprogressbar --needed" % (pacman_path, " ".join(to_install_repos))
|
||||||
rc, stdout, stderr = module.run_command(cmd, check_rc=False)
|
rc, stdout, stderr = module.run_command(cmd, check_rc=False)
|
||||||
|
data = stdout.split('\n')[3].split(' ')[2:]
|
||||||
|
data = [ i for i in data if i != '' ]
|
||||||
|
for i, pkg in enumerate(data):
|
||||||
|
data[i] = re.sub('-[0-9].*$', '', data[i].split('/')[-1])
|
||||||
|
if module._diff:
|
||||||
|
diff['after'] += "%s\n" % pkg
|
||||||
|
|
||||||
if rc != 0:
|
if rc != 0:
|
||||||
module.fail_json(msg="failed to install %s: %s" % (" ".join(to_install_repos), stderr))
|
module.fail_json(msg="failed to install %s: %s" % (" ".join(to_install_repos), stderr))
|
||||||
|
@ -271,6 +317,13 @@ def install_packages(module, pacman_path, state, packages, package_files):
|
||||||
if to_install_files:
|
if to_install_files:
|
||||||
cmd = "%s -U %s --noconfirm --noprogressbar --needed" % (pacman_path, " ".join(to_install_files))
|
cmd = "%s -U %s --noconfirm --noprogressbar --needed" % (pacman_path, " ".join(to_install_files))
|
||||||
rc, stdout, stderr = module.run_command(cmd, check_rc=False)
|
rc, stdout, stderr = module.run_command(cmd, check_rc=False)
|
||||||
|
data = stdout.split('\n')[3].split(' ')[2:]
|
||||||
|
data = [ i for i in data if i != '' ]
|
||||||
|
for i, pkg in enumerate(data):
|
||||||
|
data[i] = re.sub('-[0-9].*$', '', data[i].split('/')[-1])
|
||||||
|
if module._diff:
|
||||||
|
diff['after'] += "%s\n" % pkg
|
||||||
|
|
||||||
if rc != 0:
|
if rc != 0:
|
||||||
module.fail_json(msg="failed to install %s: %s" % (" ".join(to_install_files), stderr))
|
module.fail_json(msg="failed to install %s: %s" % (" ".join(to_install_files), stderr))
|
||||||
|
|
||||||
|
@ -280,12 +333,19 @@ def install_packages(module, pacman_path, state, packages, package_files):
|
||||||
message = "But could not ensure 'latest' state for %s package(s) as remote version could not be fetched." % (package_err)
|
message = "But could not ensure 'latest' state for %s package(s) as remote version could not be fetched." % (package_err)
|
||||||
|
|
||||||
if install_c > 0:
|
if install_c > 0:
|
||||||
module.exit_json(changed=True, msg="installed %s package(s). %s" % (install_c, message))
|
module.exit_json(changed=True, msg="installed %s package(s). %s" % (install_c, message), diff=diff)
|
||||||
|
|
||||||
module.exit_json(changed=False, msg="package(s) already installed. %s" % (message))
|
module.exit_json(changed=False, msg="package(s) already installed. %s" % (message), diff=diff)
|
||||||
|
|
||||||
def check_packages(module, pacman_path, packages, state):
|
def check_packages(module, pacman_path, packages, state):
|
||||||
would_be_changed = []
|
would_be_changed = []
|
||||||
|
diff = {
|
||||||
|
'before': '',
|
||||||
|
'after': '',
|
||||||
|
'before_header': '',
|
||||||
|
'after_header': ''
|
||||||
|
}
|
||||||
|
|
||||||
for package in packages:
|
for package in packages:
|
||||||
installed, updated, unknown = query_package(module, pacman_path, package)
|
installed, updated, unknown = query_package(module, pacman_path, package)
|
||||||
if ((state in ["present", "latest"] and not installed) or
|
if ((state in ["present", "latest"] and not installed) or
|
||||||
|
@ -295,10 +355,18 @@ def check_packages(module, pacman_path, packages, state):
|
||||||
if would_be_changed:
|
if would_be_changed:
|
||||||
if state == "absent":
|
if state == "absent":
|
||||||
state = "removed"
|
state = "removed"
|
||||||
|
|
||||||
|
if module._diff and (state == 'removed'):
|
||||||
|
diff['before_header'] = 'removed'
|
||||||
|
diff['before'] = '\n'.join(would_be_changed) + '\n'
|
||||||
|
elif module._diff and ((state == 'present') or (state == 'latest')):
|
||||||
|
diff['after_header'] = 'installed'
|
||||||
|
diff['after'] = '\n'.join(would_be_changed) + '\n'
|
||||||
|
|
||||||
module.exit_json(changed=True, msg="%s package(s) would be %s" % (
|
module.exit_json(changed=True, msg="%s package(s) would be %s" % (
|
||||||
len(would_be_changed), state))
|
len(would_be_changed), state), diff=diff)
|
||||||
else:
|
else:
|
||||||
module.exit_json(changed=False, msg="package(s) already %s" % state)
|
module.exit_json(changed=False, msg="package(s) already %s" % state, diff=diff)
|
||||||
|
|
||||||
|
|
||||||
def expand_package_groups(module, pacman_path, pkgs):
|
def expand_package_groups(module, pacman_path, pkgs):
|
||||||
|
|
Loading…
Reference in a new issue