Пример #1
0
    def test_update_add_padding_rpc_to_dns(self):
        prefix, txt = 'pad1textrec', ['"This is a test"', '', '']
        prefix = 'rpc' + prefix
        name = "%s.%s" % (prefix, self.get_dns_domain())

        rec = data_to_dns_record(dnsp.DNS_TYPE_TXT,
                                 '"\\"This is a test\\"" "" ""')
        add_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
        add_rec_buf.rec = rec
        try:
            self.rpc_conn.DnssrvUpdateRecord2(
                dnsserver.DNS_CLIENT_VERSION_LONGHORN, 0, self.server_ip,
                self.get_dns_domain(), name, add_rec_buf, None)

            self.check_query_txt(prefix, txt)
        finally:
            self.rpc_conn.DnssrvUpdateRecord2(
                dnsserver.DNS_CLIENT_VERSION_LONGHORN, 0, self.server_ip,
                self.get_dns_domain(), name, None, add_rec_buf)

        prefix, txt = 'pad2textrec', ['"This is a test"', '', '', 'more text']
        prefix = 'rpc' + prefix
        name = "%s.%s" % (prefix, self.get_dns_domain())

        rec = data_to_dns_record(dnsp.DNS_TYPE_TXT,
                                 '"\\"This is a test\\"" "" "" "more text"')
        add_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
        add_rec_buf.rec = rec
        try:
            self.rpc_conn.DnssrvUpdateRecord2(
                dnsserver.DNS_CLIENT_VERSION_LONGHORN, 0, self.server_ip,
                self.get_dns_domain(), name, add_rec_buf, None)

            self.check_query_txt(prefix, txt)
        finally:
            self.rpc_conn.DnssrvUpdateRecord2(
                dnsserver.DNS_CLIENT_VERSION_LONGHORN, 0, self.server_ip,
                self.get_dns_domain(), name, None, add_rec_buf)

        prefix, txt = 'pad3textrec', ['', '', '"This is a test"']
        prefix = 'rpc' + prefix
        name = "%s.%s" % (prefix, self.get_dns_domain())

        rec = data_to_dns_record(dnsp.DNS_TYPE_TXT,
                                 '"" "" "\\"This is a test\\""')
        add_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
        add_rec_buf.rec = rec
        try:
            self.rpc_conn.DnssrvUpdateRecord2(
                dnsserver.DNS_CLIENT_VERSION_LONGHORN, 0, self.server_ip,
                self.get_dns_domain(), name, add_rec_buf, None)

            self.check_query_txt(prefix, txt)
        finally:
            self.rpc_conn.DnssrvUpdateRecord2(
                dnsserver.DNS_CLIENT_VERSION_LONGHORN, 0, self.server_ip,
                self.get_dns_domain(), name, None, add_rec_buf)
Пример #2
0
    def run(self,
            server,
            zone,
            name,
            rtype,
            olddata,
            newdata,
            sambaopts=None,
            credopts=None,
            versionopts=None):

        if rtype.upper() not in ('A', 'AAAA', 'PTR', 'CNAME', 'NS', 'MX',
                                 'SOA', 'SRV', 'TXT'):
            raise CommandError('Updating record of type %s is not supported' %
                               rtype)

        record_type = dns_type_flag(rtype)
        rec = data_to_dns_record(record_type, newdata)

        self.lp = sambaopts.get_loadparm()
        self.creds = credopts.get_credentials(self.lp)
        dns_conn = dns_connect(server, self.lp, self.creds)

        rec_match = dns_record_match(dns_conn, server, zone, name, record_type,
                                     olddata)
        if not rec_match:
            raise CommandError('Record or zone does not exist.')

        # Copy properties from existing record to new record
        rec.dwFlags = rec_match.dwFlags
        rec.dwSerial = rec_match.dwSerial
        rec.dwTtlSeconds = rec_match.dwTtlSeconds
        rec.dwTimeStamp = rec_match.dwTimeStamp

        add_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
        add_rec_buf.rec = rec

        del_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
        del_rec_buf.rec = rec_match

        try:
            dns_conn.DnssrvUpdateRecord2(dnsserver.DNS_CLIENT_VERSION_LONGHORN,
                                         0, server, zone, name, add_rec_buf,
                                         del_rec_buf)
        except WERRORError as e:
            if e.args[0] == werror.WERR_DNS_ERROR_NAME_DOES_NOT_EXIST:
                self.outf.write(
                    'Zone does not exist; record could not be updated.\n')
            raise e

        self.outf.write('Record updated successfully\n')
