[SCM] Samba Shared Repository - branch master updated

Douglas Bagnall dbagnall at samba.org
Thu Apr 8 23:04:02 UTC 2021


The branch, master has been updated
       via  c033fdf5996 pytests/dns_forwarder: remove unused import
       via  99a88cf82eb samba-tool dns: use dnsserver.flag_from_string()
       via  87e71cd6116 samba-tool dns: use dnsserver.record_from_string
       via  df60fe15b33 pytests/dns: use dnsserver.record_from_string
       via  55c4f75a282 pytests/dns: import dnsserver.TXTRecord directly
       via  579e56bc3da pytest/dcerpc/dnsserver.py: use dnsserver.flag_from_string
       via  a59dcfcfd1f pytest/dcerpcdnsserver: use record_from_string helper
       via  4ce9a0d4879 py/dnsserver add flag from string function
       via  a572a260535 py/dnsserver: add record_from_string helper function
       via  d84d10bb0e7 py/dnsserver: add .from_string() methods
       via  bddce1f7e69 py/dnsserver: remove workaround of fixed bug
       via  3bb4dbecc30 py/provision/sambadns: Add a comment about DNS types
       via  dbffeeefd86 py/provision/sambadns: rename CNameRecord -> CNAMERecord
       via  16254139617 py/dnsserver: replace obsolete comments with useful ones
       via  bdc2567324c pydns: rename s/CNameRecord/CNAMERecord/ for consistency
      from  0332ddde1a1 VFS: Remove SMB_VFS_SET_DOS_ATTRIBUTE, no longer used

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit c033fdf59962c345dc34f02ede4d6ffef4ac9c44
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Apr 7 15:34:52 2021 +1200

    pytests/dns_forwarder: remove unused import
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andreas Schneider <asn at samba.org>
    
    Autobuild-User(master): Douglas Bagnall <dbagnall at samba.org>
    Autobuild-Date(master): Thu Apr  8 23:03:52 UTC 2021 on sn-devel-184

commit 99a88cf82eb24ab5ca668b4bb7be346783fa81fe
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Mar 26 20:52:20 2021 +1300

    samba-tool dns: use dnsserver.flag_from_string()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 87e71cd61168bbd6ed61484c98b84a72fb93482d
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Mar 26 20:41:29 2021 +1300

    samba-tool dns: use dnsserver.record_from_string
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit df60fe15b33ba2ffa957758e30c5d219dee71555
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Apr 7 15:28:11 2021 +1200

    pytests/dns: use dnsserver.record_from_string
    
    not netcmd.dns.data_to_dns_record, which is a UI function.
    
    The only practical difference is it will raise DNSParseError, not CommandError.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 55c4f75a282f2e56a8eb2ab473e4b9ba8d9c4daa
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Apr 7 15:16:58 2021 +1200

    pytests/dns: import dnsserver.TXTRecord directly
    
    Not through samba-tool, which should not be used as a library.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 579e56bc3dac70d0458137e3ddde06ad607777ff
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Mar 26 21:04:20 2021 +1300

    pytest/dcerpc/dnsserver.py: use dnsserver.flag_from_string
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit a59dcfcfd1fc7cd91ff3af9ed8ba404245f18263
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Sat Mar 27 15:41:10 2021 +1300

    pytest/dcerpcdnsserver: use record_from_string helper
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 4ce9a0d4879a717fad7830dd70a1f2200d879db2
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Apr 1 15:29:32 2021 +1300

    py/dnsserver add flag from string function
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit a572a260535da0956e324a092cfd459a1c5b4205
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Apr 1 15:28:49 2021 +1300

    py/dnsserver: add record_from_string helper function
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit d84d10bb0e71a7c27c8a880c5eb2a98e23778fc9
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Apr 7 13:34:50 2021 +1200

    py/dnsserver: add .from_string() methods
    
    The logic to parse DNS value strings (e.g. "example.com 10" for an MX,
    which needs to be split on the space) is repeated at least in
    samba-tool dns and tests/dcerpc/dnsserver.py. Here we bring it
    together so we can do it once.
    
    The sep= keyword allows callers to separate on all runs of
    whitespace (the default, as samba-tool dns does) or, using sep='', to
    separate on true spaces only.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit bddce1f7e6989bcba704d8a1bdc7db9128340b75
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Apr 1 15:26:01 2021 +1300

    py/dnsserver: remove workaround of fixed bug
    
    We used to do something wrong with the refcounts, but we don't anymore,
    so we don't need this confusing nonsense.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 3bb4dbecc3020a7eae58b06d5d312be6d4979dfb
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Apr 1 15:23:48 2021 +1300

    py/provision/sambadns: Add a comment about DNS types
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit dbffeeefd86cb4ec1cb551a696175f9624bbd151
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Sat Mar 27 15:55:03 2021 +1300

    py/provision/sambadns: rename CNameRecord -> CNAMERecord
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 16254139617f7a56cb5d88cf6a34d9d83ecdbd91
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Mar 26 20:42:49 2021 +1300

    py/dnsserver: replace obsolete comments with useful ones
    
    The replaced comment was about a long fixed Python reference counting bug.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit bdc2567324c6b8069d3fd809ed1d1d68bd92a9d7
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Mar 26 18:22:17 2021 +1300

    pydns: rename s/CNameRecord/CNAMERecord/ for consistency
    
    Everything else is TXTRecord, SRVRrcord, SOARecord.
    
    Making CNAME the same allows easier lookups.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andreas Schneider <asn at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 python/samba/dnsserver.py              | 167 ++++++++++++++++++++++++++++-----
 python/samba/join.py                   |   4 +-
 python/samba/netcmd/dns.py             |  80 ++--------------
 python/samba/provision/sambadns.py     |  15 ++-
 python/samba/tests/dcerpc/dnsserver.py |  44 ++-------
 python/samba/tests/dns.py              |  24 ++---
 python/samba/tests/dns_forwarder.py    |   2 +-
 python/samba/tests/dns_wildcard.py     |   6 +-
 source4/scripting/bin/samba_upgradedns |   4 +-
 9 files changed, 192 insertions(+), 154 deletions(-)


