Check for zypper version before using options (#2549)
* priority needs zypper version >= 1.12.25 * gpgcheck needs zypper version >= 1.6.2 * output warnings if version not sufficient for option * fixes #2548
This commit is contained in:
parent
c6a45234e0
commit
8fe06a86f7
1 changed files with 36 additions and 11 deletions
|
@ -55,6 +55,7 @@ options:
|
||||||
- Whether to disable GPG signature checking of
|
- Whether to disable GPG signature checking of
|
||||||
all packages. Has an effect only if state is
|
all packages. Has an effect only if state is
|
||||||
I(present).
|
I(present).
|
||||||
|
- Needs zypper version >= 1.6.2.
|
||||||
required: false
|
required: false
|
||||||
default: "no"
|
default: "no"
|
||||||
choices: [ "yes", "no" ]
|
choices: [ "yes", "no" ]
|
||||||
|
@ -68,6 +69,7 @@ options:
|
||||||
description:
|
description:
|
||||||
- Set priority of repository. Packages will always be installed
|
- Set priority of repository. Packages will always be installed
|
||||||
from the repository with the smallest priority number.
|
from the repository with the smallest priority number.
|
||||||
|
- Needs zypper version >= 1.12.25.
|
||||||
required: false
|
required: false
|
||||||
version_added: "2.1"
|
version_added: "2.1"
|
||||||
overwrite_multiple:
|
overwrite_multiple:
|
||||||
|
@ -95,6 +97,8 @@ EXAMPLES = '''
|
||||||
|
|
||||||
REPO_OPTS = ['alias', 'name', 'priority', 'enabled', 'autorefresh', 'gpgcheck']
|
REPO_OPTS = ['alias', 'name', 'priority', 'enabled', 'autorefresh', 'gpgcheck']
|
||||||
|
|
||||||
|
from distutils.version import LooseVersion
|
||||||
|
|
||||||
def _parse_repos(module):
|
def _parse_repos(module):
|
||||||
"""parses the output of zypper -x lr and return a parse repo dictionary"""
|
"""parses the output of zypper -x lr and return a parse repo dictionary"""
|
||||||
cmd = ['/usr/bin/zypper', '-x', 'lr']
|
cmd = ['/usr/bin/zypper', '-x', 'lr']
|
||||||
|
@ -167,22 +171,33 @@ def repo_exists(module, repodata, overwrite_multiple):
|
||||||
module.fail_json(msg=errmsg)
|
module.fail_json(msg=errmsg)
|
||||||
|
|
||||||
|
|
||||||
def modify_repo(module, repodata, old_repos):
|
def modify_repo(module, repodata, old_repos, zypper_version, warnings):
|
||||||
repo = repodata['url']
|
repo = repodata['url']
|
||||||
cmd = ['/usr/bin/zypper', 'ar', '--check']
|
cmd = ['/usr/bin/zypper', 'ar', '--check']
|
||||||
if repodata['name']:
|
if repodata['name']:
|
||||||
cmd.extend(['--name', repodata['name']])
|
cmd.extend(['--name', repodata['name']])
|
||||||
|
|
||||||
|
# priority on addrepo available since 1.12.25
|
||||||
|
# https://github.com/openSUSE/zypper/blob/b9b3cb6db76c47dc4c47e26f6a4d2d4a0d12b06d/package/zypper.changes#L327-L336
|
||||||
if repodata['priority']:
|
if repodata['priority']:
|
||||||
|
if zypper_version >= LooseVersion('1.12.25'):
|
||||||
cmd.extend(['--priority', str(repodata['priority'])])
|
cmd.extend(['--priority', str(repodata['priority'])])
|
||||||
|
else:
|
||||||
|
warnings.append("Setting priority only available for zypper >= 1.12.25. Ignoring priority argument.")
|
||||||
|
|
||||||
if repodata['enabled'] == '0':
|
if repodata['enabled'] == '0':
|
||||||
cmd.append('--disable')
|
cmd.append('--disable')
|
||||||
|
|
||||||
|
# gpgcheck available since 1.6.2
|
||||||
|
# https://github.com/openSUSE/zypper/blob/b9b3cb6db76c47dc4c47e26f6a4d2d4a0d12b06d/package/zypper.changes#L2446-L2449
|
||||||
|
# the default changed in the past, so don't assume a default here and show warning for old zypper versions
|
||||||
|
if zypper_version >= LooseVersion('1.6.2'):
|
||||||
if repodata['gpgcheck'] == '1':
|
if repodata['gpgcheck'] == '1':
|
||||||
cmd.append('--gpgcheck')
|
cmd.append('--gpgcheck')
|
||||||
else:
|
else:
|
||||||
cmd.append('--no-gpgcheck')
|
cmd.append('--no-gpgcheck')
|
||||||
|
else:
|
||||||
|
warnings.append("Enabling/disabling gpgcheck only available for zypper >= 1.6.2. Using zypper default value.")
|
||||||
|
|
||||||
if repodata['autorefresh'] == '1':
|
if repodata['autorefresh'] == '1':
|
||||||
cmd.append('--refresh')
|
cmd.append('--refresh')
|
||||||
|
@ -217,6 +232,13 @@ def remove_repo(module, repo):
|
||||||
return changed
|
return changed
|
||||||
|
|
||||||
|
|
||||||
|
def get_zypper_version(module):
|
||||||
|
rc, stdout, stderr = module.run_command(['/usr/bin/zypper', '--version'])
|
||||||
|
if rc != 0 or not stdout.startswith('zypper '):
|
||||||
|
return LooseVersion('1.0')
|
||||||
|
return LooseVersion(stdout.split()[1])
|
||||||
|
|
||||||
|
|
||||||
def fail_if_rc_is_null(module, rc, stdout, stderr):
|
def fail_if_rc_is_null(module, rc, stdout, stderr):
|
||||||
if rc != 0:
|
if rc != 0:
|
||||||
#module.fail_json(msg=stderr if stderr else stdout)
|
#module.fail_json(msg=stderr if stderr else stdout)
|
||||||
|
@ -233,11 +255,11 @@ def main():
|
||||||
repo=dict(required=False),
|
repo=dict(required=False),
|
||||||
state=dict(choices=['present', 'absent'], default='present'),
|
state=dict(choices=['present', 'absent'], default='present'),
|
||||||
description=dict(required=False),
|
description=dict(required=False),
|
||||||
disable_gpg_check = dict(required=False, default='no', type='bool'),
|
disable_gpg_check = dict(required=False, default=False, type='bool'),
|
||||||
refresh = dict(required=False, default='yes', type='bool'),
|
refresh = dict(required=False, default=True, type='bool'),
|
||||||
priority = dict(required=False, type='int'),
|
priority = dict(required=False, type='int'),
|
||||||
enabled = dict(required=False, default='yes', type='bool'),
|
enabled = dict(required=False, default=True, type='bool'),
|
||||||
overwrite_multiple = dict(required=False, default='no', type='bool'),
|
overwrite_multiple = dict(required=False, default=False, type='bool'),
|
||||||
),
|
),
|
||||||
supports_check_mode=False,
|
supports_check_mode=False,
|
||||||
)
|
)
|
||||||
|
@ -247,6 +269,9 @@ def main():
|
||||||
state = module.params['state']
|
state = module.params['state']
|
||||||
overwrite_multiple = module.params['overwrite_multiple']
|
overwrite_multiple = module.params['overwrite_multiple']
|
||||||
|
|
||||||
|
zypper_version = get_zypper_version(module)
|
||||||
|
warnings = [] # collect warning messages for final output
|
||||||
|
|
||||||
repodata = {
|
repodata = {
|
||||||
'url': repo,
|
'url': repo,
|
||||||
'alias': alias,
|
'alias': alias,
|
||||||
|
@ -288,7 +313,7 @@ def main():
|
||||||
if state == 'present':
|
if state == 'present':
|
||||||
if exists and not mod:
|
if exists and not mod:
|
||||||
exit_unchanged()
|
exit_unchanged()
|
||||||
changed = modify_repo(module, repodata, old_repos)
|
changed = modify_repo(module, repodata, old_repos, zypper_version, warnings)
|
||||||
elif state == 'absent':
|
elif state == 'absent':
|
||||||
if not exists:
|
if not exists:
|
||||||
exit_unchanged()
|
exit_unchanged()
|
||||||
|
@ -296,7 +321,7 @@ def main():
|
||||||
repo=alias
|
repo=alias
|
||||||
changed = remove_repo(module, repo)
|
changed = remove_repo(module, repo)
|
||||||
|
|
||||||
module.exit_json(changed=changed, repodata=repodata, state=state)
|
module.exit_json(changed=changed, repodata=repodata, state=state, warnings=warnings)
|
||||||
|
|
||||||
# import module snippets
|
# import module snippets
|
||||||
from ansible.module_utils.basic import *
|
from ansible.module_utils.basic import *
|
||||||
|
|
Loading…
Reference in a new issue