+function provision_fix_subobj(subobj, paths)
+{
+ var ldb = ldb_init();
+
+ subobj.REALM = strupper(subobj.REALM);
+ subobj.HOSTNAME = strlower(subobj.HOSTNAME);
+ subobj.DOMAIN = strupper(subobj.DOMAIN);
+ subobj.NETBIOSNAME = strupper(subobj.HOSTNAME);
+ subobj.DNSDOMAIN = strlower(subobj.REALM);
+ subobj.DNSNAME = sprintf("%s.%s",
+ strlower(subobj.HOSTNAME),
+ subobj.DNSDOMAIN);
+ var rdn_list = split(".", subobj.DNSDOMAIN);
+ subobj.DOMAINDN = "DC=" + join(",DC=", rdn_list);
+ subobj.ROOTDN = subobj.DOMAINDN;
+ subobj.CONFIGDN = "CN=Configuration," + subobj.ROOTDN;
+ subobj.SCHEMADN = "CN=Schema," + subobj.CONFIGDN;
+
+ subobj.MACHINEPASS_B64 = ldb.encode(subobj.MACHINEPASS);
+ subobj.KRBTGTPASS_B64 = ldb.encode(subobj.KRBTGTPASS);
+ subobj.ADMINPASS_B64 = ldb.encode(subobj.ADMINPASS);
+ subobj.DNSPASS_B64 = ldb.encode(subobj.DNSPASS);
+
+ subobj.SAM_LDB = "tdb://" + paths.samdb;
+ subobj.SECRETS_KEYTAB = paths.keytab;
+ subobj.DNS_KEYTAB = paths.dns_keytab;
+ subobj.DNS_KEYTAB_ABS = paths.dns_keytab_abs;
+
+ subobj.LDAPDIR = paths.ldapdir;
+ var ldap_path_list = split("/", paths.ldapdir);
+ subobj.LDAPI_URI = "ldapi://" + join("%2F", ldap_path_list) + "%2Fldapi";
+
+ var s4ldap_path_list = split("/", paths.s4_ldapi_socket);
+ subobj.S4_LDAPI_URI = "ldapi://" + join("%2F", s4ldap_path_list);
+
+ subobj.LDAPMANAGERDN = "cn=Manager," + subobj.DOMAINDN;
+
+ subobj.NETLOGONPATH = paths.netlogon;
+ subobj.SYSVOLPATH = paths.sysvol;
+
+ if (subobj.DOMAIN_CONF == undefined) {
+ subobj.DOMAIN_CONF = subobj.DOMAIN;
+ }
+ if (subobj.REALM_CONF == undefined) {
+ subobj.REALM_CONF = subobj.REALM;
+ }
+ if (strlower(subobj.SERVERROLE) != strlower("domain controller")) {
+ subobj.REALM = subobj.HOSTNAME;
+ subobj.DOMAIN = subobj.HOSTNAME;
+ }
+
+ return true;
+}
+
+function provision_become_dc(subobj, message, erase, paths, session_info)
+{
+ var lp = loadparm_init();
+ var sys = sys_init();
+ var info = new Object();
+
+ var ok = provision_fix_subobj(subobj, paths);
+ assert(ok);
+
+ if (subobj.BACKEND_MOD == undefined) {
+ subobj.BACKEND_MOD = "repl_meta_data";
+ }
+
+ info.subobj = subobj;
+ info.message = message;
+ info.session_info = session_info;
+
+ message("Setting up templates into " + paths.templates + "\n");
+ setup_ldb("provision_templates.ldif", info, paths.templates);
+
+ /* Also wipes the database */
+ message("Setting up " + paths.samdb + " partitions\n");
+ setup_ldb("provision_partitions.ldif", info, paths.samdb);
+
+ var samdb = open_ldb(info, paths.samdb, false);
+
+ message("Setting up " + paths.samdb + " attributes\n");
+ setup_add_ldif("provision_init.ldif", info, samdb, false);
+
+ message("Setting up " + paths.samdb + " rootDSE\n");
+ setup_add_ldif("provision_rootdse_add.ldif", info, samdb, false);
+
+ if (erase) {
+ message("Erasing data from partitions\n");
+ ldb_erase_partitions(info, samdb, undefined);
+ }
+
+ message("Setting up " + paths.samdb + " indexes\n");
+ setup_add_ldif("provision_index.ldif", info, samdb, false);
+
+ ok = samdb.transaction_commit();
+ assert(ok);
+
+ message("Setting up " + paths.secrets + "\n");
+ setup_ldb("secrets_init.ldif", info, paths.secrets);
+
+ setup_ldb("secrets.ldif", info, paths.secrets, false);
+
+ setup_ldb("secrets_dc.ldif", info, paths.secrets, false);
+
+ return true;
+}
+
+function load_schema(subobj, message, samdb)
+{
+ var lp = loadparm_init();
+ var src = lp.get("setup directory") + "/" + "schema.ldif";
+
+ if (! sys.stat(src)) {
+ message("Template file not found: %s\n",src);
+ assert(0);
+ }
+
+ var schema_data = sys.file_load(src);
+
+ src = lp.get("setup directory") + "/" + "schema_samba4.ldif";
+
+ if (! sys.stat(src)) {
+ message("Template file not found: %s\n",src);
+ assert(0);
+ }
+
+ schema_data = schema_data + sys.file_load(src);
+
+ schema_data = substitute_var(schema_data, subobj);
+
+ src = lp.get("setup directory") + "/" + "provision_schema_basedn_modify.ldif";
+
+ if (! sys.stat(src)) {
+ message("Template file not found: %s\n",src);
+ assert(0);
+ }
+
+ var head_data = sys.file_load(src);
+ head_data = substitute_var(head_data, subobj);
+
+ var ok = samdb.attach_dsdb_schema_from_ldif(head_data, schema_data);
+ return ok;
+}
+