[SCM] Samba Shared Repository - branch master updated

Andrew Bartlett abartlet at samba.org
Sat May 30 15:56:04 MDT 2015


The branch, master has been updated
       via  0791bb0 KCC: improve docstring for KCC.load_samdb()
       via  3c41fcf KCC: improve docstring for KCC.list_dsas()
       via  b7f3ddc KCC: slightly improve docstring for KCC.create_connection()
       via  3bc2880 KCC: improve docstring for KCC.is_bridgehead_failed()
       via  0175832 KCC: Slightly improve docstring for KCC.get_all_bridgeheads()
       via  40d451a KCC: Slightly improve docstring for KCC.get_bridgehead()
       via  6a28fc8 KCC: improve docstring for KCC.load_all_partitions()
       via  2f6c70a KCC: improve docstring for KCC.add_transports()
       via  f21d5ee KCC: improve docstring for KCC.setup_graph()
       via  9f3fcb0 KCC: improve docstring for KCC.translate_ntdsconn()
       via  ed3035a KCC: improve docstring for KCC.modify_repsFrom()
       via  a2ac039 KCC: improve docstring for KCC.is_stale_link_connection()
       via  aa4588d KCC: improve docstring for KCC.merge_failed_links()
       via  692d9c9 KCC: improve docstring and comment for kcc.remove_unneeded_ntdsconn()
       via  5b42154 KCC: improve docstring for KCC.load_my_dsa()
       via  59a0790 KCC: improve docstring for KCC.load_my_site()
       via  d77e149 KCC: improve docstring for KCC.load_mysite()
       via  f66a2f0 KCC: improve docstring and comments for KCC.load_site()
       via  7f7339c KCC: improve docstring for KCC.load_all_sitelinks()
       via  2b304cd KCC: improve docstring for KCC.load_all_transports()
       via  64f5aa7 KCC: docstring for the KCC class
       via  0724f5d KCC: improve docstring for is_smtp_replication_available()
       via  9fcbc8d KCC: docstring for sort_dsa_by_gc_and_guid
       via  482d7f2 KCC: Docstring for sort_replica_by_dsa_guid
       via  d176e8d KCC: tests/ldif_utils tests ldif import
       via  55850a3 KCC: ldif_utils: ldif_to_samdb doesn't need creds; begin selftest
       via  6965ed8 KCC: add multisite ldif file for KCC tests
       via  11633f7 kcc: translate over other DSA for repsFrom graph
       via  6d99636 kcc: prevent non-determinism when running translation
      from  a937590 ctdb: remove various dead prototypes from the ctdb private header.

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


- Log -----------------------------------------------------------------
commit 0791bb07ca4c356dab60e2a8223b1ebbc6ea0060
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Apr 30 11:34:21 2015 +1200

    KCC: improve docstring for KCC.load_samdb()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    
    Autobuild-User(master): Andrew Bartlett <abartlet at samba.org>
    Autobuild-Date(master): Sat May 30 23:55:22 CEST 2015 on sn-devel-104

