The branch, master has been updated
       via  86338ab dbcheck: cope with objects disappearing during checking
       via  819f112 samba_kcc NTDSConnection translation
       via  0a4746a Invocation of samba_kcc from KCC task
       via  0a18121 Add subreq and status to kcc_service struct
       via  b58cb7e Add DRSUAPI_DRS_UPDATE_(x) flags
       via  bc03cba Add NTDSConnection schedule attr blob
       via  a3613b0 Add samba_kcc load parameter
      from  fbfd155 Add version attribute for pytevent.

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


- Log -----------------------------------------------------------------
commit 86338ab551baf7c5dc4f63a1a103880e886acf69
Author: Andrew Tridgell <[email protected]>
Date:   Thu Dec 8 11:47:59 2011 +1100

    dbcheck: cope with objects disappearing during checking
    
    Autobuild-User: Andrew Tridgell <[email protected]>
    Autobuild-Date: Thu Dec  8 03:23:49 CET 2011 on sn-devel-104

commit 819f11285d12041f2a22a6c92ebabb8a559886c5
Author: Dave Craft <[email protected]>
Date:   Sun Dec 4 11:08:56 2011 -0600

    samba_kcc NTDSConnection translation
    
    This is an advancement of samba_kcc to compute and
    commit the modification of a repsFrom on an NC Replica.
    The repsFrom is computed according to the MS tech spec
    for implied replicas of NTDSConnections.  Proper maintenance
    of (DRS options, schedules, etc) from a NTDSConnection are now
    all present.  New classes for inter-site transports, sites,
    and repsFrom) are now present in kcc_utils.py.  Substantively
    this gets intra-site topology generation functional by committing
    the repsFrom that were computed from the DSA graph implemented in
    prior drops of samba_kcc
    
    Signed-off-by: Andrew Tridgell <[email protected]>

commit 0a4746a20085a21bd8f28faf13bc5168f3ad5afb
Author: Dave Craft <[email protected]>
Date:   Sun Dec 4 11:06:47 2011 -0600

    Invocation of samba_kcc from KCC task
    
    Modification to periodic and explicit invocation
    paths of the KCC topology generation code.  Managed
    via samba_runcmd_send() API.  The samba_kcc script
    is invoked if (kccsrv:samba_kcc = true) appears in smb.conf
    
    Signed-off-by: Andrew Tridgell <[email protected]>

commit 0a181217bdf7e59a7e1f5506c8e050f67537f7f1
Author: Dave Craft <[email protected]>
Date:   Sun Dec 4 11:04:49 2011 -0600

    Add subreq and status to kcc_service struct
    
    The subreq and status fields in the kcc_service struct
    are added for execution management of the external samba_kcc
    python script.
    
    Signed-off-by: Andrew Tridgell <[email protected]>

commit b58cb7ea932068982233e49c6e03be6a631f80da
Author: Dave Craft <[email protected]>
Date:   Sun Dec 4 11:01:54 2011 -0600

    Add DRSUAPI_DRS_UPDATE_(x) flags
    
    DRSUAPI_DRS_UPDATE flags are used in
    DRS_MSG_REPMOD_V1 message structure when repsFrom
    is modified via RPC.  The RPCs are currently uncoded but
    samba_kcc maintains the flags (and uses them to identify
    what repsFrom changes are to be executed).  These are currently
    helpful to samba_kcc and are intended to ultimately be used in
    RPCs.
    
    Signed-off-by: Andrew Tridgell <[email protected]>

commit bc03cba552b512ef436ff7da3bd0820c6341d783
Author: Dave Craft <[email protected]>
Date:   Sun Dec 4 11:00:31 2011 -0600

    Add NTDSConnection schedule attr blob
    
    Add schedule blob to drsblobs to allow
    NDR unpacking into a python class.
    
    Signed-off-by: Andrew Tridgell <[email protected]>

commit a3613b05339ea305edfdc54a02ca65506f48c356
Author: Dave Craft <[email protected]>
Date:   Sun Dec 4 10:58:16 2011 -0600

    Add samba_kcc load parameter
    
    Configures parameter to enumerate name of python KCC
    topology generator for subsequent use by samba_runcmd_send()
    invocation from kcc task
    
    Signed-off-by: Andrew Tridgell <[email protected]>

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

