NET-API-BECOME-DC: resolve the host name to an address before calling
[samba.git] / source4 / torture / libnet / libnet_BecomeDC.c
index 81bdf342b210d959a648481e835b8d9d9b819269..4b58eed587fbcc5e6f1ac7129c6d46f0852464e3 100644 (file)
 
 #include "includes.h"
 #include "lib/cmdline/popt_common.h"
-#include "torture/torture.h"
 #include "torture/rpc/rpc.h"
 #include "libnet/libnet.h"
-#include "lib/events/events.h"
 #include "dsdb/samdb/samdb.h"
 #include "../lib/util/dlinklist.h"
-#include "lib/ldb/include/ldb.h"
-#include "lib/ldb/include/ldb_errors.h"
-#include "librpc/ndr/libndr.h"
 #include "librpc/gen_ndr/ndr_drsuapi.h"
 #include "librpc/gen_ndr/ndr_drsblobs.h"
-#include "librpc/gen_ndr/ndr_misc.h"
 #include "system/time.h"
 #include "lib/ldb_wrap.h"
 #include "auth/auth.h"
 #include "param/param.h"
-#include "torture/util.h"
 #include "param/provision.h"
+#include "libcli/resolve/resolve.h"
 
 struct test_become_dc_state {
        struct libnet_context *ctx;
@@ -197,7 +191,8 @@ static NTSTATUS test_apply_schema(struct test_become_dc_state *s,
                        const char *oid = NULL;
 
                        a = &cur->object.attribute_ctr.attributes[i];
-                       status = dsdb_map_int2oid(s->self_made_schema, a->attid, s, &oid);
+                       status = dsdb_schema_pfm_oid_from_attid(s->self_made_schema->prefixmap,
+                                                               a->attid, s, &oid);
                        if (!W_ERROR_IS_OK(status)) {
                                return werror_to_ntstatus(status);
                        }
@@ -264,19 +259,19 @@ static NTSTATUS test_apply_schema(struct test_become_dc_state *s,
        s->self_made_schema = NULL;
        s->schema = dsdb_get_schema(s->ldb);
 
-       status = dsdb_extended_replicated_objects_commit(s->ldb,
-                                                        c->partition->nc.dn,
-                                                        mapping_ctr,
-                                                        object_count,
-                                                        first_object,
-                                                        linked_attributes_count,
-                                                        linked_attributes,
-                                                        s_dsa,
-                                                        uptodateness_vector,
-                                                        c->gensec_skey,
-                                                        s, &objs, &seq_num);
+       status = dsdb_extended_replicated_objects_convert(s->ldb,
+                                                         c->partition->nc.dn,
+                                                         mapping_ctr,
+                                                         object_count,
+                                                         first_object,
+                                                         linked_attributes_count,
+                                                         linked_attributes,
+                                                         s_dsa,
+                                                         uptodateness_vector,
+                                                         c->gensec_skey,
+                                                         s, &objs);
        if (!W_ERROR_IS_OK(status)) {
-               DEBUG(0,("Failed to commit objects: %s\n", win_errstr(status)));
+               DEBUG(0,("Failed to convert objects: %s\n", win_errstr(status)));
                return werror_to_ntstatus(status);
        }
 
@@ -291,6 +286,13 @@ static NTSTATUS test_apply_schema(struct test_become_dc_state *s,
                }
        }
 
+       status = dsdb_extended_replicated_objects_commit(s->ldb,
+                                                        objs, &seq_num);
+       if (!W_ERROR_IS_OK(status)) {
+               DEBUG(0,("Failed to commit objects: %s\n", win_errstr(status)));
+               return werror_to_ntstatus(status);
+       }
+
        msg = ldb_msg_new(objs);
        NT_STATUS_HAVE_NO_MEMORY(msg);
        msg->dn = objs->partition_dn;
@@ -324,8 +326,8 @@ static NTSTATUS test_apply_schema(struct test_become_dc_state *s,
        sam_ldb_path = talloc_asprintf(s, "%s/%s", s->targetdir, "private/sam.ldb");
        DEBUG(0,("Reopen the SAM LDB with system credentials and a already stored schema: %s\n", sam_ldb_path));
        s->ldb = ldb_wrap_connect(s, s->tctx->ev, s->tctx->lp_ctx, sam_ldb_path,
-                                 system_session(s, s->tctx->lp_ctx),
-                                 NULL, 0, NULL);
+                                 system_session(s->tctx->lp_ctx),
+                                 NULL, 0);
        if (!s->ldb) {
                DEBUG(0,("Failed to open '%s'\n",
                        sam_ldb_path));
@@ -400,14 +402,14 @@ static NTSTATUS test_become_dc_schema_chunk(void *private_data,
 
                NT_STATUS_HAVE_NO_MEMORY(s->self_made_schema);
 
-               status = dsdb_load_oid_mappings_drsuapi(s->self_made_schema, mapping_ctr);
+               status = dsdb_load_prefixmap_from_drsuapi(s->self_made_schema, mapping_ctr);
                if (!W_ERROR_IS_OK(status)) {
                        return werror_to_ntstatus(status);
                }
 
                s->schema = s->self_made_schema;
        } else {
-               status = dsdb_verify_oid_mappings_drsuapi(s->schema, mapping_ctr);
+               status = dsdb_schema_pfm_contains_drsuapi_pfm(s->schema->prefixmap, mapping_ctr);
                if (!W_ERROR_IS_OK(status)) {
                        return werror_to_ntstatus(status);
                }
@@ -506,19 +508,19 @@ static NTSTATUS test_become_dc_store_chunk(void *private_data,
                c->partition->nc.dn, object_count, linked_attributes_count));
        }
 
-       status = dsdb_extended_replicated_objects_commit(s->ldb,
-                                                        c->partition->nc.dn,
-                                                        mapping_ctr,
-                                                        object_count,
-                                                        first_object,
-                                                        linked_attributes_count,
-                                                        linked_attributes,
-                                                        s_dsa,
-                                                        uptodateness_vector,
-                                                        c->gensec_skey,
-                                                        s, &objs, &seq_num);
+       status = dsdb_extended_replicated_objects_convert(s->ldb,
+                                                         c->partition->nc.dn,
+                                                         mapping_ctr,
+                                                         object_count,
+                                                         first_object,
+                                                         linked_attributes_count,
+                                                         linked_attributes,
+                                                         s_dsa,
+                                                         uptodateness_vector,
+                                                         c->gensec_skey,
+                                                         s, &objs);
        if (!W_ERROR_IS_OK(status)) {
-               DEBUG(0,("Failed to commit objects: %s\n", win_errstr(status)));
+               DEBUG(0,("Failed to convert objects: %s\n", win_errstr(status)));
                return werror_to_ntstatus(status);
        }
 
@@ -532,8 +534,13 @@ static NTSTATUS test_become_dc_store_chunk(void *private_data,
                        NDR_PRINT_DEBUG(replPropertyMetaDataBlob, objs->objects[i].meta_data);
                }
        }
+       status = dsdb_extended_replicated_objects_commit(s->ldb, objs, &seq_num);
        talloc_free(s_dsa);
        talloc_free(objs);
+       if (!W_ERROR_IS_OK(status)) {
+               DEBUG(0,("Failed to commit objects: %s\n", win_errstr(status)));
+               return werror_to_ntstatus(status);
+       }
 
        for (i=0; i < linked_attributes_count; i++) {
                const struct dsdb_attribute *sa;
@@ -575,6 +582,8 @@ bool torture_net_become_dc(struct torture_context *torture)
        int ldb_ret;
        uint32_t i;
        char *sam_ldb_path;
+       const char *address;
+       struct nbt_name name;
 
        char *location = NULL;
        torture_assert_ntstatus_ok(torture, torture_temp_dir(torture, "libnet_BecomeDC", &location), 
@@ -586,6 +595,17 @@ bool torture_net_become_dc(struct torture_context *torture)
        s->tctx = torture;
        s->lp_ctx = torture->lp_ctx;
 
+       make_nbt_name_server(&name, torture_setting_string(torture, "host", NULL));
+
+       /* do an initial name resolution to find its IP */
+       status = resolve_name(lp_resolve_context(torture->lp_ctx),
+                             &name, torture, &address, torture->ev);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("Failed to resolve %s - %s\n",
+                      name.name, nt_errstr(status));
+               return false;
+       }
+
        s->netbios_name = lp_parm_string(torture->lp_ctx, NULL, "become dc", "smbtorture dc");
        if (!s->netbios_name || !s->netbios_name[0]) {
                s->netbios_name = "smbtorturedc";
@@ -612,7 +632,7 @@ bool torture_net_become_dc(struct torture_context *torture)
        b.in.domain_dns_name            = torture_join_dom_dns_name(s->tj);
        b.in.domain_netbios_name        = torture_join_dom_netbios_name(s->tj);
        b.in.domain_sid                 = torture_join_sid(s->tj);
-       b.in.source_dsa_address         = torture_setting_string(torture, "host", NULL);
+       b.in.source_dsa_address         = address;
        b.in.dest_dsa_netbios_name      = s->netbios_name;
 
        b.in.callbacks.private_data     = s;
@@ -624,7 +644,7 @@ bool torture_net_become_dc(struct torture_context *torture)
 
        status = libnet_BecomeDC(s->ctx, s, &b);
        if (!NT_STATUS_IS_OK(status)) {
-               printf("libnet_BecomeDC() failed - %s\n", nt_errstr(status));
+               printf("libnet_BecomeDC() failed - %s %s\n", nt_errstr(status), b.out.error_string);
                ret = false;
                goto cleanup;
        }
@@ -668,8 +688,8 @@ bool torture_net_become_dc(struct torture_context *torture)
        sam_ldb_path = talloc_asprintf(s, "%s/%s", s->targetdir, "private/sam.ldb");
        DEBUG(0,("Reopen the SAM LDB with system credentials and all replicated data: %s\n", sam_ldb_path));
        s->ldb = ldb_wrap_connect(s, s->tctx->ev, s->lp_ctx, sam_ldb_path,
-                                 system_session(s, s->lp_ctx),
-                                 NULL, 0, NULL);
+                                 system_session(s->lp_ctx),
+                                 NULL, 0);
        if (!s->ldb) {
                DEBUG(0,("Failed to open '%s'\n",
                        sam_ldb_path));
@@ -694,12 +714,12 @@ cleanup:
        ZERO_STRUCT(u);
        u.in.domain_dns_name            = torture_join_dom_dns_name(s->tj);
        u.in.domain_netbios_name        = torture_join_dom_netbios_name(s->tj);
-       u.in.source_dsa_address         = torture_setting_string(torture, "host", NULL);
+       u.in.source_dsa_address         = address;
        u.in.dest_dsa_netbios_name      = s->netbios_name;
 
        status = libnet_UnbecomeDC(s->ctx, s, &u);
        if (!NT_STATUS_IS_OK(status)) {
-               printf("libnet_UnbecomeDC() failed - %s\n", nt_errstr(status));
+               printf("libnet_UnbecomeDC() failed - %s %s\n", nt_errstr(status), u.out.error_string);
                ret = false;
        }