commit 3c41fcffb6cb26219c4635146ce0ebe1068f0d60
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Apr 30 11:33:59 2015 +1200

    KCC: improve docstring for KCC.list_dsas()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit b7f3ddca085116481f04c6f2bea7111df1570859
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Apr 28 11:32:27 2015 +1200

    KCC: slightly improve docstring for KCC.create_connection()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 3bc288019bec26bd9b7077a54416a8ec920d6b31
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Apr 28 11:31:51 2015 +1200

    KCC: improve docstring for KCC.is_bridgehead_failed()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 017583269c4050a635adeca52c0c7fbf3250dc33
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Apr 28 11:30:30 2015 +1200

    KCC: Slightly improve docstring for KCC.get_all_bridgeheads()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 40d451a7da63b145434bf2ed4fa13bcb257ed0ac
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Apr 28 11:29:47 2015 +1200

    KCC: Slightly improve docstring for KCC.get_bridgehead()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 6a28fc83641b687d3821c1f2689f29ff22f58312
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Apr 28 11:22:40 2015 +1200

    KCC: improve docstring for KCC.load_all_partitions()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 2f6c70a450163e1fc92de34eefc96581041b9807
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Apr 28 11:14:04 2015 +1200

    KCC: improve docstring for KCC.add_transports()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit f21d5ee8d7dd65bbed46da2b2c1c6ca58b66ee68
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Apr 28 11:13:23 2015 +1200

    KCC: improve docstring for KCC.setup_graph()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 9f3fcb065cc26f74248ebf4f47331cb475abe905
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Apr 28 11:11:43 2015 +1200

    KCC: improve docstring for KCC.translate_ntdsconn()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit ed3035a68009cc5e6477f7c9156cea418ff18d1f
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Apr 28 11:10:46 2015 +1200

    KCC: improve docstring for KCC.modify_repsFrom()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit a2ac039d37ffe51c5d689e28e7f67a9d5064dfd8
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Apr 28 11:06:58 2015 +1200

    KCC: improve docstring for KCC.is_stale_link_connection()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit aa4588db63e8d9de22963272cd450b2c91085138
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Apr 28 11:05:06 2015 +1200

    KCC: improve docstring for KCC.merge_failed_links()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 692d9c912775003991435a0057a63b4da3be60e6
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Apr 28 11:01:13 2015 +1200

    KCC: improve docstring and comment for kcc.remove_unneeded_ntdsconn()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 5b421545f344944f44020a61558af34f32d0266d
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Apr 24 16:56:36 2015 +1200

    KCC: improve docstring for KCC.load_my_dsa()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 59a07905d5163d01da3a79cb52bc34d18c1871bf
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Apr 24 16:56:05 2015 +1200

    KCC: improve docstring for KCC.load_my_site()
    
    Separating :return: from :raise:
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit d77e149fac0e16c0bb6b479e28b678320c15739f
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Apr 24 16:54:35 2015 +1200

    KCC: improve docstring for KCC.load_mysite()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit f66a2f031784ec17ee1e124a6bb53c5a519b5c57
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Apr 24 16:53:35 2015 +1200

    KCC: improve docstring and comments for KCC.load_site()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 7f7339cced2d20b67195db03add0f91cc9f01152
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Apr 24 16:52:59 2015 +1200

    KCC: improve docstring for KCC.load_all_sitelinks()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 2b304cde65d38d6ac58963b3fa93607900fae12e
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Apr 24 16:52:33 2015 +1200

    KCC: improve docstring for KCC.load_all_transports()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 64f5aa7bfd1844ac5adf4e8b6fad474c74a84a01
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Apr 24 16:51:33 2015 +1200

    KCC: docstring for the KCC class
    
    The params describe the __init__ method arguments.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 0724f5dab43187d2dcc9ef15d09f3ce9dc2663fd
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Apr 24 16:48:51 2015 +1200

    KCC: improve docstring for is_smtp_replication_available()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 9fcbc8d1efc7b0c8d0bd2c9c01e1da412c0f5f7e
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Apr 24 16:48:08 2015 +1200

    KCC: docstring for sort_dsa_by_gc_and_guid
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 482d7f27fe6d7de0ff9afa138204d105ca4a5886
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Apr 24 16:47:36 2015 +1200

    KCC: Docstring for sort_replica_by_dsa_guid
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit d176e8d441bb3ba49b0a6cbae38446aff5cbf0c2
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Apr 16 17:26:51 2015 +1200

    KCC: tests/ldif_utils tests ldif import
    
    Thanks as usual to Andrew Bartlett for his help.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 55850a3dad999297a7e31befadc700bebb23ca7a
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Apr 28 11:38:51 2015 +1200

    KCC: ldif_utils: ldif_to_samdb doesn't need creds; begin selftest
    
    The tests are based on the testdata/ldif-utils-test-multisite.ldif
    which describes a multisite windows network. It was constructed by
    Garming Sam.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 6965ed844d5fd0a4a968300826de46885720c14e
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Apr 28 11:39:49 2015 +1200

    KCC: add multisite ldif file for KCC tests
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 11633f791f44a863c96d42aa02830caf007eb79f
Author: Garming Sam <garming at catalyst.net.nz>
Date:   Fri Apr 10 16:17:28 2015 +1200

    kcc: translate over other DSA for repsFrom graph
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 6d99636cf1ab7de4caedfa909f1255599aef5cf5
Author: Garming Sam <garming at catalyst.net.nz>
Date:   Fri Apr 10 16:15:28 2015 +1200

    kcc: prevent non-determinism when running translation
    
    RODC connections could appear first some runs while not always. This would
    mean that repsFrom could accidentally be deleted.
    
    Signed-off-by: Garming Sam <garming at catalyst.net.nz>
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

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

