]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
py/dnsserver: add record_from_string helper function
authorDouglas Bagnall <douglas.bagnall@catalyst.net.nz>
Thu, 1 Apr 2021 02:28:49 +0000 (15:28 +1300)
committerDouglas Bagnall <dbagnall@samba.org>
Thu, 8 Apr 2021 21:54:35 +0000 (21:54 +0000)
Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andreas Schneider <asn@samba.org>
python/samba/dnsserver.py

index 42de46b8d4d40e10684005c412a8ef06563d1e88..a6e2136b1dc0a786dbd08c80b3a5695fc10b5e7b 100644 (file)
@@ -255,3 +255,35 @@ class TXTRecord(dnsserver.DNS_RPC_RECORD):
     def from_string(cls, data, sep=None, **kwargs):
         slist = shlex.split(data)
         return cls(slist, **kwargs)
+
+
+#
+# Don't add new Record types after this line
+
+_RECORD_TYPE_LUT = {}
+def _setup_record_type_lut():
+    for k, v in globals().items():
+        if k[-6:] == 'Record':
+            k = k[:-6]
+            flag = getattr(dnsp, 'DNS_TYPE_' + k)
+            _RECORD_TYPE_LUT[k] = v
+            _RECORD_TYPE_LUT[flag] = v
+
+_setup_record_type_lut()
+del _setup_record_type_lut
+
+
+def record_from_string(t, data, sep=None, **kwargs):
+    """Get a DNS record of type t based on the data string.
+    Additional keywords (ttl, rank, etc) can be passed in.
+
+    t can be a dnsp.DNS_TYPE_* integer or a string like "A", "TXT", etc.
+    """
+    if isinstance(t, str):
+        t = t.upper()
+    try:
+        Record = _RECORD_TYPE_LUT[t]
+    except KeyError as e:
+        raise DNSParseError("Unsupported record type") from e
+
+    return Record.from_string(data, sep=sep, **kwargs)