self.assertEqual(len(recs), 1)
self.assertEqual(recs[0].dwTimeStamp, 0)
+ def test_static_record_dynamic_update(self):
+ name,txt = 'agingtest', ['test txt']
+ txt2 = ['test txt2']
+ self.set_aging(enable=True)
+ rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
+ rec_buf.rec = TXTRecord(txt)
+ self.rpc_conn.DnssrvUpdateRecord2(dnsserver.DNS_CLIENT_VERSION_LONGHORN,
+ 0, self.server_ip,
+ self.zone, name, rec_buf, None)
+
+ rec2 = self.dns_update_record(name, txt2)
+ self.assertEqual(rec2.dwTimeStamp, 0)
+
+ def test_dynamic_record_static_update(self):
+ name,txt = 'agingtest', ['test txt']
+ txt2 = ['test txt2']
+ txt3 = ['test txt3']
+ self.set_aging(enable=True)
+
+ self.dns_update_record(name, txt)
+
+ rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
+ rec_buf.rec = TXTRecord(txt2)
+ self.rpc_conn.DnssrvUpdateRecord2(dnsserver.DNS_CLIENT_VERSION_LONGHORN,
+ 0, self.server_ip,
+ self.zone, name, rec_buf, None)
+
+ self.dns_update_record(name, txt3)
+
+ recs = self.ldap_get_dns_records(name)
+ # Put in dict because ldap recs might be out of order
+ recs = {str(r.data.str):r for r in recs}
+ self.assertNotEqual(recs[str(txt)].dwTimeStamp, 0)
+ self.assertEqual(recs[str(txt2)].dwTimeStamp, 0)
+ self.assertEqual(recs[str(txt3)].dwTimeStamp, 0)
+
def test_dns_tombstone_custom_match_rule(self):
lp = self.get_loadparm()
self.samdb = SamDB(url = lp.samdb_url(), lp = lp,
samba.tests.dns.__main__.TestZones.test_basic_scavenging\(rodc:local\)
samba.tests.dns.__main__.TestZones.test_dns_tombstone_custom_match_rule\(rodc:local\)
samba.tests.dns.__main__.TestZones.test_dns_tombstone_custom_match_rule_fail\(rodc:local\)
+samba.tests.dns.__main__.TestZones.test_dynamic_record_static_update\(rodc:local\)
+samba.tests.dns.__main__.TestZones.test_static_record_dynamic_update\(rodc:local\)
samba.tests.dns.__main__.TestZones.test_set_aging\(vampire_dc:local\)
samba.tests.dns.__main__.TestZones.test_aging_update\(vampire_dc:local\)
samba.tests.dns.__main__.TestZones.test_aging_refresh\(vampire_dc:local\)
samba.tests.dns.__main__.TestZones.test_basic_scavenging\(vampire_dc:local\)
samba.tests.dns.__main__.TestZones.test_dns_tombstone_custom_match_rule\(vampire_dc:local\)
+samba.tests.dns.__main__.TestZones.test_dynamic_record_static_update\(vampire_dc:local\)
+samba.tests.dns.__main__.TestZones.test_static_record_dynamic_update\(vampire_dc:local\)
samba.tests.dns.__main__.TestComplexQueries.test_cname_two_chain\(vampire_dc:local\)
samba.tests.dns.__main__.TestComplexQueries.test_one_a_query\(vampire_dc:local\)
static WERROR dns_rr_to_dnsp(TALLOC_CTX *mem_ctx,
const struct dns_res_rec *rrec,
- struct dnsp_DnssrvRpcRecord *r);
+ struct dnsp_DnssrvRpcRecord *r,
+ bool name_is_static);
static WERROR check_one_prerequisite(struct dns_server *dns,
TALLOC_CTX *mem_ctx,
rec = talloc_zero(mem_ctx, struct dnsp_DnssrvRpcRecord);
W_ERROR_HAVE_NO_MEMORY(rec);
- werror = dns_rr_to_dnsp(rec, pr, rec);
+ werror = dns_rr_to_dnsp(rec, pr, rec, dns_name_is_static(ans, acount));
W_ERROR_NOT_OK_RETURN(werror);
for (i = 0; i < acount; i++) {
static WERROR dns_rr_to_dnsp(TALLOC_CTX *mem_ctx,
const struct dns_res_rec *rrec,
- struct dnsp_DnssrvRpcRecord *r)
+ struct dnsp_DnssrvRpcRecord *r,
+ bool name_is_static)
{
enum ndr_err_code ndr_err;
NTTIME t;
r->wType = (enum dns_record_type) rrec->rr_type;
r->dwTtlSeconds = rrec->ttl;
r->rank = DNS_RANK_ZONE;
- unix_to_nt_time(&t, time(NULL));
- t /= 10 * 1000 * 1000;
- t /= 3600;
- r->dwTimeStamp = t;
+ if (name_is_static) {
+ r->dwTimeStamp = 0;
+ } else {
+ unix_to_nt_time(&t, time(NULL));
+ t /= 10 * 1000 * 1000;
+ t /= 3600;
+ r->dwTimeStamp = t;
+ }
/* If we get QCLASS_ANY, we're done here */
if (rrec->rr_class == DNS_QCLASS_ANY) {
WERROR werror;
bool tombstoned = false;
bool needs_add = false;
+ bool name_is_static;
DEBUG(2, ("Looking at record: \n"));
if (DEBUGLVL(2)) {
first = rcount;
}
+ name_is_static = dns_name_is_static(recs, rcount);
+
if (update->rr_class == zone->question_class) {
if (update->rr_type == DNS_QTYPE_CNAME) {
/*
struct dnsp_DnssrvRpcRecord, rcount + 1);
W_ERROR_HAVE_NO_MEMORY(recs);
- werror = dns_rr_to_dnsp(recs, update, &recs[rcount]);
+ werror = dns_rr_to_dnsp(
+ recs, update, &recs[rcount], name_is_static);
W_ERROR_NOT_OK_RETURN(werror);
rcount += 1;
return WERR_OK;
}
- werror = dns_rr_to_dnsp(mem_ctx, update, &recs[i]);
+ werror = dns_rr_to_dnsp(
+ mem_ctx, update, &recs[i], name_is_static);
W_ERROR_NOT_OK_RETURN(werror);
for (i++; i < rcount; i++) {
struct dnsp_DnssrvRpcRecord, rcount+1);
W_ERROR_HAVE_NO_MEMORY(recs);
- werror = dns_rr_to_dnsp(recs, update, &recs[rcount]);
+ werror =
+ dns_rr_to_dnsp(recs, update, &recs[rcount], name_is_static);
W_ERROR_NOT_OK_RETURN(werror);
for (i = first; i < rcount; i++) {
struct dnsp_DnssrvRpcRecord);
W_ERROR_HAVE_NO_MEMORY(ns_rec);
- werror = dns_rr_to_dnsp(ns_rec, update, ns_rec);
+ werror = dns_rr_to_dnsp(
+ ns_rec, update, ns_rec, name_is_static);
W_ERROR_NOT_OK_RETURN(werror);
for (i = first; i < rcount; i++) {
del_rec = talloc(mem_ctx, struct dnsp_DnssrvRpcRecord);
W_ERROR_HAVE_NO_MEMORY(del_rec);
- werror = dns_rr_to_dnsp(del_rec, update, del_rec);
+ werror =
+ dns_rr_to_dnsp(del_rec, update, del_rec, name_is_static);
W_ERROR_NOT_OK_RETURN(werror);
for (i = first; i < rcount; i++) {