mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
fixed code to actually check the parameter not key
also made rest conditional on unit being provided, previouslly it changed from being always required fixes #23810 alternate to #23907
This commit is contained in:
parent
cb13aea88b
commit
72a4e1cf0d
1 changed files with 127 additions and 126 deletions
|
@ -294,7 +294,7 @@ def main():
|
||||||
}
|
}
|
||||||
|
|
||||||
for requires in ('state', 'enabled', 'masked'):
|
for requires in ('state', 'enabled', 'masked'):
|
||||||
if requires is not None and unit is None:
|
if module.params[requires] is not None and unit is None:
|
||||||
module.fail_json(msg="name is also required when specifying %s" % requires)
|
module.fail_json(msg="name is also required when specifying %s" % requires)
|
||||||
|
|
||||||
# Run daemon-reload first, if requested
|
# Run daemon-reload first, if requested
|
||||||
|
@ -303,147 +303,148 @@ def main():
|
||||||
if rc != 0:
|
if rc != 0:
|
||||||
module.fail_json(msg='failure %d during daemon-reload: %s' % (rc, err))
|
module.fail_json(msg='failure %d during daemon-reload: %s' % (rc, err))
|
||||||
|
|
||||||
found = False
|
if unit:
|
||||||
is_initd = sysv_exists(unit)
|
found = False
|
||||||
is_systemd = False
|
is_initd = sysv_exists(unit)
|
||||||
|
is_systemd = False
|
||||||
|
|
||||||
# check service data, cannot error out on rc as it changes across versions, assume not found
|
# check service data, cannot error out on rc as it changes across versions, assume not found
|
||||||
(rc, out, err) = module.run_command("%s show '%s'" % (systemctl, unit))
|
(rc, out, err) = module.run_command("%s show '%s'" % (systemctl, unit))
|
||||||
|
|
||||||
if request_was_ignored(out) or request_was_ignored(err):
|
if request_was_ignored(out) or request_was_ignored(err):
|
||||||
# fallback list-unit-files as show does not work on some systems (chroot)
|
# fallback list-unit-files as show does not work on some systems (chroot)
|
||||||
# not used as primary as it skips some services (like those using init.d) and requires .service/etc notation
|
# not used as primary as it skips some services (like those using init.d) and requires .service/etc notation
|
||||||
(rc, out, err) = module.run_command("%s list-unit-files '%s'" % (systemctl, unit))
|
(rc, out, err) = module.run_command("%s list-unit-files '%s'" % (systemctl, unit))
|
||||||
if rc == 0:
|
if rc == 0:
|
||||||
is_systemd = True
|
is_systemd = True
|
||||||
|
|
||||||
elif rc == 0:
|
elif rc == 0:
|
||||||
# load return of systemctl show into dictionary for easy access and return
|
# load return of systemctl show into dictionary for easy access and return
|
||||||
multival = []
|
multival = []
|
||||||
if out:
|
if out:
|
||||||
k = None
|
k = None
|
||||||
for line in to_native(out).split('\n'): # systemd can have multiline values delimited with {}
|
for line in to_native(out).split('\n'): # systemd can have multiline values delimited with {}
|
||||||
if line.strip():
|
if line.strip():
|
||||||
if k is None:
|
if k is None:
|
||||||
if '=' in line:
|
if '=' in line:
|
||||||
k,v = line.split('=', 1)
|
k,v = line.split('=', 1)
|
||||||
if v.lstrip().startswith('{'):
|
if v.lstrip().startswith('{'):
|
||||||
if not v.rstrip().endswith('}'):
|
if not v.rstrip().endswith('}'):
|
||||||
multival.append(line)
|
multival.append(line)
|
||||||
continue
|
continue
|
||||||
result['status'][k] = v.strip()
|
result['status'][k] = v.strip()
|
||||||
k = None
|
k = None
|
||||||
else:
|
|
||||||
if line.rstrip().endswith('}'):
|
|
||||||
result['status'][k] = '\n'.join(multival).strip()
|
|
||||||
multival = []
|
|
||||||
k = None
|
|
||||||
else:
|
else:
|
||||||
multival.append(line)
|
if line.rstrip().endswith('}'):
|
||||||
|
result['status'][k] = '\n'.join(multival).strip()
|
||||||
|
multival = []
|
||||||
|
k = None
|
||||||
|
else:
|
||||||
|
multival.append(line)
|
||||||
|
|
||||||
is_systemd = 'LoadState' in result['status'] and result['status']['LoadState'] != 'not-found'
|
is_systemd = 'LoadState' in result['status'] and result['status']['LoadState'] != 'not-found'
|
||||||
|
|
||||||
# Check for loading error
|
# Check for loading error
|
||||||
if is_systemd and 'LoadError' in result['status']:
|
if is_systemd and 'LoadError' in result['status']:
|
||||||
module.fail_json(msg="Error loading unit file '%s': %s" % (unit, result['status']['LoadError']))
|
module.fail_json(msg="Error loading unit file '%s': %s" % (unit, result['status']['LoadError']))
|
||||||
else:
|
|
||||||
# Check for systemctl command
|
|
||||||
module.run_command(systemctl, check_rc=True)
|
|
||||||
|
|
||||||
# Does service exist?
|
|
||||||
found = is_systemd or is_initd
|
|
||||||
if is_initd and not is_systemd:
|
|
||||||
module.warn('The service (%s) is actually an init script but the system is managed by systemd' % unit)
|
|
||||||
|
|
||||||
# mask/unmask the service, if requested, can operate on services before they are installed
|
|
||||||
if module.params['masked'] is not None:
|
|
||||||
# state is not masked unless systemd affirms otherwise
|
|
||||||
masked = ('LoadState' in result['status'] and result['status']['LoadState'] == 'masked')
|
|
||||||
|
|
||||||
if masked != module.params['masked']:
|
|
||||||
result['changed'] = True
|
|
||||||
if module.params['masked']:
|
|
||||||
action = 'mask'
|
|
||||||
else:
|
|
||||||
action = 'unmask'
|
|
||||||
|
|
||||||
if not module.check_mode:
|
|
||||||
(rc, out, err) = module.run_command("%s %s '%s'" % (systemctl, action, unit))
|
|
||||||
if rc != 0:
|
|
||||||
# some versions of system CAN mask/unmask non existing services, we only fail on missing if they don't
|
|
||||||
fail_if_missing(module, found, unit, msg='host')
|
|
||||||
|
|
||||||
|
|
||||||
# Enable/disable service startup at boot if requested
|
|
||||||
if module.params['enabled'] is not None:
|
|
||||||
|
|
||||||
if module.params['enabled']:
|
|
||||||
action = 'enable'
|
|
||||||
else:
|
else:
|
||||||
action = 'disable'
|
# Check for systemctl command
|
||||||
|
module.run_command(systemctl, check_rc=True)
|
||||||
|
|
||||||
fail_if_missing(module, found, unit, msg='host')
|
# Does service exist?
|
||||||
|
found = is_systemd or is_initd
|
||||||
|
if is_initd and not is_systemd:
|
||||||
|
module.warn('The service (%s) is actually an init script but the system is managed by systemd' % unit)
|
||||||
|
|
||||||
# do we need to enable the service?
|
# mask/unmask the service, if requested, can operate on services before they are installed
|
||||||
enabled = False
|
if module.params['masked'] is not None:
|
||||||
(rc, out, err) = module.run_command("%s is-enabled '%s'" % (systemctl, unit))
|
# state is not masked unless systemd affirms otherwise
|
||||||
|
masked = ('LoadState' in result['status'] and result['status']['LoadState'] == 'masked')
|
||||||
|
|
||||||
# check systemctl result or if it is a init script
|
if masked != module.params['masked']:
|
||||||
if rc == 0:
|
result['changed'] = True
|
||||||
enabled = True
|
if module.params['masked']:
|
||||||
elif rc == 1:
|
action = 'mask'
|
||||||
# if not a user service and both init script and unit file exist stdout should have enabled/disabled, otherwise use rc entries
|
|
||||||
if not module.params['user'] and \
|
|
||||||
is_initd and \
|
|
||||||
(not out.strip().endswith('disabled') or sysv_is_enabled(unit)):
|
|
||||||
|
|
||||||
enabled = True
|
|
||||||
|
|
||||||
# default to current state
|
|
||||||
result['enabled'] = enabled
|
|
||||||
|
|
||||||
# Change enable/disable if needed
|
|
||||||
if enabled != module.params['enabled']:
|
|
||||||
result['changed'] = True
|
|
||||||
if not module.check_mode:
|
|
||||||
(rc, out, err) = module.run_command("%s %s '%s'" % (systemctl, action, unit))
|
|
||||||
if rc != 0:
|
|
||||||
module.fail_json(msg="Unable to %s service %s: %s" % (action, unit, out + err))
|
|
||||||
|
|
||||||
result['enabled'] = not enabled
|
|
||||||
|
|
||||||
# set service state if requested
|
|
||||||
if module.params['state'] is not None:
|
|
||||||
fail_if_missing(module, found, unit, msg="host")
|
|
||||||
|
|
||||||
# default to desired state
|
|
||||||
result['state'] = module.params['state']
|
|
||||||
|
|
||||||
# What is current service state?
|
|
||||||
if 'ActiveState' in result['status']:
|
|
||||||
action = None
|
|
||||||
if module.params['state'] == 'started':
|
|
||||||
if not is_running_service(result['status']):
|
|
||||||
action = 'start'
|
|
||||||
elif module.params['state'] == 'stopped':
|
|
||||||
if is_running_service(result['status']):
|
|
||||||
action = 'stop'
|
|
||||||
else:
|
|
||||||
if not is_running_service(result['status']):
|
|
||||||
action = 'start'
|
|
||||||
else:
|
else:
|
||||||
action = module.params['state'][:-2] # remove 'ed' from restarted/reloaded
|
action = 'unmask'
|
||||||
result['state'] = 'started'
|
|
||||||
|
|
||||||
if action:
|
if not module.check_mode:
|
||||||
|
(rc, out, err) = module.run_command("%s %s '%s'" % (systemctl, action, unit))
|
||||||
|
if rc != 0:
|
||||||
|
# some versions of system CAN mask/unmask non existing services, we only fail on missing if they don't
|
||||||
|
fail_if_missing(module, found, unit, msg='host')
|
||||||
|
|
||||||
|
|
||||||
|
# Enable/disable service startup at boot if requested
|
||||||
|
if module.params['enabled'] is not None:
|
||||||
|
|
||||||
|
if module.params['enabled']:
|
||||||
|
action = 'enable'
|
||||||
|
else:
|
||||||
|
action = 'disable'
|
||||||
|
|
||||||
|
fail_if_missing(module, found, unit, msg='host')
|
||||||
|
|
||||||
|
# do we need to enable the service?
|
||||||
|
enabled = False
|
||||||
|
(rc, out, err) = module.run_command("%s is-enabled '%s'" % (systemctl, unit))
|
||||||
|
|
||||||
|
# check systemctl result or if it is a init script
|
||||||
|
if rc == 0:
|
||||||
|
enabled = True
|
||||||
|
elif rc == 1:
|
||||||
|
# if not a user service and both init script and unit file exist stdout should have enabled/disabled, otherwise use rc entries
|
||||||
|
if not module.params['user'] and \
|
||||||
|
is_initd and \
|
||||||
|
(not out.strip().endswith('disabled') or sysv_is_enabled(unit)):
|
||||||
|
|
||||||
|
enabled = True
|
||||||
|
|
||||||
|
# default to current state
|
||||||
|
result['enabled'] = enabled
|
||||||
|
|
||||||
|
# Change enable/disable if needed
|
||||||
|
if enabled != module.params['enabled']:
|
||||||
result['changed'] = True
|
result['changed'] = True
|
||||||
if not module.check_mode:
|
if not module.check_mode:
|
||||||
(rc, out, err) = module.run_command("%s %s '%s'" % (systemctl, action, unit))
|
(rc, out, err) = module.run_command("%s %s '%s'" % (systemctl, action, unit))
|
||||||
if rc != 0:
|
if rc != 0:
|
||||||
module.fail_json(msg="Unable to %s service %s: %s" % (action, unit, err))
|
module.fail_json(msg="Unable to %s service %s: %s" % (action, unit, out + err))
|
||||||
else:
|
|
||||||
# this should not happen?
|
result['enabled'] = not enabled
|
||||||
module.fail_json(msg="Service is in unknown state", status=result['status'])
|
|
||||||
|
# set service state if requested
|
||||||
|
if module.params['state'] is not None:
|
||||||
|
fail_if_missing(module, found, unit, msg="host")
|
||||||
|
|
||||||
|
# default to desired state
|
||||||
|
result['state'] = module.params['state']
|
||||||
|
|
||||||
|
# What is current service state?
|
||||||
|
if 'ActiveState' in result['status']:
|
||||||
|
action = None
|
||||||
|
if module.params['state'] == 'started':
|
||||||
|
if not is_running_service(result['status']):
|
||||||
|
action = 'start'
|
||||||
|
elif module.params['state'] == 'stopped':
|
||||||
|
if is_running_service(result['status']):
|
||||||
|
action = 'stop'
|
||||||
|
else:
|
||||||
|
if not is_running_service(result['status']):
|
||||||
|
action = 'start'
|
||||||
|
else:
|
||||||
|
action = module.params['state'][:-2] # remove 'ed' from restarted/reloaded
|
||||||
|
result['state'] = 'started'
|
||||||
|
|
||||||
|
if action:
|
||||||
|
result['changed'] = True
|
||||||
|
if not module.check_mode:
|
||||||
|
(rc, out, err) = module.run_command("%s %s '%s'" % (systemctl, action, unit))
|
||||||
|
if rc != 0:
|
||||||
|
module.fail_json(msg="Unable to %s service %s: %s" % (action, unit, err))
|
||||||
|
else:
|
||||||
|
# this should not happen?
|
||||||
|
module.fail_json(msg="Service is in unknown state", status=result['status'])
|
||||||
|
|
||||||
|
|
||||||
module.exit_json(**result)
|
module.exit_json(**result)
|
||||||
|
|
Loading…
Reference in a new issue