From 89febea555b4da1daafa1a0d1d6e3ef596572e2c Mon Sep 17 00:00:00 2001 From: Jan-Piet Mens Date: Sat, 29 Oct 2022 09:40:45 +0200 Subject: [PATCH] add option to force dig lookup to return empty list instead of list of empty strings. fixes https://github.com/ansible-collections/community.general/issues/5428 --- .../5439-dig-return-empty-result.yml | 2 ++ plugins/lookup/dig.py | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 changelogs/fragments/5439-dig-return-empty-result.yml diff --git a/changelogs/fragments/5439-dig-return-empty-result.yml b/changelogs/fragments/5439-dig-return-empty-result.yml new file mode 100644 index 00000000000..8d7d2090df1 --- /dev/null +++ b/changelogs/fragments/5439-dig-return-empty-result.yml @@ -0,0 +1,2 @@ +bugfixes: + - dig lookup plugin - add option to return empty result without empty strings, and return empty list instead of ``NXDOMAIN`` (https://github.com/ansible-collections/community.general/pull/5439, https://github.com/ansible-collections/community.general/issues/5428). diff --git a/plugins/lookup/dig.py b/plugins/lookup/dig.py index d7a7d8ec28b..3d91152aeae 100644 --- a/plugins/lookup/dig.py +++ b/plugins/lookup/dig.py @@ -52,6 +52,13 @@ default: false type: bool version_added: 5.4.0 + real_empty: + description: + - Return empty result without empty strings, and return empty list instead of C(NXDOMAIN). + - The default for this option will likely change to C(true) in the future. + default: false + type: bool + version_added: 6.0.0 notes: - ALL is not a record per-se, merely the listed fields are available for any record results you retrieve in the form of a dictionary. - While the 'dig' lookup plugin supports anything which dnspython supports out of the box, only a subset can be converted into a dictionary. @@ -285,6 +292,7 @@ def run(self, terms, variables=None, **kwargs): qtype = 'A' flat = True fail_on_error = False + real_empty = False rdclass = dns.rdataclass.from_text('IN') for t in terms: @@ -325,6 +333,8 @@ def run(self, terms, variables=None, **kwargs): myres.retry_servfail = boolean(arg) elif opt == 'fail_on_error': fail_on_error = boolean(arg) + elif opt == 'real_empty': + real_empty = boolean(arg) continue @@ -375,15 +385,18 @@ def run(self, terms, variables=None, **kwargs): except dns.resolver.NXDOMAIN as err: if fail_on_error: raise AnsibleError("Lookup failed: %s" % str(err)) - ret.append('NXDOMAIN') + if not real_empty: + ret.append('NXDOMAIN') except dns.resolver.NoAnswer as err: if fail_on_error: raise AnsibleError("Lookup failed: %s" % str(err)) - ret.append("") + if not real_empty: + ret.append("") except dns.resolver.Timeout as err: if fail_on_error: raise AnsibleError("Lookup failed: %s" % str(err)) - ret.append('') + if not real_empty: + ret.append("") except dns.exception.DNSException as err: raise AnsibleError("dns.resolver unhandled exception %s" % to_native(err))