system/service.py: fix false-positive service enablement on FreeBSD. (#4283)

sysrc(8) does not exit with non-zero status when encountering a
permission error.

By using service(8) `service <name> enabled`, we now check the actual
semantics expressed through calling sysrc(8), i.e. we check if the
service enablement worked from the rc(8) system's perspective.

Note that in case service(8) detects the wrong value is still set,
we still output the sysrc(8) output in the fail_json() call:
the user can derive the exact reason of failure from sysrc(8) output.
pull/18777/head
Christian Schwarz 8 years ago committed by Matt Clay
parent f57ece661f
commit e526b2ad3d

@ -1005,9 +1005,14 @@ class FreeBsdService(Service):
if self.module.check_mode: if self.module.check_mode:
self.module.exit_json(changed=True, msg="changing service enablement") self.module.exit_json(changed=True, msg="changing service enablement")
rc, stdout, stderr = self.execute_command("%s %s=\"%s\"" % (self.sysrc_cmd, self.rcconf_key, self.rcconf_value ) ) rc, change_stdout, change_stderr = self.execute_command("%s %s=\"%s\"" % (self.sysrc_cmd, self.rcconf_key, self.rcconf_value ) )
if rc != 0: if rc != 0:
self.module.fail_json(msg="unable to set rcvar using sysrc", stdout=stdout, stderr=stderr) self.module.fail_json(msg="unable to set rcvar using sysrc", stdout=change_stdout, stderr=change_stderr)
# sysrc does not exit with code 1 on permission error => validate successful change using service(8)
rc, check_stdout, check_stderr = self.execute_command("%s %s %s" % (self.svc_cmd, self.name, "enabled"))
if self.enable != (rc == 0): # rc = 0 indicates enabled service, rc = 1 indicates disabled service
self.module.fail_json(msg="unable to set rcvar: sysrc did not change value", stdout=change_stdout, stderr=change_stderr)
else: else:
self.changed = False self.changed = False

Loading…
Cancel
Save