ctdb-scripts: Support storing statd-callout state in cluster filesystem
[samba4-gss.git] / source4 / torture / libnet / libnet_BecomeDC.c
blobe88198daf2b84af2d7bf93f10dba5612fa20d79a
1 /*
2 Unix SMB/CIFS implementation.
4 libnet_BecomeDC() tests
6 Copyright (C) Stefan Metzmacher <metze@samba.org> 2006
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "includes.h"
23 #include "lib/cmdline/cmdline.h"
24 #include "torture/rpc/torture_rpc.h"
25 #include "libnet/libnet.h"
26 #include "libnet/libnet_join_proto.h"
27 #include "dsdb/samdb/samdb.h"
28 #include "../lib/util/dlinklist.h"
29 #include "librpc/gen_ndr/ndr_drsuapi.h"
30 #include "librpc/gen_ndr/ndr_drsblobs.h"
31 #include "system/time.h"
32 #include "ldb_wrap.h"
33 #include "auth/auth.h"
34 #include "param/param.h"
35 #include "param/provision.h"
36 #include "libcli/resolve/resolve.h"
37 #include "torture/libnet/proto.h"
39 bool torture_net_become_dc(struct torture_context *torture)
41 bool ret = true;
42 NTSTATUS status;
43 struct libnet_BecomeDC b;
44 struct libnet_UnbecomeDC u;
45 struct libnet_vampire_cb_state *s;
46 struct ldb_message *msg;
47 int ldb_ret;
48 uint32_t i;
49 char *private_dir;
50 const char *address;
51 struct nbt_name name;
52 const char *netbios_name;
53 struct cli_credentials *machine_account;
54 struct test_join *tj;
55 struct loadparm_context *lp_ctx;
56 struct ldb_context *ldb;
57 struct libnet_context *ctx;
58 struct dsdb_schema *schema;
60 char *location = NULL;
61 torture_assert_ntstatus_ok(torture, torture_temp_dir(torture, "libnet_BecomeDC", &location),
62 "torture_temp_dir should return NT_STATUS_OK" );
64 netbios_name = lpcfg_parm_string(torture->lp_ctx, NULL, "become dc", "smbtorture dc");
65 if (!netbios_name || !netbios_name[0]) {
66 netbios_name = "smbtorturedc";
69 make_nbt_name_server(&name, torture_setting_string(torture, "host", NULL));
71 /* do an initial name resolution to find its IP */
72 status = resolve_name_ex(lpcfg_resolve_context(torture->lp_ctx),
73 0, 0,
74 &name, torture, &address, torture->ev);
75 torture_assert_ntstatus_ok(torture, status, talloc_asprintf(torture,
76 "Failed to resolve %s - %s\n",
77 name.name, nt_errstr(status)));
80 /* Join domain as a member server. */
81 tj = torture_join_domain(torture, netbios_name,
82 ACB_WSTRUST,
83 &machine_account);
84 torture_assert(torture, tj, talloc_asprintf(torture,
85 "%s failed to join domain as workstation\n",
86 netbios_name));
88 s = libnet_vampire_cb_state_init(torture, torture->lp_ctx, torture->ev,
89 netbios_name,
90 torture_join_dom_netbios_name(tj),
91 torture_join_dom_dns_name(tj),
92 location);
93 torture_assert(torture, s, "libnet_vampire_cb_state_init");
95 ctx = libnet_context_init(torture->ev, torture->lp_ctx);
96 ctx->cred = samba_cmdline_get_creds();
98 ZERO_STRUCT(b);
99 b.in.domain_dns_name = torture_join_dom_dns_name(tj);
100 b.in.domain_netbios_name = torture_join_dom_netbios_name(tj);
101 b.in.domain_sid = torture_join_sid(tj);
102 b.in.source_dsa_address = address;
103 b.in.dest_dsa_netbios_name = netbios_name;
105 b.in.callbacks.private_data = s;
106 b.in.callbacks.check_options = libnet_vampire_cb_check_options;
107 b.in.callbacks.prepare_db = libnet_vampire_cb_prepare_db;
108 b.in.callbacks.schema_chunk = libnet_vampire_cb_schema_chunk;
109 b.in.callbacks.config_chunk = libnet_vampire_cb_store_chunk;
110 b.in.callbacks.domain_chunk = libnet_vampire_cb_store_chunk;
112 status = libnet_BecomeDC(ctx, s, &b);
113 torture_assert_ntstatus_ok_goto(torture, status, ret, cleanup, talloc_asprintf(torture,
114 "libnet_BecomeDC() failed - %s %s\n",
115 nt_errstr(status), b.out.error_string));
116 ldb = libnet_vampire_cb_ldb(s);
118 msg = ldb_msg_new(s);
119 torture_assert_int_equal_goto(torture, (msg?1:0), 1, ret, cleanup,
120 "ldb_msg_new() failed\n");
121 msg->dn = ldb_dn_new(msg, ldb, "@ROOTDSE");
122 torture_assert_int_equal_goto(torture, (msg->dn?1:0), 1, ret, cleanup,
123 "ldb_msg_new(@ROOTDSE) failed\n");
125 ldb_ret = ldb_msg_add_string(msg, "isSynchronized", "TRUE");
126 torture_assert_int_equal_goto(torture, ldb_ret, LDB_SUCCESS, ret, cleanup,
127 "ldb_msg_add_string(msg, isSynchronized, TRUE) failed\n");
129 for (i=0; i < msg->num_elements; i++) {
130 msg->elements[i].flags = LDB_FLAG_MOD_REPLACE;
133 torture_comment(torture, "mark ROOTDSE with isSynchronized=TRUE\n");
134 ldb_ret = ldb_modify(libnet_vampire_cb_ldb(s), msg);
135 torture_assert_int_equal_goto(torture, ldb_ret, LDB_SUCCESS, ret, cleanup,
136 "ldb_modify() failed\n");
138 /* commit the transaction now we know the secrets were written
139 * out properly
141 ldb_ret = ldb_transaction_commit(ldb);
142 torture_assert_int_equal_goto(torture, ldb_ret, LDB_SUCCESS, ret, cleanup,
143 "ldb_transaction_commit() failed\n");
145 /* reopen the ldb */
146 talloc_unlink(s, ldb);
148 lp_ctx = libnet_vampire_cb_lp_ctx(s);
149 private_dir = talloc_asprintf(s, "%s/%s", location, "private");
150 lpcfg_set_cmdline(lp_ctx, "private dir", private_dir);
151 torture_comment(torture, "Reopen the SAM LDB with system credentials and all replicated data: %s\n", private_dir);
152 ldb = samdb_connect(s,
153 torture->ev,
154 lp_ctx,
155 system_session(lp_ctx),
156 NULL,
158 torture_assert_goto(torture, ldb != NULL, ret, cleanup,
159 talloc_asprintf(torture,
160 "Failed to open '%s/sam.ldb'\n", private_dir));
162 torture_assert_goto(torture, dsdb_uses_global_schema(ldb), ret, cleanup,
163 "Uses global schema");
165 schema = dsdb_get_schema(ldb, s);
166 torture_assert_goto(torture, schema != NULL, ret, cleanup,
167 "Failed to get loaded dsdb_schema\n");
169 /* Make sure we get this from the command line */
170 if (lpcfg_parm_bool(torture->lp_ctx, NULL, "become dc", "do not unjoin", false)) {
171 talloc_free(s);
172 return ret;
175 cleanup:
176 ZERO_STRUCT(u);
177 u.in.domain_dns_name = torture_join_dom_dns_name(tj);
178 u.in.domain_netbios_name = torture_join_dom_netbios_name(tj);
179 u.in.source_dsa_address = address;
180 u.in.dest_dsa_netbios_name = netbios_name;
182 status = libnet_UnbecomeDC(ctx, s, &u);
183 torture_assert_ntstatus_ok(torture, status, talloc_asprintf(torture,
184 "libnet_UnbecomeDC() failed - %s %s\n",
185 nt_errstr(status), u.out.error_string));
187 /* Leave domain. */
188 torture_leave_domain(torture, tj);
190 talloc_free(s);
191 return ret;