diff --git a/client/test/maxadmin_test.sh b/client/test/maxadmin_test.sh old mode 100644 new mode 100755 index 5540fc380..dd3acaaa9 --- a/client/test/maxadmin_test.sh +++ b/client/test/maxadmin_test.sh @@ -26,6 +26,76 @@ else echo "Auth test (long option): Passed" fi +# +# Test enable|disable heartbeat|root without, with invalid and with long invalid argument +# +for op in enable disable +do +for cmd in heartbeat root +do + maxadmin -pskysql $op $cmd >& /dev/null + if [ $? -eq "1" ]; then + echo "$op $cmd (missing arg): Failed" + failure=`expr $failure + 1` + else + passed=`expr $passed + 1` + echo "$op $cmd (missing arg): Passed" + fi + + maxadmin -pskysql $op $cmd qwerty >& /dev/null + if [ $? -eq "1" ]; then + echo "$op $cmd (invalid arg): Failed" + failure=`expr $failure + 1` + else + passed=`expr $passed + 1` + echo "$op $cmd (invalied arg): Passed" + fi + + maxadmin -pskysql $op $cmd xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx >& /dev/null + if [ $? -eq "1" ]; then + echo "$op $cmd (long invalid arg): Failed" + failure=`expr $failure + 1` + else + passed=`expr $passed + 1` + echo "$op $cmd (long invalid arg): Passed" + fi +done +done + +# +# Test reload dbusers with short, and long garbage and without argument +# +maxadmin -pskysql reload dbusers qwerty >& /dev/null +if [ $? -eq "1" ]; then + echo "Reload dbusers (invalid arg): Failed" + failure=`expr $failure + 1` +else + passed=`expr $passed + 1` + echo "Reload dbusers (invalid arg): Passed" +fi + +maxadmin -pskysql reload dbusers xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx >& /dev/null +if [ $? -eq "1" ]; then + echo "Reload dbusers (long invalid arg): Failed" + failure=`expr $failure + 1` +else + passed=`expr $passed + 1` + echo "Reload dbusers (long invalid arg): Passed" +fi + + +maxadmin -pskysql reload dbusers >& /dev/null +if [ $? -eq "1" ]; then + echo "Reload dbusers (missing arg): Failed" + failure=`expr $failure + 1` +else + passed=`expr $passed + 1` + echo "Reload dbusers (missing arg): Passed" +fi + +# +# Test enable|disable log debug|trace|message|error +# maxadmin -pskysql enable log debug >& /dev/null if [ $? -eq "1" ]; then echo "Enable debug log: Failed" @@ -44,6 +114,26 @@ else echo "Enable trace log: Passed" fi +maxadmin -pskysql enable log message >& /dev/null +if [ $? -eq "1" ]; then + echo "Enable message log: Failed" + failure=`expr $failure + 1` +else + passed=`expr $passed + 1` + echo "Enable message log: Passed" +fi + +maxadmin -pskysql enable log error >& /dev/null +if [ $? -eq "1" ]; then + echo "Enable error log: Failed" + failure=`expr $failure + 1` +else + passed=`expr $passed + 1` + echo "Enable error log: Passed" +fi + + + maxadmin -pskysql disable log debug >& /dev/null if [ $? -eq "1" ]; then echo "Disable debug log: Failed" @@ -62,6 +152,70 @@ else echo "Disable trace log: Passed" fi +# +# Test restart monitor|service without, with invalid and with long invalid argument +# +for cmd in monitor service +do + maxadmin -pskysql restart $cmd >& /dev/null + if [ $? -eq "1" ]; then + echo "Restart $cmd (missing arg): Failed" + failure=`expr $failure + 1` + else + passed=`expr $passed + 1` + echo "Restart $cmd (missing arg): Passed" + fi + + maxadmin -pskysql restart $cmd xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx >& /dev/null + if [ $? -eq "1" ]; then + echo "Restart $cmd (long invalid arg): Failed" + failure=`expr $failure + 1` + else + passed=`expr $passed + 1` + echo "Restart $cmd (long invalid arg): Passed" + fi + + maxadmin -pskysql restart $cmd qwerty >& /dev/null + if [ $? -eq "1" ]; then + echo "Restart $cmd (invalid arg): Failed" + failure=`expr $failure + 1` + else + passed=`expr $passed + 1` + echo "Restart $cmd (invalid arg): Passed" + fi +done + +# +# Test set server qwerty master withaout, with invalid and with long invalid arg +# +maxadmin -pskysql set server qwerty >& /dev/null +if [ $? -eq "1" ]; then + echo "Set server qwerty (missing arg): Failed" + failure=`expr $failure + 1` +else + passed=`expr $passed + 1` + echo "Set server (missing arg): Passed" +fi + +maxadmin -pskysql set server qwerty mamaster >& /dev/null +if [ $? -eq "1" ]; then + echo "Set server qwerty (invalid arg): Failed" + failure=`expr $failure + 1` +else + passed=`expr $passed + 1` + echo "Set server qwerty (invalid arg): Passed" +fi + +maxadmin -pskysql set server qwerty xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx >& /dev/null +if [ $? -eq "1" ]; then + echo "Set server qwerty (long invalid arg): Failed" + failure=`expr $failure + 1` +else + passed=`expr $passed + 1` + echo "Set server qwerty (long invalid arg): Passed" +fi + + for cmd in clients dcbs filters listeners modules monitors services servers sessions threads do maxadmin -pskysql list $cmd | grep -s '-' >& /dev/null @@ -112,13 +266,14 @@ fi maxadmin -pskysql set server $master maint >& /dev/null if [ $? -eq "1" ]; then - echo "set server: Failed" + echo "set server $master maint: Failed" failure=`expr $failure + 1` else passed=`expr $passed + 1` - echo "set server: Passed" + echo "set server $master maint: Passed" fi -maxadmin -pskysql list servers | grep $master | grep -s Maint >& /dev/null + +maxadmin -pskysql list servers | grep $master | grep -s 'Maint' >& /dev/null if [ $? -eq "1" ]; then echo "set maintenance mode: Failed" failure=`expr $failure + 1` @@ -126,6 +281,7 @@ else passed=`expr $passed + 1` echo "set maintenance mode: Passed" fi + maxadmin -pskysql clear server $master maint >& /dev/null if [ $? -eq "1" ]; then echo "clear server: Failed" @@ -134,7 +290,7 @@ else passed=`expr $passed + 1` echo "clear server: Passed" fi -maxadmin -pskysql list servers | grep $master | grep -s Maint >& /dev/null +maxadmin -pskysql list servers | grep $master | grep -s 'Maint' >& /dev/null if [ $? -eq "0" ]; then echo "clear maintenance mode: Failed" failure=`expr $failure + 1` @@ -156,14 +312,45 @@ for i in $dcbs do maxadmin -pskysql show dcb $i | grep -s 'listening' >& /dev/null if [ $? -eq "1" ]; then - echo "show dcb listeners: Failed" + echo "show dcb listeners: Failed" failure=`expr $failure + 1` else passed=`expr $passed + 1` - echo "show dcb listeners: Passed" + echo "show dcb listeners: Passed" fi done +# +# Test show dcb|eventq|eventstats|filter|monitor|server|service|session with invalid arg +# +for cmd in dcb eventq filter monitor server service sessions +do + maxadmin -pskysql show $cmd qwerty | grep -s '-' >& /dev/null + if [ $? -eq "0" ]; then + echo "show $cmd (invalid arg): Failed" + failure=`expr $failure + 1` + else + passed=`expr $passed + 1` + echo "show $cmd (invalid arg): Passed" + fi +done + +# +# Test shutdown monitor|service with invalid extra argument +# +for cmd in monitor service +do + maxadmin -pskysql shutdown $cmd qwerty | grep -s '-' >& /dev/null + if [ $? -eq "0" ]; then + echo "Shutdown $cmd (invalid extra arg):Failed" + failure=`expr $failure + 1` + else + passed=`expr $passed + 1` + echo "Shutdown $cmd (invalid extra arg):Passed" + fi +done + + sessions=`maxadmin -pskysql list sessions | awk -F\| '/Listener/ { if ( NF > 1 ) print $1 }'` if [ $? -eq "1" ]; then echo "Get listener sessions: Failed" diff --git a/server/core/service.c b/server/core/service.c index e0a378647..1bfa80177 100644 --- a/server/core/service.c +++ b/server/core/service.c @@ -1020,7 +1020,10 @@ SERV_PROTOCOL *lptr; ptr->name, lptr->protocol, (lptr && lptr->address) ? lptr->address : "*", lptr->port, - (lptr->listener->session->state == SESSION_STATE_LISTENER_STOPPED) ? "Stopped" : "Running" + (!lptr->listener || + !lptr->listener->session || + lptr->listener->session->state == SESSION_STATE_LISTENER_STOPPED) ? + "Stopped" : "Running" ); lptr = lptr->next; diff --git a/server/modules/include/debugcli.h b/server/modules/include/debugcli.h index 0f01da519..ed650e135 100644 --- a/server/modules/include/debugcli.h +++ b/server/modules/include/debugcli.h @@ -52,12 +52,14 @@ typedef struct cli_instance { * The CLI_SESSION structure. As CLI_SESSION is created for each user that logs into * the DEBUG CLI. */ +enum { cmdbuflen=80 }; + typedef struct cli_session { - char cmdbuf[80]; /*< The command buffer used to build up user commands */ - int mode; /*< The CLI Mode for this session */ - SESSION *session; /*< The gateway session */ + char cmdbuf[cmdbuflen]; /*< The command buffer used to build up user commands */ + int mode; /*< The CLI Mode for this session */ + SESSION *session; /*< The gateway session */ struct cli_session - *next; /*< The next pointer for the list of sessions */ + *next; /*< The next pointer for the list of sessions */ } CLI_SESSION; /* Command line interface modes */ diff --git a/server/modules/routing/cli.c b/server/modules/routing/cli.c index bd054f5a3..5f927cd3c 100644 --- a/server/modules/routing/cli.c +++ b/server/modules/routing/cli.c @@ -272,7 +272,7 @@ CLI_SESSION *session = (CLI_SESSION *)router_session; /* Extract the characters */ while (queue) { - strncat(session->cmdbuf, GWBUF_DATA(queue), GWBUF_LENGTH(queue)); + strncat(session->cmdbuf, GWBUF_DATA(queue), MIN(GWBUF_LENGTH(queue),cmdbuflen-1)); queue = gwbuf_consume(queue, GWBUF_LENGTH(queue)); } diff --git a/server/modules/routing/debugcmd.c b/server/modules/routing/debugcmd.c index 1b2da40c1..409d627dd 100644 --- a/server/modules/routing/debugcmd.c +++ b/server/modules/routing/debugcmd.c @@ -666,19 +666,13 @@ SERVICE *service; case ARG_TYPE_SERVICE: if (mode == CLIM_USER || (rval = (unsigned long)strtol(arg, NULL, 0)) == 0) rval = (unsigned long)service_find(arg); - - if (rval) - return rval; - else - return 0x1; /*< invalid argument */ + + return rval; case ARG_TYPE_SERVER: if (mode == CLIM_USER || (rval = (unsigned long)strtol(arg, NULL, 0)) == 0) rval = (unsigned long)server_find_by_unique_name(arg); - if (rval) - return rval; - else - return 0x1; /*< invalid argument */ + return rval; case ARG_TYPE_DBUSERS: if (mode == CLIM_USER || (rval = (unsigned long)strtol(arg, NULL, 0)) == 0) { @@ -686,39 +680,30 @@ SERVICE *service; if (service) return (unsigned long)(service->users); else - return 1; /*< invalid argument */ + return 0; } return rval; case ARG_TYPE_DCB: rval = (unsigned long)strtol(arg, NULL, 0); if (mode == CLIM_USER && dcb_isvalid((DCB *)rval) == 0) - rval = 0x1; /*< invalid argument */ + rval = 0; return rval; case ARG_TYPE_SESSION: rval = (unsigned long)strtol(arg, NULL, 0); if (mode == CLIM_USER && session_isvalid((SESSION *)rval) == 0) rval = 0; - if (rval) - return rval; - else - return 0x1; /*< invalid argument */ + return rval; case ARG_TYPE_MONITOR: if (mode == CLIM_USER || (rval = (unsigned long)strtol(arg, NULL, 0)) == 0) rval = (unsigned long)monitor_find(arg); - if (rval) - return rval; - else - return 0x1; /*< invalid argument */ + return rval; case ARG_TYPE_FILTER: if (mode == CLIM_USER || (rval = (unsigned long)strtol(arg, NULL, 0)) == 0) rval = (unsigned long)filter_find(arg); - if (rval) - return rval; - else - return 0x1; /*< invalid argument */ + return rval; case ARG_TYPE_NUMERIC: { int i; @@ -906,15 +891,12 @@ bool in_space = false; break; case 1: arg1 = convert_arg(cli->mode, args[2],cmds[i].options[j].arg_types[0]); - if (arg1 == 0x1) - { + + if (arg1) + cmds[i].options[j].fn(dcb, arg1); + else dcb_printf(dcb, "Invalid argument: %s\n", args[2]); - } - else - { - cmds[i].options[j].fn(dcb, arg1); - } break; case 2: arg1 = convert_arg(cli->mode, args[2],cmds[i].options[j].arg_types[0]); @@ -971,7 +953,7 @@ bool in_space = false; if (!found) dcb_printf(dcb, "Command '%s' not known, type help for a list of available commands\n", args[0]); - memset(cli->cmdbuf, 0, 80); + memset(cli->cmdbuf, 0, cmdbuflen); return 1; }