Changeset truncated at 500 lines:

diff --git a/python/samba/dnsserver.py b/python/samba/dnsserver.py
index 6d8a72919df..a9fcb7662e8 100644
--- a/python/samba/dnsserver.py
+++ b/python/samba/dnsserver.py
@@ -16,12 +16,32 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 
+import shlex
 from samba.dcerpc import dnsserver, dnsp
 
+# Note: these are not quite the same as similar looking classes in
+# provision/sambadns.py -- those ones are based on
+# dnsp.DnssrvRpcRecord, these are based on dnsserver.DNS_RPC_RECORD.
+# They encode the same information in slightly different ways.
 #
-# Always create a copy of strings when creating DNS_RPC_RECORDs
-# to overcome the bug in pidl generated python bindings.
+# DNS_RPC_RECORD structures ([MS-DNSP]2.2.2.2.5 "DNS_RPC_RECORD") are
+# used on the wire by DnssrvEnumRecords2. The dnsp.DnssrvRpcRecord
+# versions have the in-database version of the same information, where
+# the flags field is unpacked, and the struct ordering is different.
+# See [MS-DNSP] 2.3.2.2 "DnsRecord".
 #
+# In both cases the structure and contents of .data depend on .wType.
+# For example, if .wType is DNS_TYPE_A, .data is an IPv4 address. If
+# the .wType is changed to DNS_TYPE_CNAME, the contents of .data will
+# be interpreted as a cname blob, but the bytes there will still be
+# those of the IPv4 address. If you don't also set the .data you may
+# encounter stability problems. These DNS_RPC_RECORD subclasses
+# attempt to hide that from you, but are only pretending -- any of
+# them can represent any type of record.
+
+
+class DNSParseError(ValueError):
+    pass
 
 
 class ARecord(dnsserver.DNS_RPC_RECORD):
@@ -32,8 +52,11 @@ class ARecord(dnsserver.DNS_RPC_RECORD):
         self.dwFlags = rank | node_flag
         self.dwSerial = serial
         self.dwTtlSeconds = ttl
-        self._ip_addr = ip_addr[:]
-        self.data = self._ip_addr
+        self.data = ip_addr
+
+    @classmethod
+    def from_string(cls, data, sep=None, **kwargs):
+        return cls(data, **kwargs)
 
 
 class AAAARecord(dnsserver.DNS_RPC_RECORD):
@@ -45,8 +68,11 @@ class AAAARecord(dnsserver.DNS_RPC_RECORD):
         self.dwFlags = rank | node_flag
         self.dwSerial = serial
         self.dwTtlSeconds = ttl