Summary of changes:
 python/samba/kcc_utils.py               |   19 +-
 python/samba/ldif_utils.py              |    5 +-
 python/samba/tests/ldif_utils.py        |  124 ++++
 selftest/tests.py                       |    1 +
 source4/scripting/bin/samba_kcc         |  239 ++++++--
 testdata/ldif-utils-test-multisite.ldif | 1007 +++++++++++++++++++++++++++++++
 6 files changed, 1327 insertions(+), 68 deletions(-)
 create mode 100644 python/samba/tests/ldif_utils.py
 create mode 100644 testdata/ldif-utils-test-multisite.ldif


Changeset truncated at 500 lines:

diff --git a/python/samba/kcc_utils.py b/python/samba/kcc_utils.py
index f45a972..2e0be7f 100644
--- a/python/samba/kcc_utils.py
+++ b/python/samba/kcc_utils.py
@@ -750,11 +750,12 @@ class DirectoryServiceAgent(object):
 
         :param from_dnstr: search for this from server entry
         """
-        #XXX is this connection always unique?
+        answer = []
         for connect in self.connect_table.values():
             if connect.get_from_dnstr() == from_dnstr:
-                return connect
-        return None
+                answer.append(connect)
+
+        return answer
 
     def dumpstr_current_replica_table(self):
         '''Debug dump string output of current replica table'''
@@ -1725,7 +1726,7 @@ class GraphNode(object):
            is a corresponding nTDSConnection object in the dsa.
         """
         for edge_dnstr in self.edge_from:
-            connect = dsa.get_connection_by_from_dnstr(edge_dnstr)
+            connections = dsa.get_connection_by_from_dnstr(edge_dnstr)
 
             # For each edge directed to the NC replica that
             # "should be present" on the local DC, the KCC determines
@@ -1739,8 +1740,16 @@ class GraphNode(object):
             #    the DC on which ri "is present".
             #
             #    c.options does not contain NTDSCONN_OPT_RODC_TOPOLOGY
-            if connect and not connect.is_rodc_topology():
+
+            found_valid = False
+            for connect in connections:
+                if connect.is_rodc_topology():
+                    continue
+                found_valid = True
+
+            if found_valid:
                 continue
+
             # if no such object exists then the KCC adds an object
             # c with the following attributes
 
diff --git a/python/samba/ldif_utils.py b/python/samba/ldif_utils.py
index 55d2dd3..47f4fd0 100644
--- a/python/samba/ldif_utils.py
+++ b/python/samba/ldif_utils.py
@@ -38,7 +38,7 @@ def write_search_result(samdb, f, res):
         f.write("%s" % lstr)
 
 
