## modules/pc/pc_commands.c

/* [<][>][^][v][top][bottom][index][help] */

## FUNCTIONS

This source file includes following functions.

1. command_show
2. command_set
3. command_stop
4. command_help
5. command_quit
6. command_purify
7. show_const
8. show_consts
9. show_props
10. show_threads
11. show_whois
12. show_uptime
13. show_access
14. show_acl
15. set_acl
16. set_nodeny
17. set_updates
18. set_counter
19. set_err
20. show_err
21. show_macros
22. set_macro
23. stop_query

       1 #include "mysql_driver.h"
       2 #include "access_control.h"
       3 #include "thread.h"
       4 #include "constants.h"
       5 #include "properties.h"
       6 #include "protocol_config.h"
       7 #include "protocol_whois.h"
       8 #include "ta.h"
       9 #include "pc_commands.h"
      10
      11 #include "er_paths.h"
      12 #include "er_macro.h"
      13
      14 /* this is for purify - to display the memory allocation records */
      15 extern void purify_new_inuse(void);
      16
      17
      18
      19 /*++++++++++++++++++++++++++++++++++++++
      20
      21   All functions in this file share the same interface: they take the
      22   arguments to the command given by the user, pointer to a dynamic
      23   GString to which the command output should be appended and the
      24   connection data, so that some things can be displayed directly to it,
      25   bypassing the GString.
      26
      27   int <command_something>     return code. 0 indicates success.
      28                               PC_RET_QUIT is a reserved code
      29                               that indicates that the connection
      30                               should be closed.
      31
      32   char *input                 command arguments
      33
      34   GString *output             (dynamic) output string
      35
      36   sk_conn_st *condat          connection data
      37
      38   ++++++++++++++++++++++++++++++++++++++*/
      39
      40 /*++++++++++++++++++++++++++++++++++++++
      41
      42   Relay functions for composed commands (eg. "set counter").
      43
      44   They run the second word as a command from a specific array
      45   (show/set/stop/whatever). The hardcoded text is used only for help
      46   messages, printed in case the command is wrong as
      47
      48  "<hardcoded> commands are: <list of possible commands>".
      49
      50  ++++++++++++++++++++++++++++++++++++++*/
      51 int command_show(char *input, GString *output, sk_conn_st *condat) {
         /* [<][>][^][v][top][bottom][index][help] */
      52   return command_execute(show, "show ", input, output, condat);
      53 }
      54
      55 int command_set( char *input, GString *output, sk_conn_st *condat) {
         /* [<][>][^][v][top][bottom][index][help] */
      56   return command_execute(set,  "set ",  input, output, condat);
      57 }
      58
      59 int command_stop(char *input, GString *output, sk_conn_st *condat) {
         /* [<][>][^][v][top][bottom][index][help] */
      60   return command_execute(stop, "stop ", input, output, condat);
      61 }
      62
      63
      64 /*++++++++++++++++++++++++++++++++++++++
      65
      66   Display available commands.
      67
      68   ++++++++++++++++++++++++++++++++++++++*/
      69 int command_help(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
      70 {
      71   /* by the time it came here, the "help" bit is already taken away. */
      72   return show_commands(command, "", output);
      73
      74 }
      75
      76
      77 /*++++++++++++++++++++++++++++++++++++++
      78
      79   Quit the config session.
      80
      81   ++++++++++++++++++++++++++++++++++++++*/
      82 int command_quit(char *input, GString *output, sk_conn_st *condat) {
         /* [<][>][^][v][top][bottom][index][help] */
      83     /* Administrator wishes to quit. */
      84   return PC_RET_QUIT;
      85 } /* command_quit() */
      86
      87 /*++++++++++++++++++++++++++++++++++++++
      88
      89   Display the memory allocation records of purify(tm).
      90   The #define must be changed to activate this.
      91   The program will link only with purify.
      92
      93   ++++++++++++++++++++++++++++++++++++++*/
      94 int command_purify(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
      95 {
      96 #if 0
      97   purify_new_inuse();
      98 #else
      99   g_string_append(output, "NOP");
     100 #endif
     101
     102   return 0;
     103 }
     104
     105
     106 /*++++++++++++++++++++++++++++++++++++++
     107
     108   Display a specific constant of the CO module.
     109
     110   Argument: name of the constant.
     111
     112   ++++++++++++++++++++++++++++++++++++++*/
     113 int show_const(char *input, GString *output, sk_conn_st *condat) {
         /* [<][>][^][v][top][bottom][index][help] */
     114   /* Administrator wishes to show constants. */
     115   char *result, *name, *cursor;
     116   int res = 0;
     117
     118   if( strlen(input) > 0 ) {
     119     cursor = input;
     120     name = (char *)strsep(&cursor, " ");
     121
     122     if( (result = CO_const_to_string(name)) != NULL ) {
     123       g_string_append(output, result);
     124       wr_free(result);
     125     }
     126     else {
     127       g_string_append(output,  "unknown constant");
     128       res = PC_RET_ERR;
     129     }
     130   }
     131   else {
     132     g_string_append(output,  "name required");
     133     res = PC_RET_ERR;
     134   }
     135
     136   return res;
     137
     138 } /* show_const() */
     139
     140
     141 /*++++++++++++++++++++++++++++++++++++++
     142
     143   Display all the constants of the CO module.
     144
     145   ++++++++++++++++++++++++++++++++++++++*/
     146 int show_consts(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     147 {
     148   /* Administrator wishes to show constants. */
     149   char *s =  CO_to_string();
     150   g_string_append(output, s);
     151   free(s);
     152   return 0;
     153 } /* show_consts() */
     154
     155
     156 /*++++++++++++++++++++++++++++++++++++++
     157
     158   Display all the properties of the PR module.
     159
     160   ++++++++++++++++++++++++++++++++++++++*/
     161 int show_props(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     162 {
     163   /* Administrator wishes to show properties. */
     164   char *s =  PR_to_string();
     165   g_string_append(output, s);
     166   free(s);
     167   return 0;
     168 } /* show_props() */
     169
     170
     171 /*++++++++++++++++++++++++++++++++++++++
     172
     173   Display all running threads registered with the TA module.
     174
     175   ++++++++++++++++++++++++++++++++++++++*/
     176 int show_threads(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     177 {
     178   /* Administrator wishes to show thread information. */
     179   char *s = TA_tostring();
     180   g_string_append(output, s);
     181   free(s);
     182   return 0;
     183 } /* show_thread() */
     184
     185
     186 /*++++++++++++++++++++++++++++++++++++++
     187
     188   Switch the session to a whois session.
     189
     190   ++++++++++++++++++++++++++++++++++++++*/
     191 int show_whois(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     192 {
     193   /*  Go to whois mode */
     194   PW_interact(condat->sock);
     195   return 0;
     196 } /* show_whois() */
     197
     198
     199 /*++++++++++++++++++++++++++++++++++++++
     200
     201   Display the statistics about the server.
     202
     203   ++++++++++++++++++++++++++++++++++++++*/
     204 int show_uptime(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     205 {
     206   char timestring[26];
     207   extern time_t SV_starttime;
     208
     209   ctime_r(&SV_starttime, timestring);
     210   SK_cd_printf( condat,
     211                "System running since %sUptime in seconds: %ld \n\n",
     212                timestring,
     213                time(NULL) - SV_starttime);
     214
     215   return 0;
     216 }
     217
     218 /*++++++++++++++++++++++++++++++++++++++
     219
     220   Display the whois access statistics from the AC module.
     221
     222   ++++++++++++++++++++++++++++++++++++++*/
     223 int show_access(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     224 {
     225   int cnt = AC_print_access(output);
     226
     227   g_string_sprintfa(output, "Found %d nodes\n", cnt);
     228
     229   return 0;
     230 } /* show_access() */
     231
     232
     233 /*++++++++++++++++++++++++++++++++++++++
     234
     235   Display the whois access control list from the AC module.
     236
     237   ++++++++++++++++++++++++++++++++++++++*/
     238 int show_acl(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     239 {
     240   int cnt = AC_print_acl(output);
     241
     242   g_string_sprintfa(output, "Found %d nodes\n", cnt);
     243
     244   return 0;
     245 } /* show_acl() */
     246
     247
     248 /*++++++++++++++++++++++++++++++++++++++
     249
     250   Modify the whois access control list in the AC module.
     251
     252   Arguments: IP[/prefixlength] column=value,column=value...
     253
     254   Column names as in acl display. Unset columns are inherited.
     255
     256   ++++++++++++++++++++++++++++++++++++++*/
     257 int set_acl(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     258 {
     259   int res = 0;
     260
     261   /* first 8 characters ("set acl ") are already skipped */
     262   if( ! NOERR( AC_asc_acl_command_set( input, "Manual"))) {
     263     g_string_append(output, "Error!\n");
     264     res = PC_RET_ERR;
     265   }
     266   return res;
     267 }
     268
     269 /*++++++++++++++++++++++++++++++++++++++
     270
     271   Reset the deny counter in the access tree to 0 (after reenabling)
     272   (AC module).
     273
     274   Argument: IP address.
     275
     276   ++++++++++++++++++++++++++++++++++++++*/
     277 int set_nodeny(char *input, GString *output, sk_conn_st *condat) {
         /* [<][>][^][v][top][bottom][index][help] */
     278
     279   /* first 11 characters ("set nodeny ")  are already skipped */
     280
     281   if( ! NOERR( AC_asc_set_nodeny(input) )) {
     282     g_string_append(output, "Error\n");
     283     return PC_RET_ERR;
     284   }
     285   else {
     286     return 0;
     287   }
     288
     289 } /* set_nodeny() */
     290
     291
     292 /*++++++++++++++++++++++++++++++++++++++
     293
     294   Pause/resume update capability of the UD module.
     295
     296   Argument: the word "pause" or "resume".
     297
     298   ++++++++++++++++++++++++++++++++++++++*/
     299 int set_updates(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     300 {
     301   char argstr[17];
     302   int pause=0, resume=0;
     303   int res = 0;
     304
     305   if( sscanf(input, "%16s", argstr) == 1) {
     306     pause = (strcmp(argstr,"pause") == 0);
     307     resume = (strcmp(argstr,"resume") == 0);
     308   }
     309
     310   if( !pause && !resume ) {
     311     g_string_append(output,  "syntax error.");
     312     res = PC_RET_ERR;
     313   }
     314   else {
     315     /* all params ok. just set the property */
     316     char *value = pause ? "0" : "1";
     317
     318     if (CO_set_const("UD.do_update", value) == 0) {
     319       g_string_append(output, "Constant successfully set\n");
     320     }
     321     else {
     322       g_string_append(output, "Could not set\n");
     323       res = PC_RET_ERR;
     324     }
     325   }
     326   return res;
     327 }
     328
     329
     330 /*++++++++++++++++++++++++++++++++++++++
     331
     332   Reset the "session time" and "# of tasks"
     333   of a specific thread registered with the TA module.
     334
     335   ++++++++++++++++++++++++++++++++++++++*/
     336 int set_counter(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     337 {
     338   unsigned thr_id;
     339
     340   if( sscanf(input, "%d", &thr_id) == 1) {
     341     TA_reset_counters(thr_id);
     342   }
     343   return 0;
     344 }
     345
     346
     347
     348 /*++++++++++++++++++++++++++++++++++++++
     349
     350   Execute a command in the ER path processor of the ER module.
     351   (first subject to macro expansion of the first word).
     352
     353   Argument is passed entirely to ER_macro_spec().
     354
     355   ++++++++++++++++++++++++++++++++++++++*/
     356 int set_err(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     357 {
     358   char *erret = NULL;
     359   int res;
     360
     361   res = ER_macro_spec(input, &erret);
     362   g_string_append(output, erret);
     363   free(erret);
     364
     365   return res;
     366 }
     367
     368
     369 /*++++++++++++++++++++++++++++++++++++++
     370
     371   Show the current setup of the ER path system of the ER module.
     372
     373   ++++++++++++++++++++++++++++++++++++++*/
     374 int show_err(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     375 {
     376   char *erret = NULL;
     377
     378   er_print_paths(&erret);
     379   g_string_append(output, erret);
     380   free(erret);
     381
     382   return 0;
     383 }
     384
     385
     386 /*++++++++++++++++++++++++++++++++++++++
     387
     388   Show the currently defined macros for the ER path system of the ER module.
     389
     390   ++++++++++++++++++++++++++++++++++++++*/
     391 int show_macros(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     392 {
     393   ER_macro_list(condat);
     394   return 0;
     395 }
     396
     397
     398
     399 /*++++++++++++++++++++++++++++++++++++++
     400
     401   (re)define a macro for the ER path processor.
     402
     403   Arguments: The first word is treated as a macro name.
     404   The rest of the line is treated as a macro definition.
     405
     406   ++++++++++++++++++++++++++++++++++++++*/
     407 int set_macro(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     408 {
     409   char *name, *body;
     410
     411   if( strlen(input) > 0 ) {
     412     body = input;
     413     name = (char *)strsep(&body, " ");
     414
     415     ER_make_macro( name, body );
     416   }
     417
     418   return 0;
     419 }
     420
     421
     422
     423
     424 /*++++++++++++++++++++++++++++++++++++++
     425
     426   Trigger running of the socket watchdog actions for a specific thread
     427   (typically resulting in shutting down of a query thread).
     428
     429   Arguments are "<socket_id> <thread_id>" as in the output of "show threads".
     430
     431   Assumes the command is like "stop query 11 17".
     432   This is to limit ambiguities (a new thread on the same socket, for example).
     433 .
     434   ++++++++++++++++++++++++++++++++++++++*/
     435 int stop_query(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     436 {
     437   int fd;
     438   unsigned thr;
     439
     440
     441   if( sscanf(input, "%d %ud", &fd, &thr) < 2 ) {
     442     g_string_append(output,"error!!");
     443     return PC_RET_ERR;
     444   }
     445   else {
     446     TA_trigger("whois", fd, thr);
     447     return 0;
     448   }
     449 }

/* [<][>][^][v][top][bottom][index][help] */