diff options
Diffstat (limited to 'source4/scripting')
-rw-r--r-- | source4/scripting/python/samba/provision.py | 10 | ||||
-rw-r--r-- | source4/scripting/python/samba/samdb.py | 20 | ||||
-rw-r--r-- | source4/scripting/python/samba/schema.py | 12 |
3 files changed, 31 insertions, 11 deletions
diff --git a/source4/scripting/python/samba/provision.py b/source4/scripting/python/samba/provision.py index f2004878c1..0757a72556 100644 --- a/source4/scripting/python/samba/provision.py +++ b/source4/scripting/python/samba/provision.py @@ -871,10 +871,9 @@ def setup_samdb(path, setup_path, session_info, provision_backend, lp, if schema is None: schema = Schema(setup_path, domainsid, schemadn=names.schemadn, serverdn=names.serverdn) - # Load the database, but importantly, use Ldb not SamDB as we don't want to - # load the global schema - samdb = Ldb(session_info=session_info, - credentials=provision_backend.credentials, lp=lp) + # Load the database, but don's load the global schema and don't connect quite yet + samdb = SamDB(session_info=session_info, url=None, auto_connect=False, + credentials=provision_backend.credentials, lp=lp, global_schema=False) message("Pre-loading the Samba 4 and AD schema") @@ -901,6 +900,7 @@ def setup_samdb(path, setup_path, session_info, provision_backend, lp, samdb.set_domain_sid(str(domainsid)) samdb.set_invocation_id(invocationid) + samdb.set_ntds_settings_dn("CN=NTDS Settings,%s" % names.serverdn) message("Adding DomainDN: %s" % names.domaindn) @@ -1236,7 +1236,7 @@ def provision(setup_dir, message, session_info, ldapi_url = "ldapi://%s" % urllib.quote(paths.s4_ldapi_path, safe="") - schema = Schema(setup_path, domainsid, schemadn=names.schemadn, + schema = Schema(setup_path, domainsid, invocationid=invocationid, schemadn=names.schemadn, serverdn=names.serverdn) if backend_type == "ldb": diff --git a/source4/scripting/python/samba/samdb.py b/source4/scripting/python/samba/samdb.py index d41b3ec637..dd3824db0c 100644 --- a/source4/scripting/python/samba/samdb.py +++ b/source4/scripting/python/samba/samdb.py @@ -37,9 +37,11 @@ class SamDB(samba.Ldb): """The SAM database.""" def __init__(self, url=None, lp=None, modules_dir=None, session_info=None, - credentials=None, flags=0, options=None, global_schema=True): + credentials=None, flags=0, options=None, global_schema=True, auto_connect=True): self.lp = lp - if url is None: + if not auto_connect: + url = None + elif url is None and lp is not None: url = lp.get("sam database") super(SamDB, self).__init__(url=url, lp=lp, modules_dir=modules_dir, @@ -50,7 +52,10 @@ class SamDB(samba.Ldb): dsdb.dsdb_set_global_schema(self) def connect(self, url=None, flags=0, options=None): - super(SamDB, self).connect(url=self.lp.private_path(url), flags=flags, + if self.lp is not None: + url = self.lp.private_path(url) + + super(SamDB, self).connect(url=url, flags=flags, options=options) def domain_dn(self): @@ -261,6 +266,15 @@ accountExpires: %u "Get the invocation_id id" return dsdb.samdb_ntds_invocation_id(self) + def set_ntds_settings_dn(self, ntds_settings_dn): + """Set the NTDS Settings DN, as would be returned on the dsServiceName rootDSE attribute + + This allows the DN to be set before the database fully exists + + :param ntds_settings_dn: The new DN to use + """ + dsdb.samdb_set_ntds_settings_dn(self, ntds_settings_dn) + invocation_id = property(get_invocation_id, set_invocation_id) domain_sid = property(get_domain_sid, set_domain_sid) diff --git a/source4/scripting/python/samba/schema.py b/source4/scripting/python/samba/schema.py index 092dfe6719..1777c6559c 100644 --- a/source4/scripting/python/samba/schema.py +++ b/source4/scripting/python/samba/schema.py @@ -26,6 +26,7 @@ from base64 import b64encode from ms_schema import read_ms_schema from samba.dcerpc import security from samba import read_and_sub_file, substitute_var, check_all_substituted +from samba.samdb import SamDB from samba import Ldb from samba.ndr import ndr_pack from ldb import SCOPE_SUBTREE, SCOPE_ONELEVEL @@ -52,7 +53,7 @@ def get_schema_descriptor(domain_sid): class Schema(object): - def __init__(self, setup_path, domain_sid, schemadn=None, + def __init__(self, setup_path, domain_sid, invocationid=None, schemadn=None, serverdn=None, files=None, prefixmap=None): """Load schema for the SamDB from the AD schema files and samba4_schema.ldif @@ -65,7 +66,12 @@ class Schema(object): """ self.schemadn = schemadn - self.ldb = Ldb() + self.ldb = SamDB(global_schema=False) + if serverdn is not None: + self.ldb.set_ntds_settings_dn("CN=NTDS Settings,%s" % serverdn) + if invocationid is not None: + self.ldb.set_invocation_id(invocationid) + self.schema_data = read_ms_schema( setup_path('ad-schema/MS-AD_Schema_2K8_R2_Attributes.txt'), setup_path('ad-schema/MS-AD_Schema_2K8_R2_Classes.txt')) @@ -100,7 +106,7 @@ class Schema(object): self.ldb.set_schema_from_ldif(prefixmap_ldif, self.schema_data) def write_to_tmp_ldb(self, schemadb_path): - self.ldb.connect(schemadb_path) + self.ldb.connect(url=schemadb_path) self.ldb.transaction_start() try: self.ldb.add_ldif("""dn: @ATTRIBUTES |