-def ldif_to_samdb(dburl, lp, creds, ldif_file, forced_local_dsa=None):
+def ldif_to_samdb(dburl, lp, ldif_file, forced_local_dsa=None):
     """Routine to import all objects and attributes that are relevent
     to the KCC algorithms from a previously exported LDIF file.
 
@@ -83,8 +83,7 @@ dsServiceName: CN=NTDS Settings,%s
     # We have an abbreviated list of options here because we have built
     # an abbreviated database.  We use the rootdse and extended-dn
     # modules only during this re-open
-    samdb = SamDB(url=dburl, session_info=system_session(),
-                  credentials=creds, lp=lp,
+    samdb = SamDB(url=dburl, session_info=system_session(), lp=lp,
                   options=["modules:rootdse,extended_dn_in,"
                            "extended_dn_out_ldb"])
     return samdb
diff --git a/python/samba/tests/ldif_utils.py b/python/samba/tests/ldif_utils.py
new file mode 100644
index 0000000..73eccfe
--- /dev/null
+++ b/python/samba/tests/ldif_utils.py
@@ -0,0 +1,124 @@
+# Unix SMB/CIFS implementation. Tests for graph_utils.py routines
+# Copyright (C) Andrew Bartlett 2015
+#
+# Written by Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+
+"""Tests for samba.ldif_utils"""
+
+import samba
+import os
+from tempfile import mkdtemp
+
+import samba.tests
+from samba import ldif_utils
+from samba import ldb
+from samba.dcerpc import misc
+
+
+from samba.param import LoadParm
+from samba.credentials import Credentials
+from samba.samdb import SamDB
+
+MULTISITE_LDIF = os.path.join(os.environ['SRCDIR_ABS'],
+                              "testdata/ldif-utils-test-multisite.ldif")
+
+MULTISITE_LDIF_DSAS = (
+    ("CN=WIN08,CN=Servers,CN=Site-4,CN=Sites,CN=Configuration,DC=ad,DC=samba,DC=example,DC=com",
+     "Site-4"),
+    ("CN=WIN07,CN=Servers,CN=Site-4,CN=Sites,CN=Configuration,DC=ad,DC=samba,DC=example,DC=com",
+     "Site-4"),
+    ("CN=WIN06,CN=Servers,CN=Site-3,CN=Sites,CN=Configuration,DC=ad,DC=samba,DC=example,DC=com",
+     "Site-3"),
+    ("CN=WIN09,CN=Servers,CN=Site-5,CN=Sites,CN=Configuration,DC=ad,DC=samba,DC=example,DC=com",
+     "Site-5"),
+    ("CN=WIN10,CN=Servers,CN=Site-5,CN=Sites,CN=Configuration,DC=ad,DC=samba,DC=example,DC=com",
+     "Site-5"),
+    ("CN=WIN02,CN=Servers,CN=Site-2,CN=Sites,CN=Configuration,DC=ad,DC=samba,DC=example,DC=com",
+     "Site-2"),
+    ("CN=WIN04,CN=Servers,CN=Site-2,CN=Sites,CN=Configuration,DC=ad,DC=samba,DC=example,DC=com",
+     "Site-2"),
+    ("CN=WIN03,CN=Servers,CN=Site-2,CN=Sites,CN=Configuration,DC=ad,DC=samba,DC=example,DC=com",
+     "Site-2"),
+    ("CN=WIN05,CN=Servers,CN=Site-2,CN=Sites,CN=Configuration,DC=ad,DC=samba,DC=example,DC=com",
+     "Site-2"),
+    ("CN=WIN01,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=ad,DC=samba,DC=example,DC=com",
+     "Default-First-Site-Name"),
+)
+
+
+class LdifUtilTests(samba.tests.TestCase):
+    def setUp(self):
+        super(LdifUtilTests, self).setUp()
+        self.lp = LoadParm()
+        self.creds = Credentials()
+        self.creds.guess(self.lp)
+        #self.creds.set_machine_account(self.lp)
+        self.tmpdir = mkdtemp()
+
+    def tearDown(self):
+        #shutil.rmtree(self.tmpdir)
+        pass
+
+    def test_write_search_url(self):
+        pass
+        #write_search_result(samdb, f, res)
+
+    def test_ldif_to_samdb(self):
+        dburl = os.path.join(self.tmpdir, "ldap")
+        samdb = ldif_utils.ldif_to_samdb(dburl, self.lp, MULTISITE_LDIF)
+        self.assertIsInstance(samdb, SamDB)
+
+        dsa = ("CN=WIN01,CN=Servers,CN=Default-First-Site-Name,CN=Sites,"
+               "CN=Configuration,DC=ad,DC=samba,DC=example,DC=com")
+        res = samdb.search(ldb.Dn(samdb, "CN=NTDS Settings," + dsa),
+                           scope=ldb.SCOPE_BASE, attrs=["objectGUID"])
+
+        ntds_guid = misc.GUID(samdb.get_ntds_GUID())
+        self.assertEqual(misc.GUID(res[0]["objectGUID"][0]), ntds_guid)
+
+        service_name_res = samdb.search(base="",
+                                        scope=ldb.SCOPE_BASE,
+                                        attrs=["dsServiceName"])
+        dn = ldb.Dn(samdb,
+                    service_name_res[0]["dsServiceName"][0])
+        self.assertEqual(dn, ldb.Dn(samdb, "CN=NTDS Settings," + dsa))
+
+    def test_ldif_to_samdb_forced_local_dsa(self):
+        for dsa, site in MULTISITE_LDIF_DSAS:
+            dburl = os.path.join(self.tmpdir, "ldif-to-samba-forced-local-dsa"
+                                 "-%s" % dsa)
+            samdb = ldif_utils.ldif_to_samdb(dburl, self.lp, MULTISITE_LDIF,
+                                             forced_local_dsa=dsa)
+            self.assertIsInstance(samdb, SamDB)
+            self.assertEqual(samdb.server_site_name(), site)
+
+            res = samdb.search(ldb.Dn(samdb, "CN=NTDS Settings," + dsa),
+                               scope=ldb.SCOPE_BASE, attrs=["objectGUID"])
+
+            ntds_guid = misc.GUID(samdb.get_ntds_GUID())
+            self.assertEqual(misc.GUID(res[0]["objectGUID"][0]), ntds_guid)
+
+            service_name_res = samdb.search(base="",
+                                            scope=ldb.SCOPE_BASE,
+                                            attrs=["dsServiceName"])
+            dn = ldb.Dn(samdb,
+                        service_name_res[0]["dsServiceName"][0])
+            self.assertEqual(dn, ldb.Dn(samdb, "CN=NTDS Settings," + dsa))
+
+    def samdb_to_ldif_file(self):
+        #samdb_to_ldif_file(samdb, dburl, lp, creds, ldif_file):
+        pass
diff --git a/selftest/tests.py b/selftest/tests.py
index 8cf35ac..e6a9207 100644
--- a/selftest/tests.py
+++ b/selftest/tests.py
@@ -97,4 +97,5 @@ planpythontestsuite("none", "samba.tests.xattr")
 planpythontestsuite("none", "samba.tests.ntacls")
 planpythontestsuite("none", "samba.tests.policy")
 planpythontestsuite("none", "samba.tests.graph_utils")
+planpythontestsuite("none", "samba.tests.ldif_utils")
 plantestsuite("wafsamba.duplicate_symbols", "none", [os.path.join(srcdir(), "buildtools/wafsamba/test_duplicate_symbol.sh")])
diff --git a/source4/scripting/bin/samba_kcc b/source4/scripting/bin/samba_kcc
index 8ba4dec..1c1e6d9 100755
--- a/source4/scripting/bin/samba_kcc
+++ b/source4/scripting/bin/samba_kcc
@@ -66,6 +66,12 @@ class KCC(object):
     A container for objects and methods allowing a run of the KCC.  Produces a
     set of connections in the samdb for which the Distributed Replication
     Service can then utilize to replicate naming contexts
+
+    :param unix_now: The putative current time in seconds since 1970.
+    :param read_only: Don't write to the database.
+    :param verify: Check topological invariants for the generated graphs
+    :param debug: Write verbosely to stderr.
+    "param dot_files: write Graphviz files in /tmp showing topology
     """
     def __init__(self):
         """Initializes the partitions class which can hold
@@ -105,7 +111,8 @@ class KCC(object):
     def load_all_transports(self):
         """Loads the inter-site transport objects for Sites
 
