~drizzle-trunk/drizzle/development

206.3.1 by Patrick Galbraith
Most everything working with client rename
1
/* Copyright (C) 2008 Drizzle Open Source Project 
1 by brian
clean slate
2
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.
6
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.
11
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 */
15
206.3.1 by Patrick Galbraith
Most everything working with client rename
16
/* maintaince of drizzle databases */
1 by brian
clean slate
17
18
#include "client_priv.h"
19
#include <signal.h>
212.5.13 by Monty Taylor
Moved my_sys/my_pthread/my_nosys and mysys_err to mysys.
20
#include <mysys/my_pthread.h>				/* because of signal()	*/
1 by brian
clean slate
21
#include <sys/stat.h>
22
23
#define ADMIN_VERSION "8.42"
24
#define SHUTDOWN_DEF_TIMEOUT 3600		/* Wait for shutdown */
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
25
165 by Brian Aker
mysqladmin patch (plus removal of password auth bits)
26
char *host= NULL, *user= NULL, *opt_password= NULL;
27
static bool interrupted= false, opt_verbose= false,tty_password= false; 
206.3.1 by Patrick Galbraith
Most everything working with client rename
28
static uint8_t opt_protocol= DRIZZLE_PROTOCOL_TCP;  
165 by Brian Aker
mysqladmin patch (plus removal of password auth bits)
29
static uint32_t tcp_port= 0, option_wait= 0, option_silent= 0;
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
30
static uint32_t my_end_arg;
31
static uint32_t opt_connect_timeout, opt_shutdown_timeout;
1 by brian
clean slate
32
static myf error_flags; /* flags to pass to my_printf_error, like ME_BELL */
33
34
/*
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
35
  Forward declarations 
1 by brian
clean slate
36
*/
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
37
static void usage(void);
1 by brian
clean slate
38
static void print_version(void);
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
39
extern "C" sig_handler endprog(int signal_number);
143 by Brian Aker
Bool cleanup.
40
extern "C" bool get_one_option(int optid, const struct my_option *opt,
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
41
                               char *argument);