Пример #3
0
    def test_updaterecords2(self):
        client_version = dnsserver.DNS_CLIENT_VERSION_LONGHORN
        record_type = dnsp.DNS_TYPE_A
        select_flags = dnsserver.DNS_RPC_VIEW_AUTHORITY_DATA

        name = 'dummy'
        rec = ARecord('1.2.3.4')
        rec2 = ARecord('5.6.7.8')

        # Add record
        add_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
        add_rec_buf.rec = rec
        self.conn.DnssrvUpdateRecord2(client_version, 0, self.server,
                                      self.zone, name, add_rec_buf, None)

        buflen, result = self.conn.DnssrvEnumRecords2(client_version, 0,
                                                      self.server, self.zone,
                                                      name, None, record_type,
                                                      select_flags, None, None)
        self.assertEquals(1, result.count)
        self.assertEquals(1, result.rec[0].wRecordCount)
        self.assertEquals(dnsp.DNS_TYPE_A, result.rec[0].records[0].wType)
        self.assertEquals('1.2.3.4', result.rec[0].records[0].data)

        # Update record
        add_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
        add_rec_buf.rec = rec2
        del_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
        del_rec_buf.rec = rec
        self.conn.DnssrvUpdateRecord2(client_version, 0, self.server,
                                      self.zone, name, add_rec_buf,
                                      del_rec_buf)

        buflen, result = self.conn.DnssrvEnumRecords2(client_version, 0,
                                                      self.server, self.zone,
                                                      name, None, record_type,
                                                      select_flags, None, None)
        self.assertEquals(1, result.count)
        self.assertEquals(1, result.rec[0].wRecordCount)
        self.assertEquals(dnsp.DNS_TYPE_A, result.rec[0].records[0].wType)
        self.assertEquals('5.6.7.8', result.rec[0].records[0].data)

        # Delete record
        del_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
        del_rec_buf.rec = rec2
        self.conn.DnssrvUpdateRecord2(client_version, 0, self.server,
                                      self.zone, name, None, del_rec_buf)

        self.assertRaises(RuntimeError, self.conn.DnssrvEnumRecords2,
                          client_version, 0, self.server, self.zone, name,
                          None, record_type, select_flags, None, None)
Пример #4
0
    def run(self,
            server,
            zone,
            name,
            rtype,
            olddata,
            newdata,
            sambaopts=None,
            credopts=None,
            versionopts=None):

        record_type = dns_type_flag(rtype)
        if record_type == dnsp.DNS_TYPE_A:
            rec = ARecord(newdata)
        elif record_type == dnsp.DNS_TYPE_AAAA:
            rec = AAAARecord(newdata)
        elif record_type == dnsp.DNS_TYPE_PTR:
            rec = PTRRecord(newdata)
        elif record_type == dnsp.DNS_TYPE_CNAME:
            rec = CNameRecord(newdata)
        elif record_type == dnsp.DNS_TYPE_NS:
            rec = NSRecord(newdata)
        else:
            raise CommandError('Updating record of type %s is not supported' %
                               rtype)

        self.lp = sambaopts.get_loadparm()
        self.creds = credopts.get_credentials(self.lp)
        dns_conn = dns_connect(server, self.lp, self.creds)

        rec_match = dns_record_match(dns_conn, server, zone, name, record_type,
                                     olddata)
        if not rec_match:
            raise CommandError('Record does not exist')

        # Copy properties from existing record to new record
        rec.dwFlags = rec_match.dwFlags
        rec.dwSerial = rec_match.dwSerial
        rec.dwTtlSeconds = rec_match.dwTtlSeconds
        rec.dwTimeStamp = rec_match.dwTimeStamp

        add_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
        add_rec_buf.rec = rec

        del_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
        del_rec_buf.rec = rec_match

        dns_conn.DnssrvUpdateRecord2(dnsserver.DNS_CLIENT_VERSION_LONGHORN, 0,
                                     server, zone, name, add_rec_buf,
                                     del_rec_buf)
        self.outf.write('Record updated succefully\n')
