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/>.
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"
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
)
43 struct libnet_BecomeDC b
;
44 struct libnet_UnbecomeDC u
;
45 struct libnet_vampire_cb_state
*s
;
46 struct ldb_message
*msg
;
52 const char *netbios_name
;
53 struct cli_credentials
*machine_account
;
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
),
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
,
84 torture_assert(torture
, tj
, talloc_asprintf(torture
,
85 "%s failed to join domain as workstation\n",
88 s
= libnet_vampire_cb_state_init(torture
, torture
->lp_ctx
, torture
->ev
,
90 torture_join_dom_netbios_name(tj
),
91 torture_join_dom_dns_name(tj
),
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();
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
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");
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
,
155 system_session(lp_ctx
),
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)) {
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
));
188 torture_leave_domain(torture
, tj
);