-        self._ip6_addr = ip6_addr[:]
-        self.data = self._ip6_addr
+        self.data = ip6_addr
+
+    @classmethod
+    def from_string(cls, data, sep=None, **kwargs):
+        return cls(data, **kwargs)
 
 
 class PTRRecord(dnsserver.DNS_RPC_RECORD):
@@ -58,28 +84,34 @@ class PTRRecord(dnsserver.DNS_RPC_RECORD):
         self.dwFlags = rank | node_flag
         self.dwSerial = serial
         self.dwTtlSeconds = ttl
-        self._ptr = ptr[:]
         ptr_name = dnsserver.DNS_RPC_NAME()
-        ptr_name.str = self._ptr
+        ptr_name.str = ptr
         ptr_name.len = len(ptr)
         self.data = ptr_name
 
+    @classmethod
+    def from_string(cls, data, sep=None, **kwargs):
+        return cls(data, **kwargs)
 
-class CNameRecord(dnsserver.DNS_RPC_RECORD):
+
+class CNAMERecord(dnsserver.DNS_RPC_RECORD):
 
     def __init__(self, cname, serial=1, ttl=900, rank=dnsp.DNS_RANK_ZONE,
                  node_flag=0):
-        super(CNameRecord, self).__init__()
+        super().__init__()
         self.wType = dnsp.DNS_TYPE_CNAME
         self.dwFlags = rank | node_flag
         self.dwSerial = serial
         self.dwTtlSeconds = ttl
-        self._cname = cname[:]
         cname_name = dnsserver.DNS_RPC_NAME()
-        cname_name.str = self._cname
+        cname_name.str = cname
         cname_name.len = len(cname)
         self.data = cname_name
 
+    @classmethod
+    def from_string(cls, data, sep=None, **kwargs):
+        return cls(data, **kwargs)
+
 
 class NSRecord(dnsserver.DNS_RPC_RECORD):
 
@@ -90,12 +122,15 @@ class NSRecord(dnsserver.DNS_RPC_RECORD):
         self.dwFlags = rank | node_flag
         self.dwSerial = serial
         self.dwTtlSeconds = ttl
-        self._dns_server = dns_server[:]
         ns = dnsserver.DNS_RPC_NAME()
-        ns.str = self._dns_server
+        ns.str = dns_server
         ns.len = len(dns_server)
         self.data = ns
 
+    @classmethod
+    def from_string(cls, data, sep=None, **kwargs):
+        return cls(data, **kwargs)
+
 
 class MXRecord(dnsserver.DNS_RPC_RECORD):
 
@@ -106,13 +141,22 @@ class MXRecord(dnsserver.DNS_RPC_RECORD):
         self.dwFlags = rank | node_flag
         self.dwSerial = serial
         self.dwTtlSeconds = ttl
-        self._mail_server = mail_server[:]
         mx = dnsserver.DNS_RPC_RECORD_NAME_PREFERENCE()
         mx.wPreference = preference
-        mx.nameExchange.str = self._mail_server
+        mx.nameExchange.str = mail_server
         mx.nameExchange.len = len(mail_server)
         self.data = mx
 
+    @classmethod
+    def from_string(cls, data, sep=None, **kwargs):
+        try:
+            server, priority = data.split(sep)
+            priority = int(priority)
+        except ValueError as e:
+            raise DNSParseError("MX data must have server and priority "
+                                "(space separated), not %r" % data) from e
+        return cls(server, priority, **kwargs)
+
 
 class SOARecord(dnsserver.DNS_RPC_RECORD):
 
@@ -124,20 +168,33 @@ class SOARecord(dnsserver.DNS_RPC_RECORD):
         self.dwFlags = rank | node_flag
         self.dwSerial = serial
         self.dwTtlSeconds = ttl
-        self._mname = mname[:]
-        self._rname = rname[:]
         soa = dnsserver.DNS_RPC_RECORD_SOA()
         soa.dwSerialNo = serial
         soa.dwRefresh = refresh
         soa.dwRetry = retry
         soa.dwExpire = expire
         soa.dwMinimumTtl = minimum
-        soa.NamePrimaryServer.str = self._mname
+        soa.NamePrimaryServer.str = mname
         soa.NamePrimaryServer.len = len(mname)