Пример #5
0
    def run(self, server, zone, name, rtype, data, sambaopts=None,
            credopts=None, versionopts=None):

        if rtype.upper() not in ('A', 'AAAA', 'PTR', 'CNAME', 'NS', 'MX', 'SRV', 'TXT'):
            raise CommandError('Adding record of type %s is not supported' % rtype)

        record_type = dns_type_flag(rtype)
        rec = data_to_dns_record(record_type, data)

        self.lp = sambaopts.get_loadparm()
        self.creds = credopts.get_credentials(self.lp)
        dns_conn = dns_connect(server, self.lp, self.creds)

        add_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
        add_rec_buf.rec = rec

        try:
            dns_conn.DnssrvUpdateRecord2(dnsserver.DNS_CLIENT_VERSION_LONGHORN,
                                         0, server, zone, name, add_rec_buf, None)
        except WERRORError as e:
            if e.args[0] == werror.WERR_DNS_ERROR_NAME_DOES_NOT_EXIST:
                self.outf.write('Zone does not exist; record could not be added.\n')
            raise e

        self.outf.write('Record added successfully\n')
Пример #6
0
    def test_updaterecords2_soa(self):
        client_version = dnsserver.DNS_CLIENT_VERSION_LONGHORN
        record_type = dnsp.DNS_TYPE_NS
        select_flags = (dnsserver.DNS_RPC_VIEW_AUTHORITY_DATA
                        | dnsserver.DNS_RPC_VIEW_NO_CHILDREN)

        nameserver = 'ns.example.local'
        rec = NSRecord(nameserver)

        # Add record
        add_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
        add_rec_buf.rec = rec
        self.conn.DnssrvUpdateRecord2(client_version, 0, self.server,
                                      self.zone, '.', add_rec_buf, None)

        buflen, result = self.conn.DnssrvEnumRecords2(client_version, 0,
                                                      self.server, self.zone,
                                                      '@', None, record_type,
                                                      select_flags, None, None)
        self.assertEquals(1, result.count)
        self.assertEquals(2, result.rec[0].wRecordCount)
        match = False
        for i in range(2):
            self.assertEquals(dnsp.DNS_TYPE_NS, result.rec[0].records[i].wType)
            if result.rec[0].records[i].data.str.rstrip('.') == nameserver:
                match = True
        self.assertEquals(match, True)
Пример #7
0
    def run(self, server, zone, name, rtype, data, sambaopts=None, credopts=None, versionopts=None):

        if rtype.upper() not in ('A','AAAA','PTR','CNAME','NS','MX','SRV','TXT'):
            raise CommandError('Deleting record of type %s is not supported' % rtype)

        record_type = dns_type_flag(rtype)

        self.lp = sambaopts.get_loadparm()
        self.creds = credopts.get_credentials(self.lp)
        dns_conn = dns_connect(server, self.lp, self.creds)

        rec_match = dns_record_match(dns_conn, server, zone, name, record_type, data)
        if not rec_match:
            raise CommandError('Record does not exist')

        del_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
        del_rec_buf.rec = rec_match

        dns_conn.DnssrvUpdateRecord2(dnsserver.DNS_CLIENT_VERSION_LONGHORN,
                                        0,
                                        server,
                                        zone,
                                        name,
                                        None,
                                        del_rec_buf)
        self.outf.write('Record deleted successfully\n')
Пример #8
0
    def add_record(self, dns_conn, typ, name, data):

        rec = data_to_dns_record(typ, data)
        add_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
        add_rec_buf.rec = rec
        try:
            dns_conn.DnssrvUpdateRecord2(dnsserver.DNS_CLIENT_VERSION_LONGHORN,
                                         0, self.server, self.get_dns_domain(),
                                         name, add_rec_buf, None)
        except WERRORError as e:
            raise e
