[SCM] Samba Shared Repository - branch master updated

Stefan Metzmacher metze at samba.org
Fri Aug 12 06:08:02 MDT 2011


The branch, master has been updated
       via  81d3f92 selftest:Samba4: test --domain-critical-only in provision_vampire_dc()
       via  f34f16f s3:samba-tool: add --domain-critical-only to "samba-tool domain join"
       via  5d6b848 s4:py/samba/join: add domain_critical_only=False to join_DC/join_RODC
       via  a3f2621 s4:py/samba/drs_utils: pass down req/req_level to self.net.replicate_chunk()
       via  daf5676 s4:libnet_vampire: don't keep the replication state if DRSUAPI_DRS_CRITICAL_ONLY was used
       via  47fcbd7 s4:libnet: passdown the DsGetNCChangesReq* to the libnet_BecomeDC_StoreChunk handler
       via  da7d22d selftest:target/Samba4: use the correct configuration in setup_vampire_dc()
      from  0d1a7fd s3:libsmb: keep the request order in cli_smb_req_unset_pending()

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


- Log -----------------------------------------------------------------
commit 81d3f92155856891ee0ac74cada3bbdd3e7670e1
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Aug 11 23:07:35 2011 +0200

    selftest:Samba4: test --domain-critical-only in provision_vampire_dc()
    
    This way only only replicate critical objects during the initial join
    as DC, then we'll replicate the whole domain while 'samba' is running.
    
    metze
    
    Signed-off-by: Andrew Tridgell <tridge at samba.org>
    
    Autobuild-User: Stefan Metzmacher <metze at samba.org>
    Autobuild-Date: Fri Aug 12 14:07:50 CEST 2011 on sn-devel-104

commit f34f16f7f87d39cd21ce43c51ccb5726ff44c959
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 8 11:15:35 2011 +0200

    s3:samba-tool: add --domain-critical-only to "samba-tool domain join"
    
    metze
    
    Signed-off-by: Andrew Tridgell <tridge at samba.org>

commit 5d6b8483943697cc10fe7e42fcf2d544f5758dbc
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 8 11:01:21 2011 +0200

    s4:py/samba/join: add domain_critical_only=False to join_DC/join_RODC
    
    metze
    
    Signed-off-by: Andrew Tridgell <tridge at samba.org>

commit a3f262182a65de04a41a336c7c08854723879065
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 8 10:47:12 2011 +0200

    s4:py/samba/drs_utils: pass down req/req_level to self.net.replicate_chunk()
    
    metze
    
    Signed-off-by: Andrew Tridgell <tridge at samba.org>

commit daf56768c6487dc94e6a337297d065a378fe237a
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Aug 9 12:23:29 2011 +0200

    s4:libnet_vampire: don't keep the replication state if DRSUAPI_DRS_CRITICAL_ONLY was used
    
    In that case we have incomplete information and need to start
    from 0 in the next run.
    
    metze
    
    Signed-off-by: Andrew Tridgell <tridge at samba.org>

commit 47fcbd71ae811eb479fe479f4526fe11c0fa86b6
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 8 10:29:05 2011 +0200

    s4:libnet: passdown the DsGetNCChangesReq* to the libnet_BecomeDC_StoreChunk handler
    
    metze
    
    Signed-off-by: Andrew Tridgell <tridge at samba.org>

commit da7d22dadeec3bb41da0bd1e49c28ab20e83cf9f
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Aug 9 12:20:54 2011 +0200

    selftest:target/Samba4: use the correct configuration in setup_vampire_dc()
    
    This allows "TDB_NO_FSYNC=1 make -j test TESTS=vampire" to work.
    
    metze
    
    Signed-off-by: Andrew Tridgell <tridge at samba.org>

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

Summary of changes:
 selftest/target/Samba4.pm                       |    4 +-
 source4/libnet/libnet_become_dc.c               |   25 ++++++++++++
 source4/libnet/libnet_become_dc.h               |    4 ++
 source4/libnet/libnet_vampire.c                 |   30 ++++++++++++++
 source4/libnet/py_net.c                         |   47 +++++++++++++++++++++--
 source4/scripting/python/samba/drs_utils.py     |    3 +-
 source4/scripting/python/samba/join.py          |   13 +++++-
 source4/scripting/python/samba/netcmd/domain.py |   12 ++++-
 8 files changed, 126 insertions(+), 12 deletions(-)


