You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.8 KiB
Python
55 lines
1.8 KiB
Python
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,
|
|
}
|