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, }