From 7aae8a94f2baf32850937536b1d4a2740e554a9f Mon Sep 17 00:00:00 2001 From: "patchback[bot]" <45432694+patchback[bot]@users.noreply.github.com> Date: Mon, 21 Apr 2025 13:20:53 +0200 Subject: [PATCH] [PR #10005/e0a283bb backport][stable-10] Fix method exists in sysrc (#10034) Fix method exists in sysrc (#10005) * Fix method exists. * Add changelog fragment. * Update the exists method to pass the present method tests. * Replace f-string formatting. * Update changelogs/fragments/10005-fix-method-exists-in-sysrc.yml Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com> * Add comment to the method exists. * Update plugins/modules/sysrc.py Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com> * Update changelogs/fragments/10005-fix-method-exists-in-sysrc.yml Co-authored-by: Felix Fontein * The improved comment formatting fixed. --------- Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com> Co-authored-by: Felix Fontein (cherry picked from commit e0a283bb36ca514468a5513ad728be5940a732fe) Co-authored-by: Vladimir Botka --- .../10005-fix-method-exists-in-sysrc.yml | 2 ++ plugins/modules/sysrc.py | 26 ++++++++++--------- 2 files changed, 16 insertions(+), 12 deletions(-) create mode 100644 changelogs/fragments/10005-fix-method-exists-in-sysrc.yml diff --git a/changelogs/fragments/10005-fix-method-exists-in-sysrc.yml b/changelogs/fragments/10005-fix-method-exists-in-sysrc.yml new file mode 100644 index 0000000000..218a9eca06 --- /dev/null +++ b/changelogs/fragments/10005-fix-method-exists-in-sysrc.yml @@ -0,0 +1,2 @@ +bugfixes: + - sysrc - no longer always reporting ``changed=true`` when ``state=absent``. This fixes the method ``exists()`` (https://github.com/ansible-collections/community.general/issues/10004, https://github.com/ansible-collections/community.general/pull/10005). diff --git a/plugins/modules/sysrc.py b/plugins/modules/sysrc.py index d93bccd620..3387483e46 100644 --- a/plugins/modules/sysrc.py +++ b/plugins/modules/sysrc.py @@ -122,14 +122,19 @@ class Sysrc(object): return err.find("unknown variable") > 0 or out.find("unknown variable") > 0 def exists(self): - # sysrc doesn't really use exit codes - (rc, out, err) = self.run_sysrc(self.name) + """ + Tests whether the name is in the file. If parameter value is defined, + then tests whether name=value is in the file. These tests are necessary + because sysrc doesn't use exit codes. Instead, let sysrc read the + file's content and create a dictionary comprising the configuration. + Use this dictionary to preform the tests. + """ + (rc, out, err) = self.run_sysrc('-e', '-a') + conf = dict([i.split('=') for i in out.splitlines()]) if self.value is None: - regex = "%s: " % re.escape(self.name) + return self.name in conf else: - regex = "%s: %s$" % (re.escape(self.name), re.escape(self.value)) - - return not self.has_unknown_variable(out, err) and re.match(regex, out) is not None + return self.name in conf and conf[self.name] == '"%s"' % self.value def contains(self): (rc, out, err) = self.run_sysrc('-n', self.name) @@ -142,13 +147,10 @@ class Sysrc(object): if self.exists(): return - if self.module.check_mode: - self.changed = True - return + if not self.module.check_mode: + (rc, out, err) = self.run_sysrc("%s=%s" % (self.name, self.value)) - (rc, out, err) = self.run_sysrc("%s=%s" % (self.name, self.value)) - if out.find("%s:" % self.name) == 0 and re.search("-> %s$" % re.escape(self.value), out) is not None: - self.changed = True + self.changed = True def absent(self): if not self.exists():