diff --git a/filter_plugins/dns_entries.py b/filter_plugins/dns_entries.py new file mode 100644 index 0000000..899b09d --- /dev/null +++ b/filter_plugins/dns_entries.py @@ -0,0 +1,54 @@ +from ansible.module_utils._text import to_native + +import re + +ENTRY_RE = re.compile(r'^\s*(?P\S+)(\s+(?P\d+))?(\s+(?P[a-zA-Z]+))?\s+(?P[a-zA-Z]+)\s+(?P\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, + }