206.3.1 by Patrick Galbraith
Most everything working with client rename
42
static int execute_commands(DRIZZLE *drizzle,int argc, char **argv);
43
static bool sql_connect(DRIZZLE *drizzle, uint wait);
1 by brian
clean slate
44
45
/*
46
  The order of commands must be the same as command_names,
47
  except ADMIN_ERROR
48
*/
49
enum commands {
50
  ADMIN_ERROR,
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
51
  ADMIN_SHUTDOWN,
52
  ADMIN_PING
1 by brian
clean slate
53
};
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
54
1 by brian
clean slate
55
static const char *command_names[]= {
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
56
  "shutdown",
57
  "ping",
1 by brian
clean slate
58
  NullS
59
};
60
61
static TYPELIB command_typelib=
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
62
{ array_elements(command_names)-1,"commands", command_names, NULL };
1 by brian
clean slate
63
64
static struct my_option my_long_options[] =
65
{
66
  {"help", '?', "Display this help and exit.", 0, 0, 0, GET_NO_ARG,
67
   NO_ARG, 0, 0, 0, 0, 0, 0},
77.1.77 by Monty Taylor
A crapton more warning cleanups (I turned on more warnings)
68
  {"host", 'h', "Connect to host.", (char**) &host, (char**) &host, 0, GET_STR,
1 by brian
clean slate
69
   REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
154.1.2 by Toru Maesaka
further slimdown of mysqladmin and code review fixes
70
  {"password", 'p',
71
   "Password to use when connecting to server. If password is not given it's asked from the tty.",
72
   0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
1 by brian
clean slate
73
  {"port", 'P', "Port number to use for connection or 0 for default to, in "
74
   "order of preference, my.cnf, $MYSQL_TCP_PORT, "
75
#if MYSQL_PORT_DEFAULT == 0
76
   "/etc/services, "
77
#endif
78
   "built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").",
77.1.77 by Monty Taylor
A crapton more warning cleanups (I turned on more warnings)
79
   (char**) &tcp_port,
80
   (char**) &tcp_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
1 by brian
clean slate
81
  {"silent", 's', "Silently exit if one can't connect to server.",
82
   0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
154.1.2 by Toru Maesaka
further slimdown of mysqladmin and code review fixes
83
#ifndef DONT_ALLOW_USER_CHANGE
84
  {"user", 'u', "User for login if not current user.", (char**) &user,
85
   (char**) &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
86
#endif
77.1.77 by Monty Taylor
A crapton more warning cleanups (I turned on more warnings)
87
  {"verbose", 'v', "Write more information.", (char**) &opt_verbose,
88
   (char**) &opt_verbose, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
1 by brian
clean slate
89
  {"version", 'V', "Output version information and exit.", 0, 0, 0, GET_NO_ARG,
90
   NO_ARG, 0, 0, 0, 0, 0, 0},
91
  {"wait", 'w', "Wait and retry if connection is down.", 0, 0, 0, GET_UINT,
92
   OPT_ARG, 0, 0, 0, 0, 0, 0},
77.1.77 by Monty Taylor
A crapton more warning cleanups (I turned on more warnings)
93
  {"connect_timeout", OPT_CONNECT_TIMEOUT, "", (char**) &opt_connect_timeout,
94
   (char**) &opt_connect_timeout, 0, GET_ULONG, REQUIRED_ARG, 3600*12, 0,
1 by brian
clean slate
95
   3600*12, 0, 1, 0},
77.1.77 by Monty Taylor
A crapton more warning cleanups (I turned on more warnings)
96
  {"shutdown_timeout", OPT_SHUTDOWN_TIMEOUT, "", (char**) &opt_shutdown_timeout,
97
   (char**) &opt_shutdown_timeout, 0, GET_ULONG, REQUIRED_ARG,
1 by brian
clean slate
98
   SHUTDOWN_DEF_TIMEOUT, 0, 3600*12, 0, 1, 0},
99
  { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
100
};
101
102
206.3.1 by Patrick Galbraith
Most everything working with client rename
103
static const char *load_default_groups[]= { "drizzleadmin","client",0 };
1 by brian
clean slate
104
143 by Brian Aker
Bool cleanup.
105
bool
1 by brian
clean slate
106
get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
107
               char *argument)
1 by brian
clean slate
108
{
109
  int error = 0;
110
111
  switch(optid) {
154.1.2 by Toru Maesaka
further slimdown of mysqladmin and code review fixes
112
  case 'p':
113
    if (argument)
114
    {
115
      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 */
119
      if (*start)
120
        start[1]=0; /* Cut length of argument */
121
      tty_password= 0;
122
    }
123
    else 
124
      tty_password= 1; 
125
    break;
1 by brian
clean slate
126
  case 's':
127
    option_silent++;
128
    break;
129
  case 'V':
130
    print_version();
131
    exit(0);
132
    break;
133
  case 'w':
134
    if (argument)
135
    {
136
      if ((option_wait=atoi(argument)) <= 0)
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
137
        option_wait=1;
1 by brian
clean slate
138
    }
139
    else
140
      option_wait= ~(uint)0;
141
    break;
142
  case '?':
143
  case 'I':					/* Info */
144
    error++;
145
    break;
146
  }
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
147
1 by brian
clean slate
148
  if (error)
149
  {
150
    usage();
151
    exit(1);
152
  }
153
  return 0;
154
}
155
156
int main(int argc,char *argv[])
157
{
158
  int error= 0, ho_error;
206.3.1 by Patrick Galbraith
Most everything working with client rename
159
  DRIZZLE drizzle;
1 by brian
clean slate
160
  char **commands, **save_argv;
161
162
  MY_INIT(argv[0]);
202.2.4 by Monty Taylor
Merged from Patrick.
163
  drizzle_create(&drizzle);
1 by brian
clean slate
164
  load_defaults("my",load_default_groups,&argc,&argv);
165
  save_argv = argv;				/* Save for free_defaults */
166
  if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
167
  {
168
    free_defaults(save_argv);
169
    exit(ho_error);
170
  }
171
172
  if (argc == 0)
173
  {
174
    usage();
175
    exit(1);
176
  }
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
177
1 by brian
clean slate
178
  commands = argv;
154.1.2 by Toru Maesaka
further slimdown of mysqladmin and code review fixes
179
  if (tty_password)
180
    opt_password = get_tty_password(NullS);
1 by brian
clean slate
181
182
  VOID(signal(SIGINT,endprog));			/* Here if abort */
183
  VOID(signal(SIGTERM,endprog));		/* Here if abort */
184
185
  if (opt_connect_timeout)
186
  {
187
    uint tmp=opt_connect_timeout;
206.3.1 by Patrick Galbraith
Most everything working with client rename
188
    drizzle_options(&drizzle,DRIZZLE_OPT_CONNECT_TIMEOUT, (char*) &tmp);
1 by brian
clean slate
189
  }
206.3.1 by Patrick Galbraith
Most everything working with client rename
190
  /* force drizzleadmin to use TCP */
191
  drizzle_options(&drizzle, DRIZZLE_OPT_PROTOCOL, (char*)&opt_protocol);
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
192
193
  error_flags= (myf)0;
1 by brian
clean slate
194
206.3.1 by Patrick Galbraith
Most everything working with client rename
195
  if (sql_connect(&drizzle, option_wait))
1 by brian
clean slate
196
  {
206.3.1 by Patrick Galbraith
Most everything working with client rename
197
    unsigned int err= drizzle_errno(&drizzle);
1 by brian
clean slate
198
    if (err >= CR_MIN_ERROR && err <= CR_MAX_ERROR)
199
      error= 1;
200
    else
201
    {
202
      /* Return 0 if all commands are PING */
203
      for (; argc > 0; argv++, argc--)
204
      {
205
        if (find_type(argv[0], &command_typelib, 2) != ADMIN_PING)
206
        {
207
          error= 1;
208
          break;
209
        }
210
      }
211
    }
212
  }
213
  else
214
  {
206.3.1 by Patrick Galbraith
Most everything working with client rename
215
    error=execute_commands(&drizzle,argc,commands);
216
    drizzle_close(&drizzle);
1 by brian
clean slate
217
  }
154.1.2 by Toru Maesaka
further slimdown of mysqladmin and code review fixes
218
  my_free(opt_password,MYF(MY_ALLOW_ZERO_PTR));
219
  my_free(user,MYF(MY_ALLOW_ZERO_PTR));
1 by brian
clean slate
220
  free_defaults(save_argv);
221
  my_end(my_end_arg);
222
  exit(error ? 1 : 0);
223
}
224
225
sig_handler endprog(int signal_number __attribute__((unused)))
226
{
227
  interrupted=1;
228
}
229
206.3.1 by Patrick Galbraith
Most everything working with client rename
230
static bool sql_connect(DRIZZLE *drizzle, uint wait)
1 by brian
clean slate
231
{
143 by Brian Aker
Bool cleanup.
232
  bool info=0;
1 by brian
clean slate
233
234
  for (;;)
235
  {
206.3.1 by Patrick Galbraith
Most everything working with client rename
236
    if (drizzle_connect(drizzle,host,user,opt_password,NullS,tcp_port,NULL,0))
1 by brian
clean slate
237
    {
206.3.1 by Patrick Galbraith
Most everything working with client rename
238
      drizzle->reconnect= 1;
1 by brian
clean slate
239
      if (info)
240
      {
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
241
        fputs("\n",stderr);
242
        (void) fflush(stderr);
1 by brian
clean slate
243
      }
244
      return 0;
245
    }
246
247
    if (!wait)
248
    {
249
      if (!option_silent)
250
      {
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
251
        if (!host)
252
          host= (char*) LOCAL_HOST;
253
254
        my_printf_error(0,"connect to server at '%s' failed\nerror: '%s'",
206.3.1 by Patrick Galbraith
Most everything working with client rename
255
        error_flags, host, drizzle_error(drizzle));
154.1.2 by Toru Maesaka
further slimdown of mysqladmin and code review fixes
256
206.3.1 by Patrick Galbraith
Most everything working with client rename
257
        if (drizzle_errno(drizzle) == CR_CONN_HOST_ERROR ||
258
          drizzle_errno(drizzle) == CR_UNKNOWN_HOST)
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
259
        {
154.1.2 by Toru Maesaka
further slimdown of mysqladmin and code review fixes
260
          fprintf(stderr,"Check that drizzled is running on %s",host);
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
261
          fprintf(stderr," and that the port is %d.\n",
206.3.1 by Patrick Galbraith
Most everything working with client rename
262
          tcp_port ? tcp_port: drizzle_port);
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
263
          fprintf(stderr,"You can check this by doing 'telnet %s %d'\n",
206.3.1 by Patrick Galbraith
Most everything working with client rename
264
                  host, tcp_port ? tcp_port: drizzle_port);
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
265
        }
1 by brian
clean slate
266
      }
267
      return 1;
268
    }
269
    if (wait != (uint) ~0)
270
      wait--;				/* One less retry */
206.3.1 by Patrick Galbraith
Most everything working with client rename
271
    if ((drizzle_errno(drizzle) != CR_CONN_HOST_ERROR) &&
272
        (drizzle_errno(drizzle) != CR_CONNECTION_ERROR))
1 by brian
clean slate
273
    {
206.3.1 by Patrick Galbraith
Most everything working with client rename
274
      fprintf(stderr,"Got error: %s\n", drizzle_error(drizzle));
1 by brian
clean slate
275
    }
276
    else if (!option_silent)
277
    {
278
      if (!info)
279
      {
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
280
        info=1;
154.1.2 by Toru Maesaka
further slimdown of mysqladmin and code review fixes
281
        fputs("Waiting for Drizzle server to answer",stderr);
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
282
        (void) fflush(stderr);
1 by brian
clean slate
283
      }
284
      else
285
      {
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
286
        putc('.',stderr);
287
        (void) fflush(stderr);
1 by brian
clean slate
288
      }
289
    }
290
    sleep(5);
291
  }
292
}
293
294
/*
295
  Execute a command.
296
  Return 0 on ok
297
	 -1 on retryable error
298
	 1 on fatal error
299
*/
206.3.1 by Patrick Galbraith
Most everything working with client rename
300
static int execute_commands(DRIZZLE *drizzle,int argc, char **argv)
1 by brian
clean slate
301
{
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
302
1 by brian
clean slate
303
  /*
206.3.1 by Patrick Galbraith
Most everything working with client rename
304
    DRIZZLE documentation relies on the fact that drizzleadmin will
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
305
    execute commands in the order specified.
1 by brian
clean slate
306
    If this behaviour is ever changed, Docs should be notified.
307
  */
308
  for (; argc > 0 ; argv++,argc--)
309
  {
310
    switch (find_type(argv[0],&command_typelib,2)) {
311
    case ADMIN_SHUTDOWN:
312
    {
154.1.2 by Toru Maesaka
further slimdown of mysqladmin and code review fixes
313
      if (opt_verbose)
314
        printf("shutting down drizzled...\n");
1 by brian
clean slate
315
206.3.1 by Patrick Galbraith
Most everything working with client rename
316
      if (drizzle_shutdown(drizzle, SHUTDOWN_DEFAULT))
1 by brian
clean slate
317
      {
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
318
        my_printf_error(0, "shutdown failed; error: '%s'", error_flags,
206.3.1 by Patrick Galbraith
Most everything working with client rename
319
                        drizzle_error(drizzle));
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
320
        return -1;
1 by brian
clean slate
321
      }
206.3.1 by Patrick Galbraith
Most everything working with client rename
322
      drizzle_close(drizzle);	/* Close connection to avoid error messages */
154.1.2 by Toru Maesaka
further slimdown of mysqladmin and code review fixes
323
324
      if (opt_verbose)
325
        printf("done\n");
326
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
327
      argc=1;             /* Force SHUTDOWN to be the last command */
154.1.2 by Toru Maesaka
further slimdown of mysqladmin and code review fixes
328
      break;
1 by brian
clean slate
329
    }
330
    case ADMIN_PING:
206.3.1 by Patrick Galbraith
Most everything working with client rename
331
      drizzle->reconnect=0;	/* We want to know of reconnects */
332
      if (!drizzle_ping(drizzle))
1 by brian
clean slate
333
      {
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
334
        if (option_silent < 2)
154.1.2 by Toru Maesaka
further slimdown of mysqladmin and code review fixes
335
          puts("drizzled is alive");
1 by brian
clean slate
336
      }
337
      else
338
      {
206.3.1 by Patrick Galbraith
Most everything working with client rename
339
        if (drizzle_errno(drizzle) == CR_SERVER_GONE_ERROR)
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
340
        {
206.3.1 by Patrick Galbraith
Most everything working with client rename
341
          drizzle->reconnect=1;
342
          if (!drizzle_ping(drizzle))
154.1.2 by Toru Maesaka
further slimdown of mysqladmin and code review fixes
343
            puts("connection was down, but drizzled is now alive");
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
344
        }
345
        else
346
	      {
154.1.2 by Toru Maesaka
further slimdown of mysqladmin and code review fixes
347
          my_printf_error(0,"drizzled doesn't answer to ping, error: '%s'",
206.3.1 by Patrick Galbraith
Most everything working with client rename
348
          error_flags, drizzle_error(drizzle));
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
349
          return -1;
350
        }
1 by brian
clean slate
351
      }
206.3.1 by Patrick Galbraith
Most everything working with client rename
352
      drizzle->reconnect=1;	/* Automatic reconnect is default */
1 by brian
clean slate
353
      break;
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
354
1 by brian
clean slate
355
    default:
356
      my_printf_error(0, "Unknown command: '%-.60s'", error_flags, argv[0]);
357
      return 1;
358
    }
359
  }
360
  return 0;
361
}
362
363
static void print_version(void)
364
{
365
  printf("%s  Ver %s Distrib %s, for %s on %s\n",my_progname,ADMIN_VERSION,
366
	 MYSQL_SERVER_VERSION,SYSTEM_TYPE,MACHINE_TYPE);
367
}
368
369
static void usage(void)
370
{
371
  print_version();
206.3.1 by Patrick Galbraith
Most everything working with client rename
372
  puts("Copyright (C) 2000-2006 DRIZZLE AB");
1 by brian
clean slate
373
  puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license\n");
154.1.2 by Toru Maesaka
further slimdown of mysqladmin and code review fixes
374
  puts("Administration program for the drizzled daemon.");
1 by brian
clean slate
375
  printf("Usage: %s [OPTIONS] command command....\n", my_progname);
376
  my_print_help(my_long_options);
154.1.1 by Toru Maesaka
Slimmed down mysqladmin to ping and shutdown only. Some dead code were removed too
377
  puts("\
378
  ping         Check if server is down\n\
379
  shutdown     Take server down\n");
1 by brian
clean slate
380
}