Added filter_plugin dns_entries
parent
213864f32e
commit
502444d758
@ -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…
Reference in New Issue