s4/libnet: Vampire should join us as a Domain Controller
[kamenim/samba.git] / source4 / libnet / libnet_vampire.c
index 2f30826cce4663c3fd542fa4f3907d91f04b1c88..aa1ea163c7d44d87c5b66aeef74ea8775353252c 100644 (file)
@@ -94,7 +94,7 @@ static NTSTATUS vampire_prepare_db(void *private_data,
        settings.realm = s->join->out.realm;
        settings.domain = s->join->out.domain_name;
        settings.server_dn_str = p->dest_dsa->server_dn_str;
-       settings.machine_password = generate_random_str(s, 16);
+       settings.machine_password = generate_random_password(s, 16, 255);
        settings.targetdir = s->targetdir;
 
        status = provision_bare(s, s->lp_ctx, &settings, &result);
@@ -205,9 +205,9 @@ static NTSTATUS vampire_apply_schema(struct vampire_state *s,
                return NT_STATUS_INVALID_PARAMETER;
        }
 
-       s_dsa->replica_flags            = DRSUAPI_DS_REPLICA_NEIGHBOUR_WRITEABLE
-                                       | DRSUAPI_DS_REPLICA_NEIGHBOUR_SYNC_ON_STARTUP
-                                       | DRSUAPI_DS_REPLICA_NEIGHBOUR_DO_SCHEDULED_SYNCS;
+       s_dsa->replica_flags            = DRSUAPI_DRS_WRIT_REP
+                                       | DRSUAPI_DRS_INIT_SYNC
+                                       | DRSUAPI_DRS_PER_SYNC;
        memset(s_dsa->schedule, 0x11, sizeof(s_dsa->schedule));
 
        tmp_dns_name    = GUID_string(s_dsa->other_info, &s_dsa->source_dsa_obj_guid);
@@ -276,7 +276,7 @@ static NTSTATUS vampire_apply_schema(struct vampire_state *s,
                        sc = talloc_zero(s->self_made_schema, struct dsdb_class);
                        NT_STATUS_HAVE_NO_MEMORY(sc);
 
-                       status = dsdb_class_from_drsuapi(s->self_made_schema, &cur->object, s, sc);
+                       status = dsdb_class_from_drsuapi(s->ldb, s->self_made_schema, &cur->object, s, sc);
                        if (!W_ERROR_IS_OK(status)) {
                                return werror_to_ntstatus(status);
                        }
@@ -366,7 +366,7 @@ static NTSTATUS vampire_apply_schema(struct vampire_state *s,
                return NT_STATUS_FOOBAR;
        }
 
-       s->schema = dsdb_get_schema(s->ldb);
+       s->schema = dsdb_get_schema(s->ldb, s);
        if (!s->schema) {
                DEBUG(0,("Failed to get loaded dsdb_schema\n"));
                return NT_STATUS_FOOBAR;
@@ -512,9 +512,9 @@ static NTSTATUS vampire_store_chunk(void *private_data,
                return NT_STATUS_INVALID_PARAMETER;
        }
 
-       s_dsa->replica_flags            = DRSUAPI_DS_REPLICA_NEIGHBOUR_WRITEABLE
-                                       | DRSUAPI_DS_REPLICA_NEIGHBOUR_SYNC_ON_STARTUP
-                                       | DRSUAPI_DS_REPLICA_NEIGHBOUR_DO_SCHEDULED_SYNCS;
+       s_dsa->replica_flags            = DRSUAPI_DRS_WRIT_REP
+                                       | DRSUAPI_DRS_INIT_SYNC
+                                       | DRSUAPI_DRS_PER_SYNC;
        memset(s_dsa->schedule, 0x11, sizeof(s_dsa->schedule));
 
        tmp_dns_name    = GUID_string(s_dsa->other_info, &s_dsa->source_dsa_obj_guid);
@@ -659,7 +659,7 @@ NTSTATUS libnet_Vampire(struct libnet_context *ctx, TALLOC_CTX *mem_ctx,
        join->in.account_name   = account_name;
        join->in.netbios_name   = netbios_name;
        join->in.level          = LIBNET_JOINDOMAIN_AUTOMATIC;
-       join->in.acct_type      = ACB_WSTRUST;
+       join->in.acct_type      = ACB_SVRTRUST;
        join->in.recreate_account = false;
        status = libnet_JoinDomain(ctx, join, join);
        if (!NT_STATUS_IS_OK(status)) {
@@ -686,6 +686,8 @@ NTSTATUS libnet_Vampire(struct libnet_context *ctx, TALLOC_CTX *mem_ctx,
        b.in.callbacks.config_chunk     = vampire_store_chunk;
        b.in.callbacks.domain_chunk     = vampire_store_chunk;
 
+       b.in.rodc_join = lp_parm_bool(s->lp_ctx, NULL, "repl", "RODC", false);
+
        status = libnet_BecomeDC(ctx, s, &b);
        if (!NT_STATUS_IS_OK(status)) {
                printf("libnet_BecomeDC() failed - %s\n", nt_errstr(status));
@@ -720,7 +722,7 @@ NTSTATUS libnet_Vampire(struct libnet_context *ctx, TALLOC_CTX *mem_ctx,
        printf("mark ROOTDSE with isSynchronized=TRUE\n");
        ldb_ret = ldb_modify(s->ldb, msg);
        if (ldb_ret != LDB_SUCCESS) {
-               printf("ldb_modify() failed: %d\n", ldb_ret);
+               printf("ldb_modify() failed: %d : %s\n", ldb_ret, ldb_errstring(s->ldb));
                talloc_free(s);
                return NT_STATUS_INTERNAL_DB_ERROR;
        }
@@ -730,7 +732,7 @@ NTSTATUS libnet_Vampire(struct libnet_context *ctx, TALLOC_CTX *mem_ctx,
           triggers the writing of the linked attribute backlinks.
        */
        if (ldb_transaction_prepare_commit(s->ldb) != LDB_SUCCESS) {
-               printf("Failed to prepare_commit vampire transaction\n");
+               printf("Failed to prepare_commit vampire transaction: %s\n", ldb_errstring(s->ldb));
                return NT_STATUS_INTERNAL_DB_ERROR;
        }
 
@@ -758,8 +760,8 @@ NTSTATUS libnet_Vampire(struct libnet_context *ctx, TALLOC_CTX *mem_ctx,
                return status;
        }
 
-       r->out.domain_name = talloc_steal(r, join->out.domain_name);
-       r->out.domain_sid = dom_sid_dup(r, join->out.domain_sid);
+       r->out.domain_name = talloc_steal(mem_ctx, join->out.domain_name);
+       r->out.domain_sid = dom_sid_dup(mem_ctx, join->out.domain_sid);
        
        /* commit the transaction now we know the secrets were written
         * out properly