Added filter_plugin dns_entries

dehydrated
Felix Stupp 4 years ago
parent 213864f32e
commit 502444d758
Signed by: zocker
GPG Key ID: 93E1BD26F6B02FB7

@ -0,0 +1,54 @@
from ansible.module_utils._text import to_native
import re
ENTRY_RE = re.compile(r'^\s*(?P<domain>\S+)(\s+(?P<ttl>\d+))?(\s+(?P<class>[a-zA-Z]+))?\s+(?P<type>[a-zA-Z]+)\s+(?P<data>\S(.*\S)?)\s*$')
def dns_entry_interpeter(entry):
if isinstance(entry, dict):
return entry
m = ENTRY_RE.match(entry)
if not m:
raise Exception("Entry not in expected format: %s" % to_native(entry))
ret = {}
for key, val in m.groupdict().items():
if val is not None:
if key in ["ttl"]:
ret[key] = int(val)
else:
ret[key] = val
return ret
def dns_entry_equal(a, b):
return a.get("domain", "@") == b.get("domain", "@") and a.get("ttl", -1) == b.get("ttl", -1) and a.get("class", "IN") == b.get("class", "IN") and a["type"] == b["type"]
def dns_entries_combiner(entries):
ret = []
for a in entries:
found = False
for b in ret:
if dns_entry_equal(a, b):
found = True
if not isinstance(b["data"], list):
b["data"] = [b["data"]]
if isinstance(a["data"], list):
b["data"] += a["data"]
else:
b["data"].append(a["data"])
break
if not found:
ret.append(a)
return ret
def dns_entries_interpreter(entries):
if isinstance(entries, str):
entries = [e for e in entries.splitlines() if e]
return dns_entries_combiner(map(dns_entry_interpeter, entries))
class FilterModule(object):
def filters(self):
return {
'dns_entry_interpreter': dns_entry_interpeter,
'dns_entries_combiner': dns_entries_combiner,
'dns_entries_interpreter': dns_entries_interpreter,
}
Loading…
Cancel
Save