-        ::returns: Raises KCCError on error
+        :return: None
+        :raise KCCError: if no IP transport is found
         """
         try:
             res = self.samdb.search("CN=Inter-Site Transports,CN=Sites,%s" %
@@ -133,7 +140,8 @@ class KCC(object):
     def load_all_sitelinks(self):
         """Loads the inter-site siteLink objects
 
-        ::returns: Raises KCCError on error
+        :return: None
+        :raise KCCError: if site-links aren't found
         """
         try:
             res = self.samdb.search("CN=Inter-Site Transports,CN=Sites,%s" %
@@ -159,14 +167,19 @@ class KCC(object):
             self.sitelink_table[dnstr] = sitelink
 
     def load_site(self, dn_str):
-        """Helper for load_my_site and load_all_sites. It puts all the site's
-        DSAs into the KCC indices.
+        """Helper for load_my_site and load_all_sites.
+
+        Put all the site's DSAs into the KCC indices.
+
+        :param dn_str: a site dn_str
+        :return: the Site object pertaining to the dn_str
         """
         site = Site(dn_str, unix_now)
         site.load_site(self.samdb)
 
-        # I am not sure why, but we avoid replacing the site with an
-        # identical copy.
+        # We avoid replacing the site with an identical copy in case
+        # somewhere else has a reference to the old one, which would
+        # lead to all manner of confusion and chaos.
         guid = str(site.site_guid)
         if guid not in self.site_table:
             self.site_table[guid] = site