-        soa.ZoneAdministratorEmail.str = self._rname
+        soa.ZoneAdministratorEmail.str = rname
         soa.ZoneAdministratorEmail.len = len(rname)
         self.data = soa
 
+    @classmethod
+    def from_string(cls, data, sep=None, **kwargs):
+        args = data.split(sep)
+        if len(args) != 7:
+            raise DNSParseError('Data requires 7 space separated elements - '
+                                'nameserver, email, serial, '
+                                'refresh, retry, expire, minimumttl')
+        try:
+            for i in range(2, 7):
+                args[i] = int(args[i])
+        except ValueError as e:
+            raise DNSParseError("SOA serial, refresh, retry, expire, minimumttl' "
+                                "should be integers") from e
+        return cls(*args, **kwargs)
+
 
 class SRVRecord(dnsserver.DNS_RPC_RECORD):
 
@@ -148,15 +205,31 @@ class SRVRecord(dnsserver.DNS_RPC_RECORD):
         self.dwFlags = rank | node_flag
         self.dwSerial = serial
         self.dwTtlSeconds = ttl
-        self._target = target[:]
         srv = dnsserver.DNS_RPC_RECORD_SRV()
         srv.wPriority = priority
         srv.wWeight = weight
         srv.wPort = port
-        srv.nameTarget.str = self._target
+        srv.nameTarget.str = target
         srv.nameTarget.len = len(target)
         self.data = srv
 
+    @classmethod
+    def from_string(cls, data, sep=None, **kwargs):
+        try:
+            target, port, priority, weight = data.split(sep)
+        except ValueError as e:
+            raise DNSParseError("SRV data must have four space "
+                                "separated elements: "
+                                "server, port, priority, weight; "
+                                "not %r" % data) from e
+        try:
+            args = (target, int(port), int(priority), int(weight))
+        except ValueError as e:
+            raise DNSParseError("SRV port, priority, and weight "
+                                "must be integers") from e
+
+        return cls(*args, **kwargs)
+
 
 class TXTRecord(dnsserver.DNS_RPC_RECORD):
 
@@ -167,11 +240,8 @@ class TXTRecord(dnsserver.DNS_RPC_RECORD):
         self.dwFlags = rank | node_flag
         self.dwSerial = serial
         self.dwTtlSeconds = ttl
-        self._slist = []
-        for s in slist:
-            self._slist.append(s[:])
         names = []
-        for s in self._slist:
+        for s in slist:
             name = dnsserver.DNS_RPC_NAME()
             name.str = s
             name.len = len(s)
@@ -180,3 +250,48 @@ class TXTRecord(dnsserver.DNS_RPC_RECORD):
         txt.count = len(slist)
         txt.str = names
         self.data = txt
+
+    @classmethod
+    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)
+
+
+def flag_from_string(rec_type):
+    rtype = rec_type.upper()
+    try:
+        return getattr(dnsp, 'DNS_TYPE_' + rtype)
+    except AttributeError:
+        raise DNSParseError('Unknown type of DNS record %s' % rec_type) from e
diff --git a/python/samba/join.py b/python/samba/join.py
index d78375441fb..97745a3901a 100644
--- a/python/samba/join.py
+++ b/python/samba/join.py
@@ -41,7 +41,7 @@ from samba import werror
 from base64 import b64encode
 from samba import WERRORError, NTSTATUSError
 from samba import sd_utils
-from samba.dnsserver import ARecord, AAAARecord, CNameRecord
+from samba.dnsserver import ARecord, AAAARecord, CNAMERecord
 import logging
 import random
 import time
@@ -1192,7 +1192,7 @@ class DCJoinContext(object):
                             % (msdcs_cname, msdcs_zone, cname_target))
 
             add_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