Changeset truncated at 500 lines:

diff --git a/selftest/target/Samba4.pm b/selftest/target/Samba4.pm
index 89faf01..df5a8bb 100644
--- a/selftest/target/Samba4.pm
+++ b/selftest/target/Samba4.pm
@@ -1005,7 +1005,7 @@ sub provision_vampire_dc($$$)
 	$cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
 	$cmd .= "KRB5_CONFIG=\"$ret->{KRB5_CONFIG}\" ";
 	$cmd .= "$samba_tool domain join $ret->{CONFIGURATION} $dcvars->{REALM} DC --realm=$dcvars->{REALM}";
-	$cmd .= " -U$dcvars->{DC_USERNAME}\%$dcvars->{DC_PASSWORD}";
+	$cmd .= " -U$dcvars->{DC_USERNAME}\%$dcvars->{DC_PASSWORD} --domain-critical-only";
 
 	unless (system($cmd) == 0) {
 		warn("Join failed\n$cmd");
@@ -1525,6 +1525,7 @@ sub setup_vampire_dc($$$)
 		$cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$env->{SOCKET_WRAPPER_DEFAULT_IFACE}\"";
 		$cmd .= " KRB5_CONFIG=\"$env->{KRB5_CONFIG}\"";
 		$cmd .= " $samba_tool drs kcc $env->{DC_SERVER}";
+		$cmd .= " $env->{CONFIGURATION}";
 		$cmd .= " -U$dc_vars->{DC_USERNAME}\%$dc_vars->{DC_PASSWORD}";
 		unless (system($cmd) == 0) {
 			warn("Failed to exec kcc\n$cmd");
@@ -1537,6 +1538,7 @@ sub setup_vampire_dc($$$)
 		$cmd = "SOCKET_WRAPPER_DEFAULT_IFACE=\"$env->{SOCKET_WRAPPER_DEFAULT_IFACE}\"";
 		$cmd .= " KRB5_CONFIG=\"$env->{KRB5_CONFIG}\"";
 		$cmd .= " $samba_tool drs replicate $env->{DC_SERVER} $env->{VAMPIRE_DC_SERVER}";
+		$cmd .= " $dc_vars->{CONFIGURATION}";
 		$cmd .= " -U$dc_vars->{DC_USERNAME}\%$dc_vars->{DC_PASSWORD}";
 		# replicate Configuration NC
 		my $cmd_repl = "$cmd \"CN=Configuration,$base_dn\"";
diff --git a/source4/libnet/libnet_become_dc.c b/source4/libnet/libnet_become_dc.c
index aabb3b4..bfa6372 100644
--- a/source4/libnet/libnet_become_dc.c
+++ b/source4/libnet/libnet_become_dc.c
@@ -2615,6 +2615,10 @@ static WERROR becomeDC_drsuapi_pull_partition_recv(struct libnet_BecomeDC_state
 						   struct libnet_BecomeDC_Partition *partition,
 						   struct drsuapi_DsGetNCChanges *r)
 {
+	uint32_t req_level = 0;
+	struct drsuapi_DsGetNCChangesRequest5 *req5 = NULL;
+	struct drsuapi_DsGetNCChangesRequest8 *req8 = NULL;
+	struct drsuapi_DsGetNCChangesRequest10 *req10 = NULL;
 	uint32_t ctr_level = 0;
 	struct drsuapi_DsGetNCChangesCtr1 *ctr1 = NULL;
 	struct drsuapi_DsGetNCChangesCtr6 *ctr6 = NULL;
@@ -2628,6 +2632,23 @@ static WERROR becomeDC_drsuapi_pull_partition_recv(struct libnet_BecomeDC_state
 		return r->out.result;
 	}
 
+	switch (r->in.level) {
+	case 0:
+		/* none */
+		break;
+	case 5:
+		req5 = &r->in.req->req5;
+		break;
+	case 8:
+		req8 = &r->in.req->req8;
+		break;
+	case 10:
+		req10 = &r->in.req->req10;
+		break;
+	default:
+		return WERR_INVALID_PARAMETER;
+	}
+
 	if (*r->out.level_out == 1) {
 		ctr_level = 1;
 		ctr1 = &r->out.ctr->ctr1;
@@ -2691,6 +2712,10 @@ static WERROR becomeDC_drsuapi_pull_partition_recv(struct libnet_BecomeDC_state
 	s->_sc.source_dsa	= &s->source_dsa;
 	s->_sc.dest_dsa		= &s->dest_dsa;
 	s->_sc.partition	= partition;
+	s->_sc.req_level	= req_level;
+	s->_sc.req5		= req5;
+	s->_sc.req8		= req8;
+	s->_sc.req10		= req10;
 	s->_sc.ctr_level	= ctr_level;
 	s->_sc.ctr1		= ctr1;
 	s->_sc.ctr6		= ctr6;
diff --git a/source4/libnet/libnet_become_dc.h b/source4/libnet/libnet_become_dc.h
index 604813f..b3b08bd 100644
--- a/source4/libnet/libnet_become_dc.h
+++ b/source4/libnet/libnet_become_dc.h
@@ -107,6 +107,10 @@ struct libnet_BecomeDC_StoreChunk {
 	const struct libnet_BecomeDC_SourceDSA *source_dsa;
 	const struct libnet_BecomeDC_DestDSA *dest_dsa;
 	const struct libnet_BecomeDC_Partition *partition;
+	uint32_t req_level;
+	const struct drsuapi_DsGetNCChangesRequest5 *req5;
+	const struct drsuapi_DsGetNCChangesRequest8 *req8;
+	const struct drsuapi_DsGetNCChangesRequest10 *req10;
 	uint32_t ctr_level;
 	const struct drsuapi_DsGetNCChangesCtr1 *ctr1;
 	const struct drsuapi_DsGetNCChangesCtr6 *ctr6;
diff --git a/source4/libnet/libnet_vampire.c b/source4/libnet/libnet_vampire.c
index 80b1a61..efbcd8a 100644
--- a/source4/libnet/libnet_vampire.c
+++ b/source4/libnet/libnet_vampire.c
@@ -626,6 +626,7 @@ NTSTATUS libnet_vampire_cb_store_chunk(void *private_data,
 	struct drsuapi_DsReplicaLinkedAttribute *linked_attributes;
 	const struct drsuapi_DsReplicaCursor2CtrEx *uptodateness_vector;
 	struct dsdb_extended_replicated_objects *objs;
+	uint32_t req_replica_flags;
 	struct repsFromTo1 *s_dsa;
 	char *tmp_dns_name;
 	uint32_t i;
@@ -667,6 +668,35 @@ NTSTATUS libnet_vampire_cb_store_chunk(void *private_data,
 		return NT_STATUS_INVALID_PARAMETER;
 	}
 
+	switch (c->req_level) {
+	case 0:
+		/* none */
+		req_replica_flags = 0;
+		break;
+	case 5:
+		req_replica_flags = c->req5->replica_flags;
+		break;
+	case 8:
+		req_replica_flags = c->req8->replica_flags;
+		break;
+	case 10:
+		req_replica_flags = c->req10->replica_flags;
+		break;
+	default:
+		return NT_STATUS_INVALID_PARAMETER;
+	}
+
+	if (req_replica_flags & DRSUAPI_DRS_CRITICAL_ONLY) {
+		/*
+		 * If we only replicate the critical objects
+		 * we should not remember what we already
+		 * got, as it is incomplete.
+		 */
+		ZERO_STRUCT(s_dsa->highwatermark);
+		uptodateness_vector = NULL;
+	}
+
+	/* TODO: avoid hardcoded flags */
 	s_dsa->replica_flags		= DRSUAPI_DRS_WRIT_REP
 					| DRSUAPI_DRS_INIT_SYNC
 					| DRSUAPI_DRS_PER_SYNC;
diff --git a/source4/libnet/py_net.c b/source4/libnet/py_net.c
index 0fae791..c4b6840 100644
--- a/source4/libnet/py_net.c
+++ b/source4/libnet/py_net.c
@@ -463,16 +463,20 @@ static PyObject *py_net_replicate_init(py_net_Object *self, PyObject *args, PyOb
  */
 static PyObject *py_net_replicate_chunk(py_net_Object *self, PyObject *args, PyObject *kwargs)
 {
-	const char *kwnames[] = { "state", "level", "ctr", "schema", NULL };
-	PyObject *py_state, *py_ctr, *py_schema;
+	const char *kwnames[] = { "state", "level", "ctr",
+				  "schema", "req_level", "req",
+				  NULL };
+	PyObject *py_state, *py_ctr, *py_schema, *py_req;
 	struct replicate_state *s;
 	unsigned level;
+	unsigned req_level = 0;
 	NTSTATUS (*chunk_handler)(void *private_data, const struct libnet_BecomeDC_StoreChunk *c);
 	NTSTATUS status;
 
-	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OIO|O",
+	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OIO|OIO",
 					 discard_const_p(char *, kwnames),
-	                                 &py_state, &level, &py_ctr, &py_schema)) {
+	                                 &py_state, &level, &py_ctr,
+					 &py_schema, &req_level, &py_req)) {
 		return NULL;
 	}
 
@@ -510,6 +514,41 @@ static PyObject *py_net_replicate_chunk(py_net_Object *self, PyObject *args, PyO
 		return NULL;
 	}
 
+	s->chunk.req5 = NULL;
+	s->chunk.req8 = NULL;
+	s->chunk.req10 = NULL;
+	if (py_req) {
+		switch (req_level) {
+		case 0:
+			break;
+		case 5:
+			if (!py_check_dcerpc_type(py_req, "samba.dcerpc.drsuapi", "DsGetNCChangesRequest5")) {
+				return NULL;
+			}
+
+			s->chunk.req5 = pytalloc_get_ptr(py_req);
+			break;
+		case 8:
+			if (!py_check_dcerpc_type(py_req, "samba.dcerpc.drsuapi", "DsGetNCChangesRequest8")) {
+				return NULL;
+			}
+
+			s->chunk.req8 = pytalloc_get_ptr(py_req);
+			break;
+		case 10:
+			if (!py_check_dcerpc_type(py_req, "samba.dcerpc.drsuapi", "DsGetNCChangesRequest10")) {
+				return NULL;
+			}
+
+			s->chunk.req10 = pytalloc_get_ptr(py_req);
+			break;
+		default:
+			PyErr_Format(PyExc_TypeError, "Bad req_level %u in replicate_chunk", req_level);
+			return NULL;
+		}
+	}
+	s->chunk.req_level = req_level;
+
 	chunk_handler = libnet_vampire_cb_store_chunk;
 	if (py_schema) {
 		if (!PyBool_Check(py_schema)) {
diff --git a/source4/scripting/python/samba/drs_utils.py b/source4/scripting/python/samba/drs_utils.py
index 77f415e..80128ca 100644
--- a/source4/scripting/python/samba/drs_utils.py
+++ b/source4/scripting/python/samba/drs_utils.py
@@ -167,7 +167,8 @@ class drs_Replicate:
             (level, ctr) = self.drs.DsGetNCChanges(self.drs_handle, req_level, req)
             if ctr.first_object == None and ctr.object_count != 0:
                 raise RuntimeError("DsGetNCChanges: NULL first_object with object_count=%u" % (ctr.object_count))
-            self.net.replicate_chunk(self.replication_state, level, ctr, schema=schema)
+            self.net.replicate_chunk(self.replication_state, level, ctr,
+				     schema=schema, req_level=req_level, req=req)
             if ctr.more_data == 0:
                 break
             req.highwatermark.tmp_highest_usn = ctr.new_highwatermark.tmp_highest_usn
diff --git a/source4/scripting/python/samba/join.py b/source4/scripting/python/samba/join.py
index c24e8d6..00f2c54 100644
--- a/source4/scripting/python/samba/join.py
+++ b/source4/scripting/python/samba/join.py
@@ -480,7 +480,7 @@ class dc_join(object):
                     replica_flags=ctx.replica_flags)
             repl.replicate(ctx.base_dn, source_dsa_invocation_id,
                     destination_dsa_guid, rodc=ctx.RODC,
-                    replica_flags=ctx.replica_flags)
+                    replica_flags=ctx.domain_replica_flags)
             if ctx.RODC:
                 repl.replicate(ctx.acct_dn, source_dsa_invocation_id,
                         destination_dsa_guid,
@@ -534,7 +534,7 @@ class dc_join(object):
 
 
 def join_RODC(server=None, creds=None, lp=None, site=None, netbios_name=None,
-              targetdir=None, domain=None):
+              targetdir=None, domain=None, domain_critical_only=False):
     """join as a RODC"""
 
     ctx = dc_join(server, creds, lp, site, netbios_name, targetdir, domain)
@@ -569,6 +569,10 @@ def join_RODC(server=None, creds=None, lp=None, site=None, netbios_name=None,
                            drsuapi.DRSUAPI_DRS_NEVER_SYNCED |
                            drsuapi.DRSUAPI_DRS_SPECIAL_SECRET_PROCESSING |
                            drsuapi.DRSUAPI_DRS_GET_ALL_GROUP_MEMBERSHIP)
+    ctx.domain_replica_flags = ctx.replica_flags
+    if domain_critical_only:
+        ctx.domain_replica_flags |= drsuapi.DRSUAPI_DRS_CRITICAL_ONLY
+
     ctx.do_join()
 
 
@@ -576,7 +580,7 @@ def join_RODC(server=None, creds=None, lp=None, site=None, netbios_name=None,
 
 
 def join_DC(server=None, creds=None, lp=None, site=None, netbios_name=None,
-            targetdir=None, domain=None):
+            targetdir=None, domain=None, domain_critical_only=False):
     """join as a DC"""
     ctx = dc_join(server, creds, lp, site, netbios_name, targetdir, domain)
 
@@ -590,6 +594,9 @@ def join_DC(server=None, creds=None, lp=None, site=None, netbios_name=None,
                          drsuapi.DRSUAPI_DRS_PER_SYNC |
                          drsuapi.DRSUAPI_DRS_FULL_SYNC_IN_PROGRESS |
                          drsuapi.DRSUAPI_DRS_NEVER_SYNCED)
+    ctx.domain_replica_flags = ctx.replica_flags
+    if domain_critical_only:
+        ctx.domain_replica_flags |= drsuapi.DRSUAPI_DRS_CRITICAL_ONLY
 
     ctx.do_join()
     print "Joined domain %s (SID %s) as a DC" % (ctx.domain_name, ctx.domsid)
diff --git a/source4/scripting/python/samba/netcmd/domain.py b/source4/scripting/python/samba/netcmd/domain.py
index 50b5d80..423a812 100644
--- a/source4/scripting/python/samba/netcmd/domain.py
+++ b/source4/scripting/python/samba/netcmd/domain.py
@@ -75,12 +75,16 @@ class cmd_domain_join(Command):
         Option("--server", help="DC to join", type=str),
         Option("--site", help="site to join", type=str),
         Option("--targetdir", help="where to store provision", type=str),
+        Option("--domain-critical-only",
+               help="only replicate critical domain objects",
+               action="store_true"),
         ]
 
     takes_args = ["domain", "role?"]
 
     def run(self, domain, role=None, sambaopts=None, credopts=None,
-            versionopts=None, server=None, site=None, targetdir=None):
+            versionopts=None, server=None, site=None, targetdir=None,
+            domain_critical_only=False):
         lp = sambaopts.get_loadparm()
         creds = credopts.get_credentials(lp)
         net = Net(creds, lp, server=credopts.ipaddress)
@@ -102,11 +106,13 @@ class cmd_domain_join(Command):
             return
         elif role == "DC":
             join_DC(server=server, creds=creds, lp=lp, domain=domain,
-                    site=site, netbios_name=netbios_name, targetdir=targetdir)
+                    site=site, netbios_name=netbios_name, targetdir=targetdir,
+                    domain_critical_only=domain_critical_only)
             return
         elif role == "RODC":
             join_RODC(server=server, creds=creds, lp=lp, domain=domain,
-                      site=site, netbios_name=netbios_name, targetdir=targetdir)
+                      site=site, netbios_name=netbios_name, targetdir=targetdir,
+                      domain_critical_only=domain_critical_only)
             return
         else:
             raise CommandError("Invalid role %s (possible values: MEMBER, BDC, RODC)" % role)


-- 
Samba Shared Repository


More information about the samba-cvs mailing list