Summary of changes:
 lib/param/loadparm.c                             |   11 +
 librpc/idl/drsblobs.idl                          |   20 +
 librpc/idl/drsuapi.idl                           |    7 +
 source4/dsdb/kcc/kcc_periodic.c                  |   72 ++-
 source4/dsdb/kcc/kcc_service.c                   |   36 +-
 source4/dsdb/kcc/kcc_service.h                   |   11 +-
 source4/dsdb/wscript_build                       |    2 +-
 source4/scripting/bin/samba_kcc                  |  720 +++++++++++++++++---
 source4/scripting/python/samba/dbchecker.py      |   20 +-
 source4/scripting/python/samba/kcc_utils.py      |  790 +++++++++++++++++++---
 source4/scripting/python/samba/netcmd/dbcheck.py |    2 +-
 11 files changed, 1444 insertions(+), 247 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/param/loadparm.c b/lib/param/loadparm.c
index 9abd11f..48b5221 100644
--- a/lib/param/loadparm.c
+++ b/lib/param/loadparm.c
@@ -1208,6 +1208,14 @@ static struct parm_struct parm_table[] = {
                .enum_list      = NULL
        },
        {
+               .label          = "samba kcc command",
+               .type           = P_CMDLIST,
+               .p_class        = P_GLOBAL,
+               .offset         = GLOBAL_VAR(szSambaKCCCommand),
+               .special        = NULL,
+               .enum_list      = NULL
+       },
+       {
                .label          = "nsupdate command",
                .type           = P_CMDLIST,
                .p_class        = P_GLOBAL,
@@ -1439,6 +1447,7 @@ FN_GLOBAL_STRING(piddir, szPidDir)
 FN_GLOBAL_LIST(rndc_command, szRNDCCommand)
 FN_GLOBAL_LIST(dns_update_command, szDNSUpdateCommand)
 FN_GLOBAL_LIST(spn_update_command, szSPNUpdateCommand)
+FN_GLOBAL_LIST(samba_kcc_command, szSambaKCCCommand)
 FN_GLOBAL_LIST(nsupdate_command, szNSUpdateCommand)
 FN_GLOBAL_LIST(dcerpc_endpoint_servers, dcerpc_ep_servers)
 FN_GLOBAL_LIST(server_services, server_services)
@@ -3325,6 +3334,8 @@ struct loadparm_context *loadparm_init(TALLOC_CTX 
*mem_ctx)
        lpcfg_do_global_parameter(lp_ctx, "ntp signd socket directory", 
dyn_NTP_SIGND_SOCKET_DIR);
        lpcfg_do_global_parameter_var(lp_ctx, "dns update command", 
"%s/samba_dnsupdate", dyn_SCRIPTSBINDIR);
        lpcfg_do_global_parameter_var(lp_ctx, "spn update command", 
"%s/samba_spnupdate", dyn_SCRIPTSBINDIR);
+       lpcfg_do_global_parameter_var(lp_ctx, "samba kcc command",
+                                       "%s/samba_kcc", dyn_SCRIPTSBINDIR);
 #endif
        lpcfg_do_global_parameter(lp_ctx, "template shell", "/bin/false");
        lpcfg_do_global_parameter(lp_ctx, "template homedir", 
"/home/%WORKGROUP%/%ACCOUNTNAME%");
diff --git a/librpc/idl/drsblobs.idl b/librpc/idl/drsblobs.idl
index 064f6ea..1960716 100644
--- a/librpc/idl/drsblobs.idl
+++ b/librpc/idl/drsblobs.idl
@@ -151,6 +151,26 @@ interface drsblobs {
                [in] repsFromToBlob blob
                );
 
+       /* Replication schedule structures as defined in MS-ADTS 7.1.4.5
+         * Appears as attribute of NTDSConnection object
+         */
+       typedef [public] struct {
+               [value(0)] uint32 type;      /* always 0 */
+               uint32            offset;
+       } scheduleHeader;
+
+        typedef [public] struct {
+                uint8 slots[168];
+        } scheduleSlots;
+
+        typedef [public] struct {
+               uint32             size;
+               [value(0)] uint32  bandwidth;         /* ignored */
+               [value(1)] uint32  numberOfSchedules; /* always 1 */
+               scheduleHeader     headerArray[numberOfSchedules];
+               scheduleSlots      dataArray[numberOfSchedules];
+       } schedule;
+
        /*
         * partialAttributeSet
         * w2k  uses version 1
diff --git a/librpc/idl/drsuapi.idl b/librpc/idl/drsuapi.idl
index f0c8490..af7e3ed 100644
--- a/librpc/idl/drsuapi.idl
+++ b/librpc/idl/drsuapi.idl
@@ -58,6 +58,13 @@ interface drsuapi
                DRSUAPI_DRS_GET_ALL_GROUP_MEMBERSHIP  = 0x80000000
        } drsuapi_DrsOptions;
 
+       /* see DRS_MSG_REPMOD_V1 */
+       typedef [public,bitmap32bit] bitmap {
+               DRSUAPI_DRS_UPDATE_FLAGS              = 0x00000001,
+               DRSUAPI_DRS_UPDATE_ADDRESS            = 0x00000002,
+               DRSUAPI_DRS_UPDATE_SCHEDULE           = 0x00000004
+        } drsuapi_DrsUpdate;
+
        /*****************/
         /* Function 0x00 */
         typedef [bitmap32bit] bitmap {
diff --git a/source4/dsdb/kcc/kcc_periodic.c b/source4/dsdb/kcc/kcc_periodic.c
index d9a716f..f4374d2 100644
--- a/source4/dsdb/kcc/kcc_periodic.c
+++ b/source4/dsdb/kcc/kcc_periodic.c
@@ -588,12 +588,17 @@ static void kccsrv_periodic_run(struct kccsrv_service 
*service)
        TALLOC_CTX *mem_ctx;
        NTSTATUS status;
 
-       DEBUG(4,("kccsrv_periodic_run(): simple update\n"));
+       DEBUG(4,("kccsrv_periodic_run(): update\n"));
 
        mem_ctx = talloc_new(service);
-       status = kccsrv_simple_update(service, mem_ctx);
-       if (!NT_STATUS_IS_OK(status)) {
-               DEBUG(0,("kccsrv_simple_update failed - %s\n", 
nt_errstr(status)));
+
+        if (service->samba_kcc_code)
+               status = kccsrv_samba_kcc(service, mem_ctx);
+       else {
+               status = kccsrv_simple_update(service, mem_ctx);
+               if (!NT_STATUS_IS_OK(status))
+                       DEBUG(0,("kccsrv_simple_update failed - %s\n",
+                               nt_errstr(status)));
        }
 
        status = kccsrv_check_deleted(service, mem_ctx);
@@ -602,3 +607,62 @@ static void kccsrv_periodic_run(struct kccsrv_service 
*service)
        }
        talloc_free(mem_ctx);
 }
+
+/* Called when samba_kcc script has finished
+ */
+static void samba_kcc_done(struct tevent_req *subreq)
+{
+        struct kccsrv_service *service =
+               tevent_req_callback_data(subreq, struct kccsrv_service);
+        int rc;
+        int sys_errno;
+
+        service->periodic.subreq = NULL;
+
+       rc = samba_runcmd_recv(subreq, &sys_errno);
+       TALLOC_FREE(subreq);
+
+       if (rc != 0)
+               service->periodic.status =
+                       map_nt_error_from_unix_common(sys_errno);
+       else
+               service->periodic.status = NT_STATUS_OK;
+
+       if (!NT_STATUS_IS_OK(service->periodic.status))
+               DEBUG(0,(__location__ ": Failed samba_kcc - %s\n",
+                       nt_errstr(service->periodic.status)));
+       else
+               DEBUG(3,("Completed samba_kcc OK\n"));
+}
+
+/* Invocation of the samba_kcc python script for replication
+ * topology generation.
+ */
+NTSTATUS kccsrv_samba_kcc(struct kccsrv_service *service,
+                       TALLOC_CTX *ctxp)
+{
+       NTSTATUS status = NT_STATUS_OK;
+       const char * const *samba_kcc_command =
+               lpcfg_samba_kcc_command(service->task->lp_ctx);
+
+       /* kill any existing child */
+       TALLOC_FREE(service->periodic.subreq);
+
+       DEBUG(0,("Calling samba_kcc script\n"));
+       service->periodic.subreq = samba_runcmd_send(service,
+                                       service->task->event_ctx,
+                                       timeval_current_ofs(40, 0),
+                                       2, 0, samba_kcc_command, NULL);
+
+        if (service->periodic.subreq == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto xerror;
+        }
+        tevent_req_set_callback(service->periodic.subreq,
+                               samba_kcc_done, service);
+
+xerror:
+       if (!NT_STATUS_IS_OK(status))
+               DEBUG(0,(__location__ ": failed - %s\n", nt_errstr(status)));
+       return status;
+}
diff --git a/source4/dsdb/kcc/kcc_service.c b/source4/dsdb/kcc/kcc_service.c
index 5f7b537..ac19522 100644
--- a/source4/dsdb/kcc/kcc_service.c
+++ b/source4/dsdb/kcc/kcc_service.c
@@ -144,16 +144,18 @@ static WERROR kccsrv_load_partitions(struct 
kccsrv_service *s)
 static NTSTATUS kccsrv_execute_kcc(struct irpc_message *msg, struct 
drsuapi_DsExecuteKCC *r)
 {
        TALLOC_CTX *mem_ctx;
-       NTSTATUS status;
+       NTSTATUS status = NT_STATUS_OK;
        struct kccsrv_service *service = talloc_get_type(msg->private_data, 
struct kccsrv_service);
 
        mem_ctx = talloc_new(service);
-       status = kccsrv_simple_update(service, mem_ctx);
 
-       if (!NT_STATUS_IS_OK(status)) {
-               DEBUG(0,("kccsrv_simple_update failed - %s\n", 
nt_errstr(status)));
-               talloc_free(mem_ctx);
-               return status;
+       if (service->samba_kcc_code)
+               status = kccsrv_samba_kcc(service, mem_ctx);
+       else {
+               status = kccsrv_simple_update(service, mem_ctx);
+               if (!NT_STATUS_IS_OK(status))
+                       DEBUG(0,("kccsrv_execute_kcc failed - %s\n",
+                               nt_errstr(status)));
        }
 
        talloc_free(mem_ctx);
@@ -222,10 +224,18 @@ static void kccsrv_task_init(struct task_server *task)
                return;
        }
 
-       periodic_startup_interval       = lpcfg_parm_int(task->lp_ctx, NULL, 
"kccsrv",
-                                                     
"periodic_startup_interval", 15); /* in seconds */
-       service->periodic.interval      = lpcfg_parm_int(task->lp_ctx, NULL, 
"kccsrv",
-                                                     "periodic_interval", 
300); /* in seconds */
+       periodic_startup_interval =
+               lpcfg_parm_int(task->lp_ctx, NULL, "kccsrv",
+                             "periodic_startup_interval", 15); /* in seconds */
+       service->periodic.interval =
+               lpcfg_parm_int(task->lp_ctx, NULL, "kccsrv",
+                             "periodic_interval", 300); /* in seconds */
+
+       /* (kccsrv:samba_kcc=true) will run newer samba_kcc replication
+        * topology generation code.
+        */
+       service->samba_kcc_code = lpcfg_parm_bool(task->lp_ctx, NULL,
+                                               "kccsrv", "samba_kcc", false);
 
        status = kccsrv_periodic_schedule(service, periodic_startup_interval);
        if (!W_ERROR_IS_OK(status)) {
@@ -235,12 +245,6 @@ static void kccsrv_task_init(struct task_server *task)
                return;
        }
 
-       /* (kccsrv:intrasite=true) will run newer intrasite replication
-        * topology code.
-        */
-       service->intrasite_code = lpcfg_parm_bool(task->lp_ctx, NULL, "kccsrv",
-                                               "intrasite", false);
-
        irpc_add_name(task->msg_ctx, "kccsrv");
 
        IRPC_REGISTER(task->msg_ctx, drsuapi, DRSUAPI_DSEXECUTEKCC, 
kccsrv_execute_kcc, service);
diff --git a/source4/dsdb/kcc/kcc_service.h b/source4/dsdb/kcc/kcc_service.h
index 1404a9a..1e6d35e 100644
--- a/source4/dsdb/kcc/kcc_service.h
+++ b/source4/dsdb/kcc/kcc_service.h
@@ -77,14 +77,21 @@ struct kccsrv_service {
 
                /* here we have a reference to the timed event the schedules 
the periodic stuff */
                struct tevent_timer *te;
+
+               /* samba_runcmd_send service for samba_kcc */
+               struct tevent_req *subreq;
+
+               /* return status of samba_kcc */
+               NTSTATUS status;
+
        } periodic;
 
        time_t last_deleted_check;
 
        bool am_rodc;
 
-       /* run new intra-site topology code */
-       bool intrasite_code;
+       /* run new samba_kcc topology generator code */
+       bool samba_kcc_code;
 };
 
 struct kcc_connection_list;
diff --git a/source4/dsdb/wscript_build b/source4/dsdb/wscript_build
index 7645ae7..0eb4eeb 100644
--- a/source4/dsdb/wscript_build
+++ b/source4/dsdb/wscript_build
@@ -43,7 +43,7 @@ bld.SAMBA_MODULE('service_kcc',
        autoproto='kcc/kcc_service_proto.h',
        subsystem='service',
        init_function='server_service_kcc_init',
-       deps='samdb process_model RPC_NDR_IRPC RPC_NDR_DRSUAPI',
+       deps='samdb process_model RPC_NDR_IRPC RPC_NDR_DRSUAPI UTIL_RUNCMD',
        internal_module=False,
        )
 
diff --git a/source4/scripting/bin/samba_kcc b/source4/scripting/bin/samba_kcc
index c024cd4..c17439e 100755
--- a/source4/scripting/bin/samba_kcc
+++ b/source4/scripting/bin/samba_kcc
@@ -20,6 +20,7 @@
 import os
 import sys
 import random
+import copy
 
 # ensure we get messages out immediately, so they get in the samba logs,
 # and don't get swallowed by a timeout
@@ -41,6 +42,7 @@ import logging
 from samba           import getopt as options
 from samba.auth      import system_session
 from samba.samdb     import SamDB
+from samba.dcerpc    import drsuapi
 from samba.kcc_utils import *
 
 class KCC:
@@ -55,12 +57,47 @@ class KCC:
            our local DCs partitions or all the partitions in
            the forest
         """
-        self.dsa_table     = {}    # dsa objects
-        self.part_table    = {}    # partition objects
-        self.site_table    = {}
+        self.part_table      = {}    # partition objects
+        self.site_table      = {}
+        self.transport_table = {}
+
         self.my_dsa_dnstr  = None  # My dsa DN
+        self.my_dsa        = None  # My dsa object
+
         self.my_site_dnstr = None
+        self.my_site       = None
+
         self.samdb         = samdb
+        return
+
+    def load_all_transports(self):
+        """Loads the inter-site transport objects for Sites
+           Raises an Exception on error
+        """
+        try:
+            res = samdb.search("CN=Inter-Site Transports,CN=Sites,%s" % \
+                               samdb.get_config_basedn(),
+                               scope=ldb.SCOPE_SUBTREE,
+                               expression="(objectClass=interSiteTransport)")
+        except ldb.LdbError, (enum, estr):
+            raise Exception("Unable to find inter-site transports - (%s)" % 
estr)
+
+        for msg in res:
+            dnstr = str(msg.dn)
+
+            # already loaded
+            if dnstr in self.transport_table.keys():
+                continue
+
+            transport = Transport(dnstr)
+
+            transport.load_transport(samdb)
+
+            # Assign this transport to table
+            # and index by dn
+            self.transport_table[dnstr] = transport
+
+        return
 
     def load_my_site(self):
         """Loads the Site class for the local DSA
@@ -69,14 +106,14 @@ class KCC:
         self.my_site_dnstr = "CN=%s,CN=Sites,%s" % (samdb.server_site_name(),
                              samdb.get_config_basedn())
         site = Site(self.my_site_dnstr)
-
         site.load_site(samdb)
+
         self.site_table[self.my_site_dnstr] = site
+        self.my_site = site
+        return
 
     def load_my_dsa(self):
-        """Discover my nTDSDSA thru the rootDSE entry and
-           instantiate and load the DSA.  The dsa is inserted
-           into the dsa_table by dn string
+        """Discover my nTDSDSA dn thru the rootDSE entry
            Raises an Exception on error.
         """
         dn = ldb.Dn(self.samdb, "")
@@ -86,49 +123,10 @@ class KCC:
         except ldb.LdbError, (enum, estr):
             raise Exception("Unable to find my nTDSDSA - (%s)" % estr)
 
-        dnstr = res[0]["dsServiceName"][0]
-
-        # already loaded
-        if dnstr in self.dsa_table.keys():
-            return
-
-        self.my_dsa_dnstr = dnstr
-        dsa = DirectoryServiceAgent(dnstr)
-
-        dsa.load_dsa(samdb)
-
-        # Assign this dsa to my dsa table
-        # and index by dsa dn
-        self.dsa_table[dnstr] = dsa
-
-    def load_all_dsa(self):
-        """Discover all nTDSDSA thru the sites entry and
-           instantiate and load the DSAs.  Each dsa is inserted
-           into the dsa_table by dn string.
-           Raises an Exception on error.
-        """
-        try:
-            res = self.samdb.search("CN=Sites,%s" %
-                                    self.samdb.get_config_basedn(),
-                                    scope=ldb.SCOPE_SUBTREE,
-                                    expression="(objectClass=nTDSDSA)")
-        except ldb.LdbError, (enum, estr):
-            raise Exception("Unable to find nTDSDSAs - (%s)" % estr)
+        self.my_dsa_dnstr = res[0]["dsServiceName"][0]
+        self.my_dsa = self.my_site.get_dsa(self.my_dsa_dnstr)
 
-        for msg in res:
-            dnstr = str(msg.dn)
-
-            # already loaded
-            if dnstr in self.dsa_table.keys():
-                continue
-
-            dsa = DirectoryServiceAgent(dnstr)
-
-            dsa.load_dsa(self.samdb)
-
-            # Assign this dsa to my dsa table
-            # and index by dsa dn
-            self.dsa_table[dnstr] = dsa
+        return
 
     def load_all_partitions(self):
         """Discover all NCs thru the Partitions dn and
@@ -158,16 +156,15 @@ class KCC:
             self.part_table[partstr] = part
 
     def should_be_present_test(self):
-        """Enumerate all loaded partitions and DSAs and test
-           if NC should be present as replica
+        """Enumerate all loaded partitions and DSAs in local
+           site and test if NC should be present as replica
         """
         for partdn, part in self.part_table.items():
-
-           for dsadn, dsa in self.dsa_table.items():
+            for dsadn, dsa in self.my_site.dsa_table.items():
                needed, ro, partial = part.should_be_present(dsa)
-
                logger.info("dsadn:%s\nncdn:%s\nneeded=%s:ro=%s:partial=%s\n" % 
\
-                           (dsa.dsa_dnstr, part.nc_dnstr, needed, ro, partial))
+                           (dsadn, part.nc_dnstr, needed, ro, partial))
+        return
 
     def refresh_failed_links_connections(self):
         # XXX - not implemented yet
@@ -186,12 +183,500 @@ class KCC:
         # XXX - not implemented yet
         return
 
-    def remove_unneeded_ntds_connections(self):
+    def remove_unneeded_ntdsconn(self):
         # XXX - not implemented yet
         return
 
-    def translate_connections(self):
-        # XXX - not implemented yet
+    def get_dsa_by_guidstr(self, guidstr):
+        """Given a DSA guid string, consule all sites looking
+           for the corresponding DSA and return it.
+        """
+        for site in self.site_table.values():
+            dsa = site.get_dsa_by_guidstr(guidstr)
+            if dsa is not None:
+                return dsa
+        return None
+
+    def get_dsa(self, dnstr):
+        """Given a DSA dn string, consule all sites looking
+           for the corresponding DSA and return it.
+        """
+        for site in self.site_table.values():
+            dsa = site.get_dsa(dnstr)
+            if dsa is not None:
+                return dsa
+        return None
+
+    def modify_repsFrom(self, n_rep, t_repsFrom, s_rep, s_dsa, cn_conn):
+        """Update t_repsFrom if necessary to satisfy requirements. Such
+           updates are typically required when the IDL_DRSGetNCChanges
+           server has moved from one site to another--for example, to
+           enable compression when the server is moved from the
+           client's site to another site.
+           :param n_rep: NC replica we need
+           :param t_repsFrom: repsFrom tuple to modify
+           :param s_rep: NC replica at source DSA
+           :param s_dsa: source DSA
+           :param cn_conn: Local DSA NTDSConnection child
+           Returns (update) bit field containing which portion of the
+           repsFrom was modified.  This bit field is suitable as input
+           to IDL_DRSReplicaModify ulModifyFields element, as it consists
+           of these bits:
+               drsuapi.DRSUAPI_DRS_UPDATE_SCHEDULE
+               drsuapi.DRSUAPI_DRS_UPDATE_FLAGS
+               drsuapi.DRSUAPI_DRS_UPDATE_ADDRESS
+        """
+        s_dnstr = s_dsa.dsa_dnstr
+        update  = 0x0
+
+        if self.my_site.get_dsa(s_dnstr) is s_dsa:
+            same_site = True


-- 
Samba Shared Repository

Reply via email to