1
/* Copyright (C) 2008 Drizzle Open Source Project
3
This program is free software; you can redistribute it and/or modify
4
it under the terms of the GNU General Public License as published by
5
the Free Software Foundation; version 2 of the License.
7
This program is distributed in the hope that it will be useful,
8
but WITHOUT ANY WARRANTY; without even the implied warranty of
9
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
GNU General Public License for more details.
12
You should have received a copy of the GNU General Public License
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
1
/* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 MySQL
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
16
21
/* maintaince of drizzle databases */
21
26
#include <sys/stat.h>
23
28
/* Added this for string translation. */
24
#include <libdrizzle/gettext.h>
29
#include <drizzled/gettext.h>
26
31
#define ADMIN_VERSION "8.42"
27
32
#define SHUTDOWN_DEF_TIMEOUT 3600 /* Wait for shutdown */
29
34
char *host= NULL, *user= NULL, *opt_password= NULL;
30
static bool interrupted= false, opt_verbose= false,tty_password= false;
31
static uint8_t opt_protocol= DRIZZLE_PROTOCOL_TCP;
35
static bool interrupted= false, opt_verbose= false,tty_password= false;
32
36
static uint32_t tcp_port= 0, option_wait= 0, option_silent= 0;
33
37
static uint32_t my_end_arg;
34
38
static uint32_t opt_connect_timeout, opt_shutdown_timeout;
35
39
static myf error_flags; /* flags to pass to my_printf_error, like ME_BELL */
40
46
static void usage(void);
41
47
static void print_version(void);
42
extern "C" sig_handler endprog(int signal_number);
48
extern "C" void endprog(int signal_number);
43
49
extern "C" bool get_one_option(int optid, const struct my_option *opt,
45
51
static int execute_commands(DRIZZLE *drizzle,int argc, char **argv);
70
76
NO_ARG, 0, 0, 0, 0, 0, 0},
71
77
{"host", 'h', N_("Connect to host."), (char**) &host, (char**) &host, 0, GET_STR,
72
78
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
74
80
N_("Password to use when connecting to server. If password is not given it's asked from the tty."),
75
81
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
76
{"port", 'P', N_("Port number to use for connection or 0 for default to, in "
77
"order of preference, my.cnf, $DRIZZLE_TCP_PORT, "
82
{"port", 'p', N_("Port number to use for connection or 0 for default to, in "
83
"order of preference, drizzle.cnf, $DRIZZLE_TCP_PORT, "
78
84
"built-in default (" STRINGIFY_ARG(DRIZZLE_PORT) ")."),
80
(char**) &tcp_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
85
0, 0, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
81
86
{"silent", 's', N_("Silently exit if one can't connect to server."),
82
87
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
83
88
#ifndef DONT_ALLOW_USER_CHANGE
103
108
static const char *load_default_groups[]= { "drizzleadmin","client",0 };
106
get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
111
get_one_option(int optid, const struct my_option *, char *argument)
114
uint64_t temp_drizzle_port= 0;
119
temp_drizzle_port= (uint64_t) strtoul(argument, &endchar, 10);
120
/* if there is an alpha character this is not a valid port */
121
if (strlen(endchar) != 0)
123
fprintf(stderr, _("Non-integer value supplied for port. If you are trying to enter a password please use --password instead.\n"));
126
/* If the port number is > 65535 it is not a valid port
127
This also helps with potential data loss casting unsigned long to a
129
if ((temp_drizzle_port == 0) || (temp_drizzle_port > 65535))
131
fprintf(stderr, _("Value supplied for port is not valid.\n"));
136
tcp_port= (uint32_t) temp_drizzle_port;
115
142
char *start=argument;
116
my_free(opt_password,MYF(MY_ALLOW_ZERO_PTR));
117
opt_password= my_strdup(argument,MYF(MY_FAE));
118
while (*argument) *argument++= 'x'; /* Destroy argument */
146
opt_password= strdup(argument);
147
if (opt_password == NULL)
149
fprintf(stderr, _("Memory allocation error while copying password. "
155
/* Overwriting password with 'x' */
120
start[1]=0; /* Cut length of argument */
160
/* Cut length of argument */
162
203
MY_INIT(argv[0]);
163
204
drizzle_create(&drizzle);
164
load_defaults("my",load_default_groups,&argc,&argv);
205
load_defaults("drizzle",load_default_groups,&argc,&argv);
165
206
save_argv = argv; /* Save for free_defaults */
166
207
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
179
220
if (tty_password)
180
opt_password = get_tty_password(NullS);
221
opt_password = get_tty_password(NULL);
182
VOID(signal(SIGINT,endprog)); /* Here if abort */
183
VOID(signal(SIGTERM,endprog)); /* Here if abort */
223
signal(SIGINT,endprog); /* Here if abort */
224
signal(SIGTERM,endprog); /* Here if abort */
185
226
if (opt_connect_timeout)
187
228
uint tmp=opt_connect_timeout;
188
229
drizzle_options(&drizzle,DRIZZLE_OPT_CONNECT_TIMEOUT, (char*) &tmp);
190
/* force drizzleadmin to use TCP */
191
drizzle_options(&drizzle, DRIZZLE_OPT_PROTOCOL, (char*)&opt_protocol);
193
232
error_flags= (myf)0;
215
254
error=execute_commands(&drizzle,argc,commands);
216
255
drizzle_close(&drizzle);
218
my_free(opt_password,MYF(MY_ALLOW_ZERO_PTR));
219
my_free(user,MYF(MY_ALLOW_ZERO_PTR));
220
259
free_defaults(save_argv);
221
260
my_end(my_end_arg);
261
return error ? 1 : 0;
225
sig_handler endprog(int signal_number __attribute__((unused)))
236
if (drizzle_connect(drizzle,host,user,opt_password,NullS,tcp_port,NULL,0))
275
if (drizzle_connect(drizzle,host,user,opt_password,NULL,tcp_port,NULL,0))
238
277
drizzle->reconnect= 1;
260
299
fprintf(stderr,_("Check that drizzled is running on %s"),host);
261
300
fprintf(stderr,_(" and that the port is %d.\n"),
262
tcp_port ? tcp_port: drizzle_port);
301
tcp_port ? tcp_port: drizzle_get_default_port());
263
302
fprintf(stderr,_("You can check this by doing 'telnet %s %d'\n"),
264
host, tcp_port ? tcp_port: drizzle_port);
303
host, tcp_port ? tcp_port: drizzle_get_default_port());
269
if (wait != (uint) ~0)
308
if (wait != UINT32_MAX)
270
309
wait--; /* One less retry */
271
310
if ((drizzle_errno(drizzle) != CR_CONN_HOST_ERROR) &&
272
311
(drizzle_errno(drizzle) != CR_CONNECTION_ERROR))