## modules/pc/pc_commands.c

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

## DEFINITIONS

This source file includes following functions.

1. command_save
2. command_show
3. command_set
4. command_stop
5. command_help
6. command_quit
7. command_purify
8. save_access_tree
9. show_const
10. show_consts
11. show_props
12. show_threads
13. show_whois
14. show_uptime
15. show_access
16. show_acl
17. show_auto_save
18. set_acl
19. set_auto_save
20. set_nodeny
21. set_updates
22. set_queries
23. set_initrx
24. set_err
25. show_err
26. show_macros
27. set_macro

       1 /******************
       2   Copyright (c) 1999,2000,2001,2002               RIPE NCC
       3
       4   All Rights Reserved
       5
       6   Permission to use, copy, modify, and distribute this software and its
       7   documentation for any purpose and without fee is hereby granted,
       8   provided that the above copyright notice appear in all copies and that
       9   both that copyright notice and this permission notice appear in
      10   supporting documentation, and that the name of the author not be
      11   used in advertising or publicity pertaining to distribution of the
      12   software without specific, written prior permission.
      13
      14   THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
      15   ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
      16   AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
      17   DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
      18   AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
      19   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
      20   ***************************************/
      21
      22 #include "rip.h"
      23
      24 /* this is for purify - to display the memory allocation records */
      25 extern void purify_new_inuse(void);
      26
      27
      28 /*++++++++++++++++++++++++++++++++++++++
      29
      30   All functions in this file share the same interface: they take the
      31   arguments to the command given by the user, pointer to a dynamic
      32   GString to which the command output should be appended and the
      33   connection data, so that some things can be displayed directly to it,
      34   bypassing the GString.
      35
      36   int <command_something>     return code. 0 indicates success.
      37                               PC_RET_QUIT is a reserved code
      38                               that indicates that the connection
      39                               should be closed.
      40
      41   char *input                 command arguments
      42
      43   GString *output             (dynamic) output string
      44
      45   sk_conn_st *condat          connection data
      46
      47   ++++++++++++++++++++++++++++++++++++++*/
      48
      49 /*++++++++++++++++++++++++++++++++++++++
      50
      51   Relay functions for composed commands (eg. "set counter").
      52
      53   They run the second word as a command from a specific array
      54   (show/set/stop/whatever). The hardcoded text is used only for help
      55   messages, printed in case the command is wrong as
      56
      57  "<hardcoded> commands are: <list of possible commands>".
      58
      59  ++++++++++++++++++++++++++++++++++++++*/
      60 int command_save(char *input, GString *output, sk_conn_st *condat) {
         /* [<][>][^][v][top][bottom][index][help] */
      61   return command_execute(save, "save ", input, output, condat);
      62 }
      63
      64 int command_show(char *input, GString *output, sk_conn_st *condat) {
         /* [<][>][^][v][top][bottom][index][help] */
      65   return command_execute(show, "show ", input, output, condat);
      66 }
      67
      68 int command_set( char *input, GString *output, sk_conn_st *condat) {
         /* [<][>][^][v][top][bottom][index][help] */
      69   return command_execute(set,  "set ",  input, output, condat);
      70 }
      71
      72 int command_stop(char *input, GString *output, sk_conn_st *condat) {
         /* [<][>][^][v][top][bottom][index][help] */
      73   return command_execute(stop, "stop ", input, output, condat);
      74 }
      75
      76
      77 /*++++++++++++++++++++++++++++++++++++++
      78
      79   Display available commands.
      80
      81   ++++++++++++++++++++++++++++++++++++++*/
      82 int command_help(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
      83 {
      84   /* by the time it came here, the "help" bit is already taken away. */
      85   return show_commands(command, "", output);
      86
      87 }
      88
      89
      90 /*++++++++++++++++++++++++++++++++++++++
      91
      92   Quit the config session.
      93
      94   ++++++++++++++++++++++++++++++++++++++*/
      95 int command_quit(char *input, GString *output, sk_conn_st *condat) {
         /* [<][>][^][v][top][bottom][index][help] */
      96     /* Administrator wishes to quit. */
      97   return PC_RET_QUIT;
      98 } /* command_quit() */
      99
     100 /*++++++++++++++++++++++++++++++++++++++
     101
     102   Display the memory allocation records of purify(tm).
     103   The #define must be changed to activate this.
     104   The program will link only with purify.
     105
     106   ++++++++++++++++++++++++++++++++++++++*/
     107 int command_purify(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     108 {
     109 #if 0
     110   purify_new_inuse();
     111 #else
     112   g_string_append(output, "NOP");
     113 #endif
     114
     115   return 0;
     116 }
     117
     118 int save_access_tree(char *input, GString *output, sk_conn_st *condat) {
         /* [<][>][^][v][top][bottom][index][help] */
     119   er_ret_t ret_err;
     120
     121   ret_err = AC_persistence_save();
     122
     123   switch (ret_err) {
     124   case AC_OK:
     125     g_string_append(output, "Save successful");
     126     break;
     127   case AC_SAVING:
     128     g_string_append(output, "Already saving");
     129     break;
     130   default:
     131     g_string_append(output, "Unknown error");
     132     return PC_RET_ERR;
     133   }
     134   return 0;
     135 }
     136
     137 /*++++++++++++++++++++++++++++++++++++++
     138
     139   Display a specific constant of the CO module.
     140
     141   Argument: name of the constant.
     142
     143   ++++++++++++++++++++++++++++++++++++++*/
     144 int show_const(char *input, GString *output, sk_conn_st *condat) {
         /* [<][>][^][v][top][bottom][index][help] */
     145   /* Administrator wishes to show constants. */
     146   char *result, *name, *cursor;
     147   int res = 0;
     148
     149   if( strlen(input) > 0 ) {
     150     cursor = input;
     151     name = (char *)strsep(&cursor, " ");
     152
     153     if( (result = CO_const_to_string(name)) != NULL ) {
     154       g_string_append(output, result);
     155       UT_free(result);
     156     }
     157     else {
     158       g_string_append(output,  "unknown constant");
     159       res = PC_RET_ERR;
     160     }
     161   }
     162   else {
     163     g_string_append(output,  "name required");
     164     res = PC_RET_ERR;
     165   }
     166
     167   return res;
     168
     169 } /* show_const() */
     170
     171
     172 /*++++++++++++++++++++++++++++++++++++++
     173
     174   Display all the constants of the CO module.
     175
     176   ++++++++++++++++++++++++++++++++++++++*/
     177 int show_consts(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     178 {
     179   /* Administrator wishes to show constants. */
     180   char *s =  CO_to_string();
     181   g_string_append(output, s);
     182   UT_free(s);
     183   return 0;
     184 } /* show_consts() */
     185
     186
     187 /*++++++++++++++++++++++++++++++++++++++
     188
     189   Display all the properties of the PR module.
     190
     191   ++++++++++++++++++++++++++++++++++++++*/
     192 int show_props(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     193 {
     194   /* Administrator wishes to show properties. */
     195   char *s =  PR_to_string();
     196   g_string_append(output, s);
     197   UT_free(s);
     198   return 0;
     199 } /* show_props() */
     200
     201
     202 /*++++++++++++++++++++++++++++++++++++++
     203
     204   Display all running threads registered with the TA module.
     205
     206   ++++++++++++++++++++++++++++++++++++++*/
     207 int show_threads(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     208 {
     209   /* Administrator wishes to show thread information. */
     210   char *s = TA_tostring();
     211   g_string_append(output, s);
     212   UT_free(s);
     213   return 0;
     214 } /* show_thread() */
     215
     216
     217 /*++++++++++++++++++++++++++++++++++++++
     218
     219   Switch the session to a whois session.
     220
     221   ++++++++++++++++++++++++++++++++++++++*/
     222 int show_whois(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     223 {
     224   /*  Go to whois mode */
     225   PW_interact(condat->sock);
     226   return 0;
     227 } /* show_whois() */
     228
     229
     230 /*++++++++++++++++++++++++++++++++++++++
     231
     232   Display the statistics about the server.
     233
     234   ++++++++++++++++++++++++++++++++++++++*/
     235 int show_uptime(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     236 {
     237   char timestring[26];
     238   extern time_t SV_starttime;
     239
     240   ctime_r(&SV_starttime, timestring);
     241   SK_cd_printf( condat,
     242                "System running since %sUptime in seconds: %ld \n\n",
     243                timestring,
     244                time(NULL) - SV_starttime);
     245
     246   return 0;
     247 }
     248
     249 /*++++++++++++++++++++++++++++++++++++++
     250
     251   Display the whois access statistics from the AC module.
     252
     253   ++++++++++++++++++++++++++++++++++++++*/
     254 int show_access(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     255 {
     256   int cnt = AC_print_access(output);
     257
     258   g_string_sprintfa(output, "Found %d nodes\n", cnt);
     259
     260   return 0;
     261 } /* show_access() */
     262
     263
     264 /*++++++++++++++++++++++++++++++++++++++
     265
     266   Display the whois access control list from the AC module.
     267
     268   ++++++++++++++++++++++++++++++++++++++*/
     269 int show_acl(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     270 {
     271   int cnt = AC_print_acl(output);
     272
     273   g_string_sprintfa(output, "Found %d nodes\n", cnt);
     274
     275   return 0;
     276 } /* show_acl() */
     277
     278 /*++++++++++++++++++++++++++++++++++++++
     279
     280   Display the access tree auto save state.
     281
     282   ++++++++++++++++++++++++++++++++++++++*/
     283 int show_auto_save(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     284 {
     285   g_string_sprintfa(output, "Auto save is %d\n", ac_auto_save);
     286
     287   return 0;
     288 } /* show_auto_save() */
     289
     290
     291 /*++++++++++++++++++++++++++++++++++++++
     292
     293   Modify the whois access control list in the AC module.
     294
     295   Arguments: IP[/prefixlength] column=value,column=value...
     296
     297   Column names as in acl display. Unset columns are inherited.
     298
     299   ++++++++++++++++++++++++++++++++++++++*/
     300 int set_acl(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     301 {
     302   int res = 0;
     303
     304   /* first 8 characters ("set acl ") are already skipped */
     305   if( ! NOERR( AC_asc_acl_command_set( input, "Manual"))) {
     306     g_string_append(output, "Error!\n");
     307     res = PC_RET_ERR;
     308   }
     309   return res;
     310 }
     311
     312 /*++++++++++++++++++++++++++++++++++++++
     313
     314   Sets the auto save status of the access tree.
     315
     316   Arguments: 0 = don't auto save, 1 = auto save
     317
     318   ++++++++++++++++++++++++++++++++++++++*/
     319 int set_auto_save(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     320 {
     321   int res = 0;
     322
     323   /* Lame */
     324   switch (input[0]) {
     325   case '0':
     326     ac_auto_save  = 0;
     327 printf("0\n");
     328     break;
     329   case '1':
     330     ac_auto_save  = 1;
     331 printf("1\n");
     332     break;
     333   default:
     334 printf("X\n");
     335     res = PC_RET_ERR;
     336   }
     337   return res;
     338 }
     339
     340 /*++++++++++++++++++++++++++++++++++++++
     341
     342   Reset the deny counter in the access tree to 0 (after reenabling)
     343   (AC module).
     344
     345   Argument: IP address.
     346
     347   ++++++++++++++++++++++++++++++++++++++*/
     348 int set_nodeny(char *input, GString *output, sk_conn_st *condat) {
         /* [<][>][^][v][top][bottom][index][help] */
     349
     350   /* first 11 characters ("set nodeny ")  are already skipped */
     351
     352   if( ! NOERR( AC_asc_set_nodeny(input) )) {
     353     g_string_append(output, "Error\n");
     354     return PC_RET_ERR;
     355   }
     356   else {
     357     return 0;
     358   }
     359
     360 } /* set_nodeny() */
     361
     362
     363 /*++++++++++++++++++++++++++++++++++++++
     364
     365   Pause/resume update capability of the UD module.
     366
     367   Argument: the word "pause" or "resume".
     368
     369   ++++++++++++++++++++++++++++++++++++++*/
     370 int set_updates(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     371 {
     372   char argstr[17];
     373   int pause=0, resume=0;
     374   int res = 0;
     375
     376   if( sscanf(input, "%16s", argstr) == 1) {
     377     pause = (strcmp(argstr,"pause") == 0);
     378     resume = (strcmp(argstr,"resume") == 0);
     379   }
     380
     381   if( !pause && !resume ) {
     382     g_string_append(output,  "syntax error.");
     383     res = PC_RET_ERR;
     384   }
     385   else {
     386     /* all params ok. just set the property */
     387     char *value = pause ? "0" : "1";
     388
     389     if (CO_set_const("UD.do_update", value) == 0) {
     390       g_string_append(output, "Constant successfully set\n");
     391     }
     392     else {
     393       g_string_append(output, "Could not set\n");
     394       res = PC_RET_ERR;
     395     }
     396   }
     397   return res;
     398 }
     399 /*++++++++++++++++++++++++++++++++++++++
     400
     401   Pause/resume queries.
     402
     403   Argument: the word "pause" or "resume".
     404
     405   ++++++++++++++++++++++++++++++++++++++*/
     406 int set_queries(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     407 {
     408   char argstr[17];
     409   int pause=0, resume=0;
     410   int res = 0;
     411
     412   if( sscanf(input, "%16s", argstr) == 1) {
     413     pause = (strcmp(argstr,"pause") == 0);
     414     resume = (strcmp(argstr,"resume") == 0);
     415   }
     416
     417   if( !pause && !resume ) {
     418     g_string_append(output,  "syntax error.");
     419     res = PC_RET_ERR;
     420   }
     421   else {
     422
     423     if(pause){
     424             PW_stopqueries();
     425             g_string_append(output, "Queries are stopped\n");
     426     }else {
     427             PW_startqueries();
     428             g_string_append(output, "Queries are unblocked\n");
     429     }
     430   }
     431   return res;
     432 }
     433
     434
     435 /*++++++++++++++++++++++++++++++++++++++
     436
     437   Reset the source.
     438
     439   Reloads the radix tree.
     440
     441   Argument: the source name.
     442
     443   ++++++++++++++++++++++++++++++++++++++*/
     444 int set_initrx(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     445 {
     446 ca_dbSource_t *source_hdl;
     447 int res = 0;
     448
     449         source_hdl = ca_get_SourceHandleByName(input);
     450         if (source_hdl == NULL){
     451                 g_string_append(output,  "Unknown source");
     452                 res = PC_RET_ERR;
     453         }
     454         else if(RP_init_trees( source_hdl ) != RP_OK ) {
     455                 g_string_append(output, "Could not re-initialize radix trees");
     456                 res = PC_RET_ERR;
     457         }
     458         else if(RP_sql_load_reg( source_hdl ) != RP_OK ) {
     459                 g_string_append(output, "Could not load radix trees");
     460                 res = PC_RET_ERR;
     461         }
     462         else {
     463          g_string_append(output, "radix trees reloaded successfully\n");
     464         }
     465  return res;
     466 }
     467 /*++++++++++++++++++++++++++++++++++++++
     468
     469   Reset the "session time" and "# of tasks"
     470   of a specific thread registered with the TA module.
     471
     472   ++++++++++++++++++++++++++++++++++++++*/
     473 #if 0
     474
     475 /*
     476 XXX:
     477 I've removed this function because it is supposed to pass a pthread_t
     478 to the TA_reset_counters() function.  But pthread_t is an opaque
     479 type - on FreeBSD it is a pointer to a structure, so you can't simply
     480 use sscanf() to get one!
     481
     482 Shane
     483 2001-09-05
     484
     485 int set_counter(char *input, GString *output, sk_conn_st *condat)
     486 {
     487   unsigned thr_id;
     488
     489   if( sscanf(input, "%d", &thr_id) == 1) {
     490     TA_reset_counters(thr_id);
     491   }
     492   return 0;
     493 }
     494 */
     495 #endif /* 0 */
     496
     497
     498
     499 /*++++++++++++++++++++++++++++++++++++++
     500
     501   Execute a command in the ER path processor of the ER module.
     502   (first subject to macro expansion of the first word).
     503
     504   Argument is passed entirely to ER_macro_spec().
     505
     506   ++++++++++++++++++++++++++++++++++++++*/
     507 int set_err(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     508 {
     509   char *erret = NULL;
     510   int res;
     511
     512   res = ER_macro_spec(input, &erret);
     513   g_string_append(output, erret);
     514   UT_free(erret);
     515
     516   return res;
     517 }
     518
     519
     520 /*++++++++++++++++++++++++++++++++++++++
     521
     522   Show the current setup of the ER path system of the ER module.
     523
     524   ++++++++++++++++++++++++++++++++++++++*/
     525 int show_err(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     526 {
     527   char *erret = NULL;
     528
     529   er_print_paths(&erret);
     530   g_string_append(output, erret);
     531   UT_free(erret);
     532
     533   return 0;
     534 }
     535
     536
     537 /*++++++++++++++++++++++++++++++++++++++
     538
     539   Show the currently defined macros for the ER path system of the ER module.
     540
     541   ++++++++++++++++++++++++++++++++++++++*/
     542 int show_macros(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     543 {
     544   ER_macro_list(condat);
     545   return 0;
     546 }
     547
     548
     549
     550 /*++++++++++++++++++++++++++++++++++++++
     551
     552   (re)define a macro for the ER path processor.
     553
     554   Arguments: The first word is treated as a macro name.
     555   The rest of the line is treated as a macro definition.
     556
     557   ++++++++++++++++++++++++++++++++++++++*/
     558 int set_macro(char *input, GString *output, sk_conn_st *condat)
         /* [<][>][^][v][top][bottom][index][help] */
     559 {
     560   char *name, *body;
     561
     562   if( strlen(input) > 0 ) {
     563     body = input;
     564     name = (char *)strsep(&body, " ");
     565
     566     ER_make_macro( name, body );
     567   }
     568
     569   return 0;
     570 }
     571
     572
     573
     574
     575 /*++++++++++++++++++++++++++++++++++++++
     576
     577   Trigger running of the socket watchdog actions for a specific thread
     578   (typically resulting in shutting down of a query thread).
     579
     580   Arguments are "<socket_id> <thread_id>" as in the output of "show threads".
     581
     582   Assumes the command is like "stop query 11 17".
     583   This is to limit ambiguities (a new thread on the same socket, for example).
     584 .
     585   ++++++++++++++++++++++++++++++++++++++*/
     586 #if 0
     587 /*
     588 XXX:
     589 I've removed this function because it is supposed to pass a pthread_t
     590 to the TA_trigger() function.  But pthread_t is an opaque
     591 type - on FreeBSD it is a pointer to a structure, so you can't simply
     592 use sscanf() to get one!
     593
     594 Shane
     595 2001-09-05
     596
     597 int stop_query(char *input, GString *output, sk_conn_st *condat)
     598 {
     599   int fd;
     600   unsigned thr;
     601
     602
     603   if( sscanf(input, "%d %ud", &fd, &thr) < 2 ) {
     604     g_string_append(output,"error!!");
     605     return PC_RET_ERR;
     606   }
     607   else {
     608     TA_trigger("whois", fd, thr);
     609     return 0;
     610   }
     611 }
     612 */
     613 #endif /* 0 */

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