From ee8301ecade46bf7c9b6a34d0376d7bb491888fd Mon Sep 17 00:00:00 2001 From: chenchacha Date: Tue, 1 Jan 2019 15:12:25 +0800 Subject: [PATCH 1/6] the major() and minor() move to sys/sysmacros.h in new kernel Signed-off-by: chenchacha --- src/modules/sysstat-lite/src/ioconf.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modules/sysstat-lite/src/ioconf.c b/src/modules/sysstat-lite/src/ioconf.c index ab5dcd5..cb2be81 100644 --- a/src/modules/sysstat-lite/src/ioconf.c +++ b/src/modules/sysstat-lite/src/ioconf.c @@ -38,6 +38,7 @@ #else #define _(string) (string) #endif +#include static unsigned int ioc_parsed = 0; static struct ioc_entry *ioconf[MAX_BLKDEV + 1]; From a12744592568396a0eb938962db04e4c1e5c7014 Mon Sep 17 00:00:00 2001 From: chenchacha Date: Tue, 1 Jan 2019 15:20:55 +0800 Subject: [PATCH 2/6] Add selftest at the beginning of the program To avoid abnormal exits caused by core dump and segment error. Signed-off-by: chenchacha --- include/jsonrpc-c.h | 1 + src/jsonrpc-c.c | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/include/jsonrpc-c.h b/include/jsonrpc-c.h index b17fa85..984c6ca 100644 --- a/include/jsonrpc-c.h +++ b/include/jsonrpc-c.h @@ -43,6 +43,7 @@ struct jrpc_procedure { char * name; jrpc_function function; void *data; + int allow:1; }; struct jrpc_server { diff --git a/src/jsonrpc-c.c b/src/jsonrpc-c.c index 09c1b36..343987d 100644 --- a/src/jsonrpc-c.c +++ b/src/jsonrpc-c.c @@ -15,6 +15,7 @@ #include #include #include +#include #include "jsonrpc-c.h" @@ -72,6 +73,36 @@ static int send_result(struct jrpc_connection * conn, cJSON * result, return return_value; } +static int selftest_procedure(struct jrpc_server *server) { + pid_t pid; + + int i = server->procedure_count; + while (i--) { + pid = fork(); + if (pid < 0) + printf("selftest: Fork failed!\n"); + else if (pid == 0) { + jrpc_context ctx; + ctx.error_code = 0; + ctx.error_message = NULL; + cJSON *fake = cJSON_CreateObject(); + + ctx.data = server->procedures[i].data; + server->procedures[i].function(&ctx, fake, fake); + + exit(0); + } else { + int stat_loc; + + if (waitpid(pid, &stat_loc, 0) != pid) + printf("selftest: Wait pid(%d) error\n", pid); + + if (!stat_loc) + server->procedures[i].allow = 1; + } + } +} + static int invoke_procedure(struct jrpc_server *server, struct jrpc_connection * conn, char *name, cJSON *params, cJSON *id) { cJSON *returned = NULL; @@ -81,7 +112,8 @@ static int invoke_procedure(struct jrpc_server *server, ctx.error_message = NULL; int i = server->procedure_count; while (i--) { - if (!strcmp(server->procedures[i].name, name)) { + if (!strcmp(server->procedures[i].name, name) && + server->procedures[i].allow) { procedure_found = 1; ctx.data = server->procedures[i].data; returned = server->procedures[i].function(&ctx, params, id); @@ -341,6 +373,7 @@ static int __jrpc_server_start(struct jrpc_server *server) { #endif void jrpc_server_run(struct jrpc_server *server){ + selftest_procedure(server); EV_RUN(server->loop, 0); } From e3fae3380daafa0a742bd9445f6688876b32ef2c Mon Sep 17 00:00:00 2001 From: chenchacha Date: Sat, 18 May 2019 22:57:04 +0800 Subject: [PATCH 3/6] Fix a bug: the connect can't close after the response sent Signed-off-by: chenchacha --- src/jsonrpc-c.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/jsonrpc-c.c b/src/jsonrpc-c.c index 343987d..3d5b7a3 100644 --- a/src/jsonrpc-c.c +++ b/src/jsonrpc-c.c @@ -33,10 +33,17 @@ static void *get_in_addr(struct sockaddr *sa) { } static int send_response(struct jrpc_connection * conn, char *response) { + int l, len, send; int fd = conn->fd; if (conn->debug_level > 1) printf("JSON Response:\n%s\n", response); - write(fd, response, strlen(response)); + + for (send = 0, len = strlen(response); send < len; send += l) { + l = write(fd, response+send, len - send); + if (l < 0) + break; + } + write(fd, "\n", 1); return 0; } @@ -236,6 +243,7 @@ static void connection_cb(struct ev_loop *loop, ev_io *w, int revents) { } } + return close_connection(loop, w); } static void accept_cb(struct ev_loop *loop, ev_io *w, int revents) { From 7396286f22b97268a26c110a7ff691eeaf19c31d Mon Sep 17 00:00:00 2001 From: guanqiao Date: Fri, 14 Jun 2019 14:35:15 +0800 Subject: [PATCH 4/6] Fix a bug: the lepd crashes during the selftest function Signed-off-by: guanqiao --- src/jsonrpc-c.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/jsonrpc-c.c b/src/jsonrpc-c.c index 3d5b7a3..a5f52ec 100644 --- a/src/jsonrpc-c.c +++ b/src/jsonrpc-c.c @@ -85,24 +85,27 @@ static int selftest_procedure(struct jrpc_server *server) { int i = server->procedure_count; while (i--) { + cJSON *fake = cJSON_CreateObject(); + jrpc_context ctx; + ctx.error_code = 0; + ctx.error_message = NULL; + ctx.data = server->procedures[i].data; + jrpc_function function = server->procedures[i].function; + char *name = server->procedures[i].name; + pid = fork(); if (pid < 0) - printf("selftest: Fork failed!\n"); + fprintf(stderr, "selftest: Fork failed!\n"); else if (pid == 0) { - jrpc_context ctx; - ctx.error_code = 0; - ctx.error_message = NULL; - cJSON *fake = cJSON_CreateObject(); - - ctx.data = server->procedures[i].data; - server->procedures[i].function(&ctx, fake, fake); + printf("selftest:%s\n", name); //WARNING!!!: if delete this print, the selftest will crash! + function(&ctx, fake, fake); exit(0); } else { int stat_loc; if (waitpid(pid, &stat_loc, 0) != pid) - printf("selftest: Wait pid(%d) error\n", pid); + fprintf(stderr, "selftest: Wait pid(%d) error\n", pid); if (!stat_loc) server->procedures[i].allow = 1; From 1bcbf8f45414058128c7be9cd3fb06b522c0a896 Mon Sep 17 00:00:00 2001 From: guanqiao Date: Fri, 14 Jun 2019 16:06:42 +0800 Subject: [PATCH 5/6] Disable daemon, and increase command buffer size Signed-off-by: guanqiao --- src/server.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/server.c b/src/server.c index e211fb4..f30c22e 100644 --- a/src/server.c +++ b/src/server.c @@ -30,7 +30,7 @@ static int debug; /* enable this to printf */ #define PROC_BUFF 8192 unsigned char proc_buff[PROC_BUFF]; -#define CMD_BUFF 16384 +#define CMD_BUFF 163840 unsigned char cmd_buff[CMD_BUFF]; struct jrpc_server my_server; @@ -309,10 +309,12 @@ int main(int argc, char **argv) * so, don't close them; but we want to mute errors * just like a typical daemon */ +#if 0 daemon(0, 1); fd = open ("/dev/null", O_RDWR, 0); if (fd != -1) dup2 (fd, STDERR_FILENO); +#endif jrpc_server_init(&my_server, PORT); jrpc_register_procedure(&my_server, say_hello, "SayHello", NULL); From 0cdb433596953fab93ba6e0ea4c774508305e6b1 Mon Sep 17 00:00:00 2001 From: guanqiao Date: Mon, 17 Jun 2019 17:52:17 +0800 Subject: [PATCH 6/6] Add extra command iotop and jnettop support Signed-off-by: guanqiao --- src/server.c | 48 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/src/server.c b/src/server.c index f30c22e..f39df76 100644 --- a/src/server.c +++ b/src/server.c @@ -27,10 +27,11 @@ static int debug; /* enable this to printf */ } while(0) #define PORT 12307 // the port users will be connecting to -#define PROC_BUFF 8192 +#define PROC_BUFF (1024 * 512) //8192 unsigned char proc_buff[PROC_BUFF]; -#define CMD_BUFF 163840 +#define CMD_BUFF (1024 * 1024) //163840 +#define PERF_CMD_BUFF (1024 * 1024 * 10) //163840 unsigned char cmd_buff[CMD_BUFF]; struct jrpc_server my_server; @@ -226,19 +227,30 @@ cJSON * run_cmd(jrpc_context * ctx, cJSON * params, cJSON *id) { FILE *fp; int size; + unsigned char *buffer; + cJSON *ret; if (!ctx->data) return NULL; fp = popen(ctx->data, "r"); if (fp) { - memset(cmd_buff, 0, CMD_BUFF); - size = fread(cmd_buff, 1, CMD_BUFF - strlen(endstring) - 1 , fp); + buffer = (unsigned char *)malloc(CMD_BUFF); + if (buffer == NULL) { + pclose(fp); + return NULL; + } + + memset(buffer, 0, CMD_BUFF); + size = fread(buffer, 1, CMD_BUFF - strlen(endstring) - 1 , fp); DEBUG_PRINT("run_cmd:size %d:%s\n", size, (char *)ctx->data); pclose(fp); - strcat(cmd_buff, endstring); - return cJSON_CreateString(cmd_buff); + strcat(buffer, endstring); + ret = cJSON_CreateString(buffer); + free(buffer); + + return ret; } return NULL; } @@ -270,6 +282,8 @@ cJSON * run_perf_script_cmd(jrpc_context * ctx, cJSON * params, cJSON *id) { FILE *fp; int size; + unsigned char *buffer; + cJSON *ret; if (!ctx->data) return NULL; @@ -277,13 +291,22 @@ cJSON * run_perf_script_cmd(jrpc_context * ctx, cJSON * params, cJSON *id) system(ctx->data); fp = popen("perf script", "r"); if (fp) { - memset(cmd_buff, 0, CMD_BUFF); - size = fread(cmd_buff, 1, CMD_BUFF - strlen(endstring) - 1, fp); + buffer = (unsigned char *)malloc(PERF_CMD_BUFF); + if (buffer == NULL) { + pclose(fp); + return NULL; + } + + memset(buffer, 0, PERF_CMD_BUFF); + size = fread(buffer, 1, CMD_BUFF - strlen(endstring) - 1, fp); DEBUG_PRINT("run_cmd:size %d:%s\n", size, (char *)ctx->data); pclose(fp); - strcat(cmd_buff, endstring); - return cJSON_CreateString(cmd_buff); + strcat(buffer, endstring); + ret = cJSON_CreateString(buffer); + free(buffer); + + return ret; } return NULL; } @@ -337,7 +360,7 @@ int main(int argc, char **argv) /********************************************* * * ****************************************/ - jrpc_register_procedure(&my_server, run_builtin_cmd, "GetCmdIotop", "iotop"); + //jrpc_register_procedure(&my_server, run_builtin_cmd, "GetCmdIotop", "iotop -n 1 -b"); //jrpc_register_procedure(&my_server, run_builtin_cmd, "GetCmdIopp", "iopp"); jrpc_register_procedure(&my_server, run_builtin_cmd, "GetCmdFree", "free"); jrpc_register_procedure(&my_server, run_builtin_cmd, "GetCmdProcrank", "procrank"); @@ -346,7 +369,8 @@ int main(int argc, char **argv) //jrpc_register_procedure(&my_server, run_cmd, "GetCmdTop", "top -n 1 -b | head -n 50"); jrpc_register_procedure(&my_server, run_builtin_cmd, "GetCmdTop", "ps -e -o pid,user,pri,ni,vsize,rss,s,%cpu,%mem,time,cmd --sort=-%cpu "); //jrpc_register_procedure(&my_server, run_cmd, "GetCmdTopH", "top -n 1 -b | head -n 50"); - //jrpc_register_procedure(&my_server, run_cmd, "GetCmdIotop", "iotop -n 1 -b | head -n 50"); + jrpc_register_procedure(&my_server, run_cmd, "GetCmdIotop", "iotop -n 1 -b | head -n 50"); + jrpc_register_procedure(&my_server, run_cmd, "GetCmdJnettop", "jnettop --display text -t 5 --format '$src$,$srcname$,$srcport$,$srcbytes$,$srcpackets$,$srcbps$,$srcpps$,$dst$,$dstname$,$dstport$,$dstbytes$,$dstpackets$,$dstbps$,$dstpps$,$proto$,$totalbytes$,$totalpackets$,$totalbps$,$totalpps$,$filterdata$'"); //jrpc_register_procedure(&my_server, run_cmd, "GetCmdSmem", "smem -p -s pss -r -n 50"); jrpc_register_procedure(&my_server, run_builtin_cmd, "GetCmdDmesg", "dmesg"); jrpc_register_procedure(&my_server, run_builtin_cmd, "GetCmdDf", "df -h");