drs: support sync-forced for 'samba-tool drs replicate --local'
authorTim Beale <timbeale@catalyst.net.nz>
Mon, 29 May 2017 05:06:55 +0000 (17:06 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Thu, 27 Jul 2017 22:25:14 +0000 (00:25 +0200)
The sync-forced option wasn't being passed into the replication request
when the --local option was used. This meant if outbound replication
were disabled on the target DC, then the replicate --local command would
fail.

Signed-off-by: Tim Beale <timbeale@catalyst.net.nz>
Reviewed-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
python/samba/drs_utils.py
python/samba/netcmd/drs.py

index 8624f3f223811d7856e5c5eef7992b576fe80df1..1719af69aa64e323836b192b29c494eb487a0bd7 100644 (file)
@@ -200,7 +200,7 @@ class drs_Replicate(object):
 
     def replicate(self, dn, source_dsa_invocation_id, destination_dsa_guid,
                   schema=False, exop=drsuapi.DRSUAPI_EXOP_NONE, rodc=False,
-                  replica_flags=None, full_sync=True):
+                  replica_flags=None, full_sync=True, sync_forced=False):
         '''replicate a single DN'''
 
         # setup for a GetNCChanges call
@@ -262,6 +262,10 @@ class drs_Replicate(object):
                     drsuapi.DRSUAPI_DRS_SPECIAL_SECRET_PROCESSING)
             else:
                 req8.replica_flags |= drsuapi.DRSUAPI_DRS_WRIT_REP
+
+        if sync_forced:
+            req8.replica_flags |= drsuapi.DRSUAPI_DRS_SYNC_FORCED
+
         req8.max_object_count = 402
         req8.max_ndr_size = 402116
         req8.extended_op = exop
index b9b876af65a6af530e25e3b5dbcd3432eacea781..e1886b92d3f0b542ed4e703744e04bac43409362 100644 (file)
@@ -241,7 +241,8 @@ class cmd_drs_kcc(Command):
 
 
 
-def drs_local_replicate(self, SOURCE_DC, NC, full_sync=False, single_object=False):
+def drs_local_replicate(self, SOURCE_DC, NC, full_sync=False, single_object=False,
+                        sync_forced=False):
     '''replicate from a source DC to the local SAM'''
 
     self.server = SOURCE_DC
@@ -284,7 +285,7 @@ def drs_local_replicate(self, SOURCE_DC, NC, full_sync=False, single_object=Fals
         (num_objects, num_links) = repl.replicate(NC,
                                                   source_dsa_invocation_id, destination_dsa_guid,
                                                   rodc=rodc, full_sync=full_sync,
-                                                  exop=exop)
+                                                  exop=exop, sync_forced=sync_forced)
     except Exception, e:
         raise CommandError("Error replicating DN %s" % NC, e)
     self.samdb.transaction_commit()
@@ -332,7 +333,9 @@ class cmd_drs_replicate(Command):
         self.creds = credopts.get_credentials(self.lp, fallback_machine=True)
 
         if local:
-            drs_local_replicate(self, SOURCE_DC, NC, full_sync=full_sync, single_object=single_object)
+            drs_local_replicate(self, SOURCE_DC, NC, full_sync=full_sync,
+                                single_object=single_object,
+                                sync_forced=sync_forced)
             return
 
         if local_online: