2 Unix SMB/CIFS implementation.
4 Copyright (C) Andrew Tridgell 1997-2003
5 Copyright (C) Jelmer Vernooij 2006-2008
6 Copyright (C) James Peach 2010
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 "system/readline.h"
24 #include "../libcli/smbreadline/smbreadline.h"
25 #include "lib/cmdline/popt_common.h"
26 #include "auth/credentials/credentials.h"
27 #include "torture/smbtorture.h"
28 #include "param/param.h"
32 typedef void (*shell_function
)(const struct shell_command
*,
33 struct torture_context
*, int, const char **);
35 static void shell_quit(const struct shell_command
*,
36 struct torture_context
*, int, const char **);
37 static void shell_help(const struct shell_command
*,
38 struct torture_context
*, int, const char **);
39 static void shell_set(const struct shell_command
*,
40 struct torture_context
*, int, const char **);
41 static void shell_run(const struct shell_command
*,
42 struct torture_context
*, int, const char **);
43 static void shell_list(const struct shell_command
*,
44 struct torture_context
*, int, const char **);
45 static void shell_auth(const struct shell_command
*,
46 struct torture_context
*, int, const char **);
47 static void shell_target(const struct shell_command
*,
48 struct torture_context
*, int, const char **);
50 static void shell_usage(const struct shell_command
*);
51 static bool match_command(const char *, const struct shell_command
*);
55 shell_function handler
;
61 static const struct shell_command commands
[] =
65 "[[username | principal | domain | realm | password] STRING]",
66 "set authentication parameters"
70 shell_help
, "help", NULL
,
71 "print this help message"
75 shell_list
, "list", NULL
,
76 "list the available tests"
80 shell_quit
, "quit", NULL
,
85 shell_run
, "run", "[TESTNAME]",
86 "run the specified test"
90 shell_set
, "set", "[NAME VALUE]",
91 "print or set test configuration parameters"
95 shell_target
, "target", "[TARGET]",
96 "print or set the test target"
101 void torture_shell(struct torture_context
*tctx
)
109 /* If we don't have a specified password, specify it as empty. This
110 * stops the credentials system prompting when we use the "auth"
111 * command to display the current auth parameters.
113 cli_credentials_set_password(popt_get_cmdline_credentials(),
117 cline
= smb_readline("torture> ", NULL
, NULL
);
126 ret
= poptParseArgvString(cline
, &argc
, &argv
);
128 fprintf(stderr
, "Error parsing line\n");
132 for (i
= 0; i
< ARRAY_SIZE(commands
); i
++) {
133 if (match_command(argv
[0], &commands
[i
])) {
136 commands
[i
].handler(&commands
[i
],
146 static void shell_quit(const struct shell_command
* command
,
147 struct torture_context
*tctx
, int argc
, const char **argv
)
152 static void shell_help(const struct shell_command
* command
,
153 struct torture_context
*tctx
, int argc
, const char **argv
)
158 for (i
= 0; i
< ARRAY_SIZE(commands
); i
++) {
159 if (match_command(argv
[0], &commands
[i
])) {
160 shell_usage(&commands
[i
]);
165 fprintf(stdout
, "Available commands:\n");
166 for (i
= 0; i
< ARRAY_SIZE(commands
); i
++) {
167 fprintf(stdout
, "\t%s - %s\n",
168 commands
[i
].name
, commands
[i
].help
);
173 static void shell_set(const struct shell_command
*command
,
174 struct torture_context
*tctx
, int argc
, const char **argv
)
178 lpcfg_dump(tctx
->lp_ctx
, stdout
,
179 false /* show_defaults */,
180 0 /* skip services */);
184 /* We want to allow users to set any config option. Top level
185 * options will get checked against their static definition, but
186 * parametric options can't be checked and will just get stashed
187 * as they are provided.
189 lpcfg_set_cmdline(tctx
->lp_ctx
, argv
[0], argv
[1]);
193 shell_usage(command
);
197 static void shell_run(const struct shell_command
* command
,
198 struct torture_context
*tctx
, int argc
, const char **argv
)
201 shell_usage(command
);
205 torture_run_named_tests(tctx
, argv
[0], NULL
/* restricted */);
208 static void shell_list(const struct shell_command
* command
,
209 struct torture_context
*tctx
, int argc
, const char **argv
)
212 shell_usage(command
);
216 torture_print_testsuites(true);
219 static void shell_auth(const struct shell_command
* command
,
220 struct torture_context
*tctx
, int argc
, const char **argv
)
224 const char * username
;
227 const char * password
;
228 const char * principal
;
230 username
= cli_credentials_get_username(
231 popt_get_cmdline_credentials());
232 principal
= cli_credentials_get_principal(
233 popt_get_cmdline_credentials(), tctx
);
234 domain
= cli_credentials_get_domain(popt_get_cmdline_credentials());
235 realm
= cli_credentials_get_realm(popt_get_cmdline_credentials());
236 password
= cli_credentials_get_password(
237 popt_get_cmdline_credentials());
239 printf("Username: %s\n", username
? username
: "");
240 printf("User Principal: %s\n", principal
? principal
: "");
241 printf("Domain: %s\n", domain
? domain
: "");
242 printf("Realm: %s\n", realm
? realm
: "");
243 printf("Password: %s\n", password
? password
: "");
244 } else if (argc
== 2) {
247 if (!strcmp(argv
[0], "username")) {
248 result
= cli_credentials_set_username(
249 popt_get_cmdline_credentials(),
250 argv
[1], CRED_SPECIFIED
);
251 } else if (!strcmp(argv
[0], "principal")) {
252 result
= cli_credentials_set_principal(
253 popt_get_cmdline_credentials(),
254 argv
[1], CRED_SPECIFIED
);
255 } else if (!strcmp(argv
[0], "domain")) {
256 result
= cli_credentials_set_domain(
257 popt_get_cmdline_credentials(),
258 argv
[1], CRED_SPECIFIED
);
259 } else if (!strcmp(argv
[0], "realm")) {
260 result
= cli_credentials_set_realm(
261 popt_get_cmdline_credentials(),
262 argv
[1], CRED_SPECIFIED
);
263 } else if (!strcmp(argv
[0], "password")) {
264 result
= cli_credentials_set_password(
265 popt_get_cmdline_credentials(),
266 argv
[1], CRED_SPECIFIED
);
268 shell_usage(command
);
273 printf("failed to set %s\n", argv
[0]);
276 shell_usage(command
);
281 static void shell_target(const struct shell_command
*command
,
282 struct torture_context
*tctx
, int argc
, const char **argv
)
287 const char * binding
;
289 host
= torture_setting_string(tctx
, "host", NULL
);
290 share
= torture_setting_string(tctx
, "share", NULL
);
291 binding
= torture_setting_string(tctx
, "binding", NULL
);
293 printf("Target host: %s\n", host
? host
: "");
294 printf("Target share: %s\n", share
? share
: "");
295 printf("Target binding: %s\n", binding
? binding
: "");
296 } else if (argc
== 1) {
297 torture_parse_target(tctx
, tctx
->lp_ctx
, argv
[0]);
299 shell_usage(command
);
303 static void shell_usage(const struct shell_command
* command
)
305 if (command
->usage
) {
306 fprintf(stderr
, "Usage: %s %s\n",
307 command
->name
, command
->usage
);
309 fprintf(stderr
, "Usage: %s\n",
314 static bool match_command(const char * name
,
315 const struct shell_command
* command
)
317 if (!strcmp(name
, command
->name
)) {
321 if (name
[0] == command
->name
[0] && name
[1] == '\0') {