-            rec = CNameRecord(cname_target)
+            rec = CNAMERecord(cname_target)
             add_rec_buf.rec = rec
             dns_conn.DnssrvUpdateRecord2(client_version,
                                          0,
diff --git a/python/samba/netcmd/dns.py b/python/samba/netcmd/dns.py
index d4b06929aa3..a267c4105b5 100644
--- a/python/samba/netcmd/dns.py
+++ b/python/samba/netcmd/dns.py
@@ -40,7 +40,7 @@ from samba.netcmd import (
 )
 from samba.dcerpc import dnsp, dnsserver
 
-from samba.dnsserver import ARecord, AAAARecord, PTRRecord, CNameRecord, NSRecord, MXRecord, SOARecord, SRVRecord, TXTRecord
+from samba.dnsserver import record_from_string, DNSParseError, flag_from_string
 
 
 def dns_connect(server, lp, creds):
@@ -166,30 +166,10 @@ def dns_addr_array_string(array):
 
 
 def dns_type_flag(rec_type):
-    rtype = rec_type.upper()
-    if rtype == 'A':
-        record_type = dnsp.DNS_TYPE_A
-    elif rtype == 'AAAA':
-        record_type = dnsp.DNS_TYPE_AAAA
-    elif rtype == 'PTR':
-        record_type = dnsp.DNS_TYPE_PTR
-    elif rtype == 'NS':
-        record_type = dnsp.DNS_TYPE_NS
-    elif rtype == 'CNAME':
-        record_type = dnsp.DNS_TYPE_CNAME
-    elif rtype == 'SOA':
-        record_type = dnsp.DNS_TYPE_SOA
-    elif rtype == 'MX':
-        record_type = dnsp.DNS_TYPE_MX
-    elif rtype == 'SRV':
-        record_type = dnsp.DNS_TYPE_SRV
-    elif rtype == 'TXT':
-        record_type = dnsp.DNS_TYPE_TXT
-    elif rtype == 'ALL':
-        record_type = dnsp.DNS_TYPE_ALL
-    else:
-        raise CommandError('Unknown type of DNS record %s' % rec_type)
-    return record_type
+    try:
+        return flag_from_string(rec_type)
+    except DNSParseError as e:
+        raise CommandError(*e.args)
 
 
 def dns_client_version(cli_version):
@@ -406,51 +386,11 @@ def print_dnsrecords(outf, records):
 
 # Convert data into a dns record
 def data_to_dns_record(record_type, data):
-    if record_type == dnsp.DNS_TYPE_A:
-        rec = ARecord(data)
-    elif record_type == dnsp.DNS_TYPE_AAAA:
-        rec = AAAARecord(data)
-    elif record_type == dnsp.DNS_TYPE_PTR:
-        rec = PTRRecord(data)
-    elif record_type == dnsp.DNS_TYPE_CNAME:
-        rec = CNameRecord(data)
-    elif record_type == dnsp.DNS_TYPE_NS:
-        rec = NSRecord(data)
-    elif record_type == dnsp.DNS_TYPE_MX:
-        tmp = data.split()
-        if len(tmp) != 2:
-            raise CommandError('Data requires 2 elements - mail_server, preference')
-        mail_server = tmp[0]
-        preference = int(tmp[1])
-        rec = MXRecord(mail_server, preference)
-    elif record_type == dnsp.DNS_TYPE_SRV:
-        tmp = data.split()
-        if len(tmp) != 4:
-            raise CommandError('Data requires 4 elements - server, port, priority, weight')
-        server = tmp[0]
-        port = int(tmp[1])
-        priority = int(tmp[2])
-        weight = int(tmp[3])
-        rec = SRVRecord(server, port, priority=priority, weight=weight)
-    elif record_type == dnsp.DNS_TYPE_SOA:
-        tmp = data.split()
-        if len(tmp) != 7:
-            raise CommandError('Data requires 7 elements - nameserver, email, serial, '
-                               'refresh, retry, expire, minimumttl')
-        nameserver = tmp[0]
-        email = tmp[1]
-        serial = int(tmp[2])
-        refresh = int(tmp[3])
-        retry = int(tmp[4])
-        expire = int(tmp[5])
-        minimum = int(tmp[6])
-        rec = SOARecord(nameserver, email, serial=serial, refresh=refresh,
-                        retry=retry, expire=expire, minimum=minimum)
-    elif record_type == dnsp.DNS_TYPE_TXT:
-        slist = shlex.split(data)
-        rec = TXTRecord(slist)
-    else:
-        raise CommandError('Unsupported record type')
+    try:
+        rec = record_from_string(record_type, data)
+    except DNSParseError as e:
+        raise CommandError(*e.args) from None
+
     return rec
 
 
diff --git a/python/samba/provision/sambadns.py b/python/samba/provision/sambadns.py
index 8a5d8a93442..4ddde36b4cb 100644
--- a/python/samba/provision/sambadns.py
+++ b/python/samba/provision/sambadns.py
@@ -75,6 +75,15 @@ def get_dnsadmins_sid(samdb, domaindn):
     return dnsadmins_sid
 
 
+# Note: these classses are not quite the same as similar looking ones
+# in ../dnsserver.py -- those ones are based on
+# dnsserver.DNS_RPC_RECORD ([MS-DNSP]2.2.2.2.5 "DNS_RPC_RECORD"),
+# these are based on dnsp.DnssrvRpcRecord ([MS-DNSP] 2.3.2.2
+# "DnsRecord").
+#
+# They are not interchangeable or mergeable. If you're talking over
+# the wire you want those other ones; these are the on-disk format.
+
 class ARecord(dnsp.DnssrvRpcRecord):
 
     def __init__(self, ip_addr, serial=1, ttl=900, rank=dnsp.DNS_RANK_ZONE):
@@ -97,10 +106,10 @@ class AAAARecord(dnsp.DnssrvRpcRecord):
         self.data = ip6_addr
 
 
-class CNameRecord(dnsp.DnssrvRpcRecord):
+class CNAMERecord(dnsp.DnssrvRpcRecord):
 
     def __init__(self, cname, serial=1, ttl=900, rank=dnsp.DNS_RANK_ZONE):
-        super(CNameRecord, self).__init__()
+        super().__init__()
         self.wType = dnsp.DNS_TYPE_CNAME
         self.rank = rank
         self.dwSerial = serial
@@ -447,7 +456,7 @@ def add_ns_glue_record(samdb, container_dn, prefix, host):
 
 
 def add_cname_record(samdb, container_dn, prefix, host):
-    cname_record = CNameRecord(host)
+    cname_record = CNAMERecord(host)
     msg = ldb.Message(ldb.Dn(samdb, "%s,%s" % (prefix, container_dn)))
     msg["objectClass"] = ["top", "dnsNode"]
     msg["dnsRecord"] = ldb.MessageElement(ndr_pack(cname_record), ldb.FLAG_MOD_ADD, "dnsRecord")
diff --git a/python/samba/tests/dcerpc/dnsserver.py b/python/samba/tests/dcerpc/dnsserver.py
index 604add7e642..5f7aa378575 100644
--- a/python/samba/tests/dcerpc/dnsserver.py
+++ b/python/samba/tests/dcerpc/dnsserver.py
@@ -26,7 +26,7 @@ from samba.samdb import SamDB
 from samba.ndr import ndr_unpack, ndr_pack
 from samba.dcerpc import dnsp, dnsserver, security
 from samba.tests import RpcInterfaceTestCase, env_get_var_value
-from samba.netcmd.dns import ARecord, AAAARecord, PTRRecord, CNameRecord, NSRecord, MXRecord, SRVRecord, TXTRecord
+from samba.dnsserver import record_from_string, flag_from_string, ARecord
 from samba import sd_utils, descriptor
 from samba import WERRORError, werror
 
@@ -178,7 +178,7 @@ class DnsserverTests(RpcInterfaceTestCase):
                                                  self.custom_zone,
                                                  "@",
                                                  None,
-                                                 self.record_type_int(record_type_str),
+                                                 flag_from_string(record_type_str),
                                                  dnsserver.DNS_RPC_VIEW_AUTHORITY_DATA,
                                                  None,
                                                  None)
@@ -219,7 +219,7 @@ class DnsserverTests(RpcInterfaceTestCase):
                                                  self.custom_zone,
                                                  "@",
                                                  None,
-                                                 self.record_type_int(record_type_str),
+                                                 flag_from_string(record_type_str),
                                                  dnsserver.DNS_RPC_VIEW_AUTHORITY_DATA,
                                                  None,
                                                  None)
@@ -261,7 +261,7 @@ class DnsserverTests(RpcInterfaceTestCase):
                                                  self.custom_zone,
                                                  "a.b",
                                                  None,
-                                                 self.record_type_int(record_type_str),
+                                                 flag_from_string(record_type_str),
                                                  dnsserver.DNS_RPC_VIEW_AUTHORITY_DATA,
                                                  None,
                                                  None)
@@ -291,7 +291,7 @@ class DnsserverTests(RpcInterfaceTestCase):
                                                  self.custom_zone,
                                                  "a.b",
                                                  None,
-                                                 self.record_type_int(record_type_str),
+                                                 flag_from_string(record_type_str),


-- 
Samba Shared Repository



More information about the samba-cvs mailing list