@@ -177,9 +190,9 @@ class KCC(object):
         return self.site_table[guid]
 
     def load_my_site(self):
-        """Loads the Site class for the local DSA
+        """Load the Site object for the local DSA.
 
-        ::returns: Raises an Exception on error
+        :return: None
         """
         self.my_site_dnstr = ("CN=%s,CN=Sites,%s" % (
             self.samdb.server_site_name(),
@@ -188,10 +201,10 @@ class KCC(object):
         self.my_site = self.load_site(self.my_site_dnstr)
 
     def load_all_sites(self):
-        """Discover all sites and instantiate and load each
-        NTDS Site settings.
+        """Discover all sites and create Site objects.
 
-        ::returns: Raises KCCError on error
+        :return: None
+        :raise: KCCError if sites can't be found
         """
         try:
             res = self.samdb.search("CN=Sites,%s" %
@@ -208,7 +221,8 @@ class KCC(object):
     def load_my_dsa(self):
         """Discover my nTDSDSA dn thru the rootDSE entry
 
-        ::returns: Raises KCCError on error.
+        :return: None
+        :raise: KCCError if DSA can't be found
         """
         dn = ldb.Dn(self.samdb, "<GUID=%s>" % self.samdb.get_ntds_GUID())
         try:
@@ -260,13 +274,13 @@ class KCC(object):
             self.dsa_by_guid[str(self.my_dsa.dsa_guid)] = self.my_dsa
 
     def load_all_partitions(self):
-        """Discover all NCs thru the Partitions dn and
-        instantiate and load the NCs.
+        """Discover and load all partitions.
 
         Each NC is inserted into the part_table by partition
         dn string (not the nCName dn string)
 
-        ::returns: Raises KCCError on error
+        :return: None
+        :raise: KCCError if partitions can't be found
         """
         try:
             res = self.samdb.search("CN=Partitions,%s" %
@@ -355,12 +369,16 @@ class KCC(object):
         self.kcc_failed_connections.difference_update(restore_connections)
 
     def is_stale_link_connection(self, target_dsa):
-        """Returns False if no tuple z exists in the kCCFailedLinks or
-        kCCFailedConnections variables such that z.UUIDDsa is the
-        objectGUID of the target dsa, z.FailureCount > 0, and
-        the current time - z.TimeFirstFailure > 2 hours.
+        """Check whether a link to a remote DSA is stale
+
+        Used in MS-ADTS 6.2.2.2 Intrasite Connection Creation
+
+        Returns True if the remote seems to have been down for at
+        least two hours, otherwise False.
+
+        :param target_dsa: the remote DSA object
+        :return: True if link is stale, otherwise False
         """
-        # Returns True if tuple z exists...
         failed_link = self.kcc_failed_links.get(str(target_dsa.dsa_guid))
         if failed_link:
             # failure_count should be > 0, but check anyways
@@ -390,12 +408,17 @@ class KCC(object):
         pass
 
     def remove_unneeded_ntdsconn(self, all_connected):
-        """Removes unneeded NTDS Connections after computation
-        of KCC intra and inter-site topology has finished.
+        """Remove unneeded NTDS Connections once topology is calculated
+
+        Based on MS-ADTS 6.2.2.4 Removing Unnecessary Connections
+
+        :param all_connected: indicates whether all sites are connected
+        :return: None
         """
         mydsa = self.my_dsa
 
-        # Loop thru connections
+        # New connections won't have GUIDs which are needed for
+        # sorting. Add them.
         for cn_conn in mydsa.connect_table.values():
             if cn_conn.guid is None:
                 if opts.readonly:
@@ -540,7 +563,9 @@ class KCC(object):
             mydsa.commit_connections(self.samdb)
 
     def modify_repsFrom(self, n_rep, t_repsFrom, s_rep, s_dsa, cn_conn):
-        """Part of MS-ADTS 6.2.2.5.
+        """Update an repsFrom object if required.
+
+        Part of MS-ADTS 6.2.2.5.
 
         Update t_repsFrom if necessary to satisfy requirements. Such
         updates are typically required when the IDL_DRSGetNCChanges
@@ -548,19 +573,18 @@ class KCC(object):
         enable compression when the server is moved from the
         client's site to another site.
 
+        The repsFrom.update_flags bit field may be modified
+        auto-magically if any changes are made here. See
+        kcc_utils.RepsFromTo for gory details.
+
+
         :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
+        :return: None
         """
         s_dnstr = s_dsa.dsa_dnstr
         update = 0x0
@@ -881,20 +905,31 @@ class KCC(object):
         else:
             return False, None
 
-    def translate_ntdsconn(self):
-        """This function adjusts values of repsFrom abstract attributes of NC
+    def translate_ntdsconn(self, current_dsa=None):
+        """Adjust repsFrom to match NTDSConnections
+
+        This function adjusts values of repsFrom abstract attributes of NC
         replicas on the local DC to match those implied by
         nTDSConnection objects.
-        [MS-ADTS] 6.2.2.5
+
+        Based on [MS-ADTS] 6.2.2.5
+
+        :param current_dsa: optional DSA on whose behalf we are acting.
+        :return: None
         """
-        if self.my_dsa.is_translate_ntdsconn_disabled():
+        count = 0
+
+        if current_dsa is None:
+            current_dsa = self.my_dsa
+
+        if current_dsa.is_translate_ntdsconn_disabled():
             logger.debug("skipping translate_ntdsconn() "
                          "because disabling flag is set")
             return
 
         logger.debug("translate_ntdsconn(): enter")
 
-        current_rep_table, needed_rep_table = self.my_dsa.get_rep_tables()
+        current_rep_table, needed_rep_table = current_dsa.get_rep_tables()
 
         # Filled in with replicas we currently have that need deleting
         delete_reps = set()
@@ -959,7 +994,15 @@ class KCC(object):
                 # Retrieve my DSAs connection object (if it exists)
                 # that specifies the fromServer equivalent to
                 # the DSA that is specified in the repsFrom source
-                cn_conn = self.my_dsa.get_connection_by_from_dnstr(s_dnstr)
+                connections = current_dsa.get_connection_by_from_dnstr(s_dnstr)
+
+                count = 0
+                cn_conn = None
+
+                for con in connections:
+                    if con.is_rodc_topology():
+                        continue
+                    cn_conn = con
 
                 # Let (cn) be the nTDSConnection object such that (cn)
                 # is a child of the local DC's nTDSDSA object and
@@ -972,7 +1015,7 @@ class KCC(object):
                 #     [...]
 
                 #XXX varying possible interpretations of rodc_topology
-                if cn_conn is None or cn_conn.is_rodc_topology():
+                if cn_conn is None:
                     t_repsFrom.to_be_deleted = True
                     continue
 
@@ -998,7 +1041,7 @@ class KCC(object):
             # Loop thru connections and add implied repsFrom tuples
             # for each NTDSConnection under our local DSA if the
             # repsFrom is not already present
-            for cn_conn in self.my_dsa.connect_table.values():
+            for cn_conn in current_dsa.connect_table.values():
 
                 implied, s_dsa = self.is_repsFrom_implied(n_rep, cn_conn)
                 if not implied:
@@ -1010,7 +1053,7 @@ class KCC(object):
                 # to have the correct attributes above
                 for t_repsFrom in n_rep.rep_repsFrom:
                     guidstr = str(t_repsFrom.source_dsa_obj_guid)
-                    #XXXX what?
+                    #XXX what?
                     if s_dsa is self.get_dsa_by_guidstr(guidstr):
                         s_dsa = None
                         break
@@ -1050,13 +1093,17 @@ class KCC(object):
 
     def merge_failed_links(self):
         """Merge of kCCFailedLinks and kCCFailedLinks from bridgeheads.
+
         The KCC on a writable DC attempts to merge the link and connection
         failure information from bridgehead DCs in its own site to help it
         identify failed bridgehead DCs.
-        """
-        # MS-TECH Ref 6.2.2.3.2 Merge of kCCFailedLinks and kCCFailedLinks
-        #     from Bridgeheads
 
+        Based on MS-ADTS 6.2.2.3.2 "Merge of kCCFailedLinks and kCCFailedLinks
+        from Bridgeheads"
+


-- 
Samba Shared Repository


More information about the samba-cvs mailing list