Пример #9
0
    def delete_record(self, dns_conn, typ, name, data):

        rec = data_to_dns_record(typ, data)
        del_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
        del_rec_buf.rec = rec

        try:
            dns_conn.DnssrvUpdateRecord2(dnsserver.DNS_CLIENT_VERSION_LONGHORN,
                                         0, self.server, self.get_dns_domain(),
                                         name, None, del_rec_buf)
        except WERRORError as e:
            # Ignore record does not exist errors
            if e.args[0] != werror.WERR_DNS_ERROR_NAME_DOES_NOT_EXIST:
                raise e
Пример #10
0
    def test_update_add_empty_rpc_to_dns(self):
        prefix, txt = 'rpcemptytextrec', []

        name = "%s.%s" % (prefix, self.get_dns_domain())

        rec = data_to_dns_record(dnsp.DNS_TYPE_TXT, '')
        add_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
        add_rec_buf.rec = rec
        try:
            self.rpc_conn.DnssrvUpdateRecord2(
                dnsserver.DNS_CLIENT_VERSION_LONGHORN, 0, self.server_ip,
                self.get_dns_domain(), name, add_rec_buf, None)

            self.check_query_txt(prefix, txt)
        finally:
            self.rpc_conn.DnssrvUpdateRecord2(
                dnsserver.DNS_CLIENT_VERSION_LONGHORN, 0, self.server_ip,
                self.get_dns_domain(), name, None, add_rec_buf)
Пример #11
0
    def test_update_add_null_char_rpc_to_dns(self):
        prefix, txt = 'nulltextrec', ['NULL\x00BYTE']
        prefix = 'rpc' + prefix
        name = "%s.%s" % (prefix, self.get_dns_domain())

        rec = data_to_dns_record(dnsp.DNS_TYPE_TXT, '"NULL"')
        add_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
        add_rec_buf.rec = rec
        try:
            self.rpc_conn.DnssrvUpdateRecord2(
                dnsserver.DNS_CLIENT_VERSION_LONGHORN, 0, self.server_ip,
                self.get_dns_domain(), name, add_rec_buf, None)

            self.check_query_txt(prefix, ['NULL'])
        finally:
            self.rpc_conn.DnssrvUpdateRecord2(
                dnsserver.DNS_CLIENT_VERSION_LONGHORN, 0, self.server_ip,
                self.get_dns_domain(), name, None, add_rec_buf)
Пример #12
0
    def run(self,
            server,
            zone,
            name,
            rtype,
            data,
            sambaopts=None,
            credopts=None,
            versionopts=None):

        record_type = dns_type_flag(rtype)

        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)
        else:
            raise CommandError('Deleting record of type %s is not supported' %
                               rtype)

        self.lp = sambaopts.get_loadparm()
        self.creds = credopts.get_credentials(self.lp)
        dns_conn = dns_connect(server, self.lp, self.creds)

        rec_match = dns_record_match(dns_conn, server, zone, name, record_type,
                                     data)
        if not rec_match:
            raise CommandError('Record does not exist')

        del_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
        del_rec_buf.rec = rec_match

        dns_conn.DnssrvUpdateRecord2(dnsserver.DNS_CLIENT_VERSION_LONGHORN, 0,
                                     server, zone, name, None, del_rec_buf)
        self.outf.write('Record deleted succefully\n')
Пример #13
0
def recbuf_from_string(*args, **kwargs):
    rec = record_from_string(*args, **kwargs)
    buf = dnsserver.DNS_RPC_RECORD_BUF()
    buf.rec = rec
    return buf
Пример #14
0
def add_dns_records(samdb, name, dns_conn, change_owner_sd, server,
                    ip_address_list, logger):
    """Add DNS A or AAAA records while creating computer. """
    name = name.rstrip('$')
    client_version = dnsserver.DNS_CLIENT_VERSION_LONGHORN
    select_flags = dnsserver.DNS_RPC_VIEW_AUTHORITY_DATA | dnsserver.DNS_RPC_VIEW_NO_CHILDREN
    zone = samdb.domain_dns_name()
    name_found = True
    sd_helper = sd_utils.SDUtils(samdb)

    try:
        buflen, res = dns_conn.DnssrvEnumRecords2(
            client_version,
            0,
            server,
            zone,
            name,
            None,
            dnsp.DNS_TYPE_ALL,
            select_flags,
            None,
            None,
        )
    except WERRORError as e:
        if e.args[0] == werror.WERR_DNS_ERROR_NAME_DOES_NOT_EXIST:
            name_found = False
            pass

    if name_found:
        for rec in res.rec:
            for record in rec.records:
                if record.wType == dnsp.DNS_TYPE_A or record.wType == dnsp.DNS_TYPE_AAAA:
                    # delete record
                    del_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
                    del_rec_buf.rec = record
                    try:
                        dns_conn.DnssrvUpdateRecord2(
                            client_version,
                            0,
                            server,
                            zone,
                            name,
                            None,
                            del_rec_buf,
                        )
                    except WERRORError as e:
                        if e.args[
                                0] != werror.WERR_DNS_ERROR_NAME_DOES_NOT_EXIST:
                            raise

    for ip_address in ip_address_list:
        if _is_valid_ipv6(ip_address):
            logger.info("Adding DNS AAAA record %s.%s for IPv6 IP: %s" %
                        (name, zone, ip_address))
            rec = AAAARecord(ip_address)
        elif _is_valid_ipv4(ip_address):
            logger.info("Adding DNS A record %s.%s for IPv4 IP: %s" %
                        (name, zone, ip_address))
            rec = ARecord(ip_address)
        else:
            raise ValueError('Invalid IP: {}'.format(ip_address))

        # Add record
        add_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
        add_rec_buf.rec = rec

        dns_conn.DnssrvUpdateRecord2(
            client_version,
            0,
            server,
            zone,
            name,
            add_rec_buf,
            None,
        )

    if (len(ip_address_list) > 0):
        domaindns_zone_dn = ldb.Dn(
            samdb,
            'DC=DomainDnsZones,%s' % samdb.get_default_basedn(),
        )

        dns_a_dn, ldap_record = samdb.dns_lookup(
            "%s.%s" % (name, zone),
            dns_partition=domaindns_zone_dn,
        )

        # Make the DC own the DNS record, not the administrator
        sd_helper.modify_sd_on_dn(
            dns_a_dn,
            change_owner_sd,
            controls=[
                "sd_flags:1:%d" %
                (security.SECINFO_OWNER | security.SECINFO_GROUP)
            ],
        )
Пример #15
0
    binding_str = "ncacn_ip_tcp:%s[print,sign]" % server

    dns_conn = dnsserver.dnsserver(binding_str, lp, creds)

    print("querying a NS record")
    res = dns_conn.DnssrvEnumRecords2(0x00070000, 0, server, dnszone, newname,
                                      None, dnsp.DNS_TYPE_NS, 0x0f, None, None)

    print("adding a NS glue record")
    name = dnsserver.DNS_RPC_NAME()
    name.str = newname

    addrec = dnsserver.DNS_RPC_RECORD()
    addrec.wType = dnsp.DNS_TYPE_NS
    addrec.dwFlags = 0
    addrec.dwSerial = 0
    addrec.dwTtlSeconds = 3600
    addrec.dwTimeStamp = 0
    addrec.dwReserved = 0
    addrec.data = name

    addrecbuf = dnsserver.DNS_RPC_RECORD_BUF()
    addrecbuf.rec = addrec

    res = dns_conn.DnssrvUpdateRecord2(0x00070000, 0, server, dnszone, newname,
                                       addrecbuf, None)

    print("querying the NS record")
    res = dns_conn.DnssrvEnumRecords2(0x00070000, 0, server, dnszone, newname,
                                      None, dnsp.DNS_TYPE_NS, 0x0f, None, None)