From a813b81b203d31d6a7c956b8a1d007c7ede3ff08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E9=91=AB=E9=91=AB?= <1310342532@qq.com> Date: Fri, 28 Jun 2024 14:28:50 +0800 Subject: [PATCH] =?UTF-8?q?perctl=E6=B7=BB=E5=8A=A0=E6=97=A5=E5=BF=97+?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E7=BA=A7=E5=88=AB=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cm_utils/cm_scsi.c | 48 +++---- src/ddes_perctrl/interface/ddes_perctrl_api.c | 32 ++--- .../service/ddes_perctrl_server.c | 127 ++++++++++++++++-- .../service/ddes_perctrl_server.h | 10 ++ 4 files changed, 160 insertions(+), 57 deletions(-) diff --git a/src/cm_utils/cm_scsi.c b/src/cm_utils/cm_scsi.c index 38ae8b9..0beeaaa 100644 --- a/src/cm_utils/cm_scsi.c +++ b/src/cm_utils/cm_scsi.c @@ -183,7 +183,7 @@ status_t cm_scsi2_reserve(int32 fd) status = ioctl(fd, SG_IO, &hdr); if (status < 0) { - LOG_DEBUG_ERR("Sending SCSI2 reserve command failed, status %d, errno %d.", status, errno); + LOG_DEBUG_ERR("Sending SCSI2 reserve command failed, status %d, errno %d, errmsg %s.", status, errno, cm_get_os_error_msg(errno)); return CM_ERROR; } @@ -220,7 +220,7 @@ status_t cm_scsi2_release(int32 fd) status = ioctl(fd, SG_IO, &hdr); if (status < 0) { - LOG_DEBUG_ERR("Sending SCSI2 release command failed, status %d, errno %d.", status, errno); + LOG_DEBUG_ERR("Sending SCSI2 release command failed, status %d, errno %d, errmsg %s.", status, errno, cm_get_os_error_msg(errno)); return CM_ERROR; } @@ -276,17 +276,17 @@ int32 cm_scsi3_register(int32 fd, int64 sark) status = ioctl(fd, SG_IO, &hdr); if (status < 0) { - LOG_DEBUG_ERR("Sending SCSI register command failed, status %d, errno %d.", status, errno); + LOG_RUN_ERR("Sending SCSI register command failed, status %d, errno %d, errmsg %s.", status, errno, cm_get_os_error_msg(errno)); CM_THROW_ERROR(ERR_SCSI_INVOKED_FAILED, cm_get_os_error_msg(errno)); return CM_ERROR; } if (hdr.status != 0) { if (hdr.status == SAM_RESERVATION_CONFLICT) { - LOG_DEBUG_INF("SCSI register get reservation confict return, sark %lld.", sark); + LOG_RUN_INF("SCSI register get reservation confict return, sark %lld, status %d.", sark, hdr.status); return CM_SCSI_ERR_CONFLICT; } else { - LOG_DEBUG_ERR("SCSI register failed, status %d.", hdr.status); + LOG_RUN_ERR("SCSI register failed, status %d.", hdr.status); return CM_ERROR; } } @@ -336,17 +336,17 @@ int32 cm_scsi3_unregister(int32 fd, int64 rk) status = ioctl(fd, SG_IO, &hdr); if (status < 0) { - LOG_DEBUG_ERR("Sending SCSI unregister command failed, status %d, errno %d.", status, errno); + LOG_RUN_ERR("Sending SCSI unregister command failed, status %d, errno %d, errmsg %s.", status, errno, cm_get_os_error_msg(errno)); CM_THROW_ERROR(ERR_SCSI_INVOKED_FAILED, cm_get_os_error_msg(errno)); return CM_ERROR; } if (hdr.status != 0) { if (hdr.status == SAM_RESERVATION_CONFLICT) { - LOG_DEBUG_INF("SCSI unregister get reservation confict return, rk %lld.", rk); + LOG_RUN_INF("SCSI unregister get reservation confict return, rk %lld, status %d.", rk, hdr.status); return CM_SCSI_ERR_CONFLICT; } else { - LOG_DEBUG_ERR("SCSI unregister failed, status %d.", hdr.status); + LOG_RUN_ERR("SCSI unregister failed, status %d.", hdr.status); return CM_ERROR; } } @@ -393,17 +393,17 @@ status_t cm_scsi3_reserve(int32 fd, int64 rk) status = ioctl(fd, SG_IO, &hdr); if (status < 0) { - LOG_DEBUG_ERR("Sending SCSI reserve command failed, status %d, errno %d.", status, errno); + LOG_RUN_ERR("Sending SCSI reserve command failed, status %d, errno %d, errmsg %s.", status, errno, cm_get_os_error_msg(errno)); CM_THROW_ERROR(ERR_SCSI_INVOKED_FAILED, cm_get_os_error_msg(errno)); return CM_ERROR; } if (hdr.status != 0) { if (hdr.status == SAM_RESERVATION_CONFLICT) { - LOG_DEBUG_INF("SCSI reserve get confict return, rk %lld.", rk); + LOG_RUN_INF("SCSI reserve get confict return, rk %lld.", rk); return CM_SCSI_ERR_CONFLICT; } else { - LOG_DEBUG_ERR("SCSI reserve failed, status %d.", hdr.status); + LOG_RUN_ERR("SCSI reserve failed, status %d.", hdr.status); return CM_ERROR; } } @@ -450,13 +450,13 @@ status_t cm_scsi3_release(int32 fd, int64 rk) status = ioctl(fd, SG_IO, &hdr); if (status < 0) { - LOG_DEBUG_ERR("Sending SCSI release command failed, status %d, errno %d.", status, errno); + LOG_RUN_ERR("Sending SCSI release command failed, status %d, errno %d, errmsg %s.", status, errno, cm_get_os_error_msg(errno)); CM_THROW_ERROR(ERR_SCSI_INVOKED_FAILED, cm_get_os_error_msg(errno)); return CM_ERROR; } if (hdr.status != 0) { - LOG_DEBUG_ERR("SCSI release failed, status %d.", hdr.status); + LOG_RUN_ERR("SCSI release failed, status %d.", hdr.status); return CM_ERROR; } @@ -502,7 +502,7 @@ status_t cm_scsi3_clear(int32 fd, int64 rk) status = ioctl(fd, SG_IO, &hdr); if (status < 0) { - LOG_DEBUG_ERR("Sending SCSI clear command failed, status %d, errno %d.", status, errno); + LOG_DEBUG_ERR("Sending SCSI clear command failed, status %d, errno %d, errmsg %s.", status, errno, cm_get_os_error_msg(errno)); CM_THROW_ERROR(ERR_SCSI_INVOKED_FAILED, cm_get_os_error_msg(errno)); return CM_ERROR; } @@ -557,13 +557,13 @@ status_t cm_scsi3_preempt(int32 fd, int64 rk, int64 sark) status = ioctl(fd, SG_IO, &hdr); if (status < 0) { - LOG_DEBUG_ERR("Sending SCSI preempt command failed, status %d, errno %d.", status, errno); + LOG_RUN_ERR("Sending SCSI preempt command failed, status %d, errno %d, errmsg %s.", status, errno, cm_get_os_error_msg(errno)); CM_THROW_ERROR(ERR_SCSI_INVOKED_FAILED, cm_get_os_error_msg(errno)); return CM_ERROR; } if (hdr.status != 0) { - LOG_DEBUG_ERR("SCSI preempt failed, status %d.", hdr.status); + LOG_RUN_ERR("SCSI preempt failed, status %d.", hdr.status); return CM_ERROR; } @@ -603,7 +603,7 @@ int32 cm_scsi3_caw(int32 fd, uint64 block_addr, char *buff, int32 buff_len) status = ioctl(fd, SG_IO, &hdr); if (status < 0) { - LOG_DEBUG_ERR("Sending SCSI caw command failed, status %d, errno %d.", status, errno); + LOG_DEBUG_ERR("Sending SCSI caw command failed, status %d, errno %d, errmsg %s.", status, errno, cm_get_os_error_msg(errno)); CM_THROW_ERROR(ERR_SCSI_INVOKED_FAILED, cm_get_os_error_msg(errno)); return CM_ERROR; } @@ -695,7 +695,7 @@ status_t cm_scsi3_read(int32 fd, int32 block_addr, uint16 block_count, char *buf status = ioctl(fd, SG_IO, &hdr); if (status < 0) { - LOG_DEBUG_ERR("Sending SCSI read command failed, status %d, errno %d.", status, errno); + LOG_DEBUG_ERR("Sending SCSI read command failed, status %d, errno %d, errmsg %s.", status, errno, cm_get_os_error_msg(errno)); CM_THROW_ERROR(ERR_SCSI_INVOKED_FAILED, cm_get_os_error_msg(errno)); return CM_ERROR; } @@ -747,7 +747,7 @@ status_t cm_scsi3_write(int32 fd, int32 block_addr, uint16 block_count, char *bu status = ioctl(fd, SG_IO, &hdr); if (status < 0) { - LOG_DEBUG_ERR("Sending SCSI write command failed, status %d, errno %d.", status, errno); + LOG_DEBUG_ERR("Sending SCSI write command failed, status %d, errno %d, errmsg %s.", status, errno, cm_get_os_error_msg(errno)); CM_THROW_ERROR(ERR_SCSI_INVOKED_FAILED, cm_get_os_error_msg(errno)); return CM_ERROR; } @@ -814,7 +814,7 @@ status_t cm_scsi3_get_array(int32 fd, array_info_t *array_info) status = ioctl(fd, SG_IO, &hdr); if (status < 0) { - LOG_DEBUG_ERR("Sending SCSI get array info command failed, status %d, errno %d.", status, errno); + LOG_DEBUG_ERR("Sending SCSI get array info command failed, status %d, errno %d, errmsg %s.", status, errno, cm_get_os_error_msg(errno)); CM_THROW_ERROR(ERR_SCSI_INVOKED_FAILED, cm_get_os_error_msg(errno)); return CM_ERROR; } @@ -867,7 +867,7 @@ status_t cm_scsi3_get_vendor(int32 fd, vendor_info_t *vendor_info) status = ioctl(fd, SG_IO, &hdr); if (status < 0) { - LOG_DEBUG_ERR("Sending SCSI get vendor info command failed, status %d, errno %d.", status, errno); + LOG_DEBUG_ERR("Sending SCSI get vendor info command failed, status %d, errno %d, errmsg %s.", status, errno, cm_get_os_error_msg(errno)); CM_THROW_ERROR(ERR_SCSI_INVOKED_FAILED, cm_get_os_error_msg(errno)); return CM_ERROR; } @@ -921,7 +921,7 @@ status_t cm_scsi3_get_lun(int32 fd, lun_info_t *lun_info) status = ioctl(fd, SG_IO, &hdr); if (status < 0) { - LOG_DEBUG_ERR("Sending SCSI get lun info command failed, status %d, errno %d.", status, errno); + LOG_DEBUG_ERR("Sending SCSI get lun info command failed, status %d, errno %d, errmsg %s.", status, errno, cm_get_os_error_msg(errno)); CM_THROW_ERROR(ERR_SCSI_INVOKED_FAILED, cm_get_os_error_msg(errno)); return CM_ERROR; } @@ -1014,7 +1014,7 @@ status_t cm_scsi3_rkeys(int32 fd, int64 *reg_keys, int32 *key_count, uint32 *gen status = ioctl(fd, SG_IO, &hdr); if (status < 0) { - LOG_DEBUG_ERR("Sending SCSI read keys command failed, status %d, errno %d.", status, errno); + LOG_DEBUG_ERR("Sending SCSI read keys command failed, status %d, errno %d, errmsg %s.", status, errno, cm_get_os_error_msg(errno)); CM_THROW_ERROR(ERR_SCSI_INVOKED_FAILED, cm_get_os_error_msg(errno)); return CM_ERROR; } @@ -1086,7 +1086,7 @@ status_t cm_scsi3_rres(int32 fd, int64 *rk, uint32 *generation) status = ioctl(fd, SG_IO, &hdr); if (status < 0) { - LOG_DEBUG_ERR("Sending SCSI read reservation command failed, status %d, errno %d.", status, errno); + LOG_DEBUG_ERR("Sending SCSI read reservation command failed, status %d, errno %d, errmsg %s.", status, errno, cm_get_os_error_msg(errno)); CM_THROW_ERROR(ERR_SCSI_INVOKED_FAILED, cm_get_os_error_msg(errno)); return CM_ERROR; } diff --git a/src/ddes_perctrl/interface/ddes_perctrl_api.c b/src/ddes_perctrl/interface/ddes_perctrl_api.c index 23d79f9..2658aa9 100644 --- a/src/ddes_perctrl/interface/ddes_perctrl_api.c +++ b/src/ddes_perctrl/interface/ddes_perctrl_api.c @@ -136,32 +136,24 @@ status_t perctrl_init(perctrl_pipes_t *perctrl, const char* name) if (pipe(perctrl->res_pipe.fds) == -1) { return CM_ERROR; } - + log_param_t *parent_log_param = cm_log_param_instance(); perctrl->pid = fork(); if (perctrl->pid < 0) { LOG_DEBUG_ERR("fork pertctrl fail."); return CM_ERROR; } else if (perctrl->pid == 0) { // child process g_is_init = CM_FALSE; - char req_fd[MAX_FD_LEN]; - char ack_fd[MAX_FD_LEN]; - (void)prctl(PR_SET_PDEATHSIG, SIGKILL); - int32 ret = snprintf_s(req_fd, sizeof(req_fd), sizeof(req_fd) - 1, "%d", perctrl->req_pipe.rfd); - PRTS_RETURN_IFERR(ret); - ret = snprintf_s(ack_fd, sizeof(ack_fd), sizeof(ack_fd) - 1, "%d", perctrl->res_pipe.wfd); - PRTS_RETURN_IFERR(ret); - - (void)close(perctrl->res_pipe.rfd); - (void)close(perctrl->req_pipe.wfd); - - if (execlp("perctrl", "perctrl", req_fd, ack_fd, NULL) == -1) { - LOG_DEBUG_ERR("execl pertctrl fail."); + char buf[MAX_PACKET_LEN]; + PRTS_RETURN_IFERR(snprintf_s(buf, MAX_PACKET_LEN, MAX_PACKET_LEN - 1, "%d|%d|%s|%u|%u|%llu|%u|%u", perctrl->req_pipe.rfd, perctrl->res_pipe.wfd, + parent_log_param->log_home, parent_log_param->log_level, parent_log_param->log_backup_file_count, parent_log_param->max_log_file_size, parent_log_param->log_file_permissions, parent_log_param->log_path_permissions)); + if (execlp("perctrl", "perctrl", buf, NULL) == -1) { + LOG_RUN_ERR("execl pertctrl fail."); exit(1); // exit child process } cm_sleep(wait_time); return CM_SUCCESS; } - + LOG_DEBUG_INF("Succeed to fork perctrl, pid:%d.", perctrl->pid); (void)close(perctrl->req_pipe.rfd); (void)close(perctrl->res_pipe.wfd); return CM_SUCCESS; @@ -240,7 +232,7 @@ int32 perctrl_register_impl(const char *iof_dev, int64 sark, perctrl_packet_t *r (void)ddes_get_int32(ack, &errcode); (void)ddes_get_str(ack, &errmsg); CM_THROW_ERROR_EX(errcode, "%s", errmsg); - LOG_DEBUG_ERR("[PERCTRL]rgister failed, result:%d, %s.", ack->head->result, errmsg); + LOG_RUN_ERR("[PERCTRL]rgister failed, result:%d, %s.", ack->head->result, errmsg); return ack->head->result; } @@ -272,7 +264,7 @@ int32 perctrl_unregister_impl(const char *iof_dev, int64 rk, perctrl_packet_t *r (void)ddes_get_int32(ack, &errcode); (void)ddes_get_str(ack, &errmsg); CM_THROW_ERROR_EX(errcode, "%s", errmsg); - LOG_DEBUG_ERR("[PERCTRL]unrgister failed, result:%d, %s.", ack->head->result, errmsg); + LOG_RUN_ERR("[PERCTRL]unrgister failed, result:%d, %s.", ack->head->result, errmsg); return ack->head->result; } @@ -304,7 +296,7 @@ status_t perctrl_reserve_impl(const char *iof_dev, int64 rk, perctrl_packet_t *r (void)ddes_get_int32(ack, &errcode); (void)ddes_get_str(ack, &errmsg); CM_THROW_ERROR_EX(errcode, "%s", errmsg); - LOG_DEBUG_ERR("[PERCTRL]reverse failed, result:%d, %s.", ack->head->result, errmsg); + LOG_RUN_ERR("[PERCTRL]reverse failed, result:%d, %s.", ack->head->result, errmsg); return ack->head->result; } @@ -336,7 +328,7 @@ status_t perctrl_release_impl(const char *iof_dev, int64 rk, perctrl_packet_t *r (void)ddes_get_int32(ack, &errcode); (void)ddes_get_str(ack, &errmsg); CM_THROW_ERROR_EX(errcode, "%s", errmsg); - LOG_DEBUG_ERR("[PERCTRL]release failed, result:%d, %s.", ack->head->result, errmsg); + LOG_RUN_ERR("[PERCTRL]release failed, result:%d, %s.", ack->head->result, errmsg); return ack->head->result; } @@ -400,7 +392,7 @@ status_t perctrl_preempt_impl(const char *iof_dev, int64 rk, int64 sark, perctrl (void)ddes_get_int32(ack, &errcode); (void)ddes_get_str(ack, &errmsg); CM_THROW_ERROR_EX(errcode, "%s", errmsg); - LOG_DEBUG_ERR("[PERCTRL]preempt failed, result:%d, %s.", ack->head->result, errmsg); + LOG_RUN_ERR("[PERCTRL]preempt failed, result:%d, %s.", ack->head->result, errmsg); return ack->head->result; } diff --git a/src/ddes_perctrl/service/ddes_perctrl_server.c b/src/ddes_perctrl/service/ddes_perctrl_server.c index a5d44d4..f7ed933 100644 --- a/src/ddes_perctrl/service/ddes_perctrl_server.c +++ b/src/ddes_perctrl/service/ddes_perctrl_server.c @@ -23,6 +23,7 @@ */ #include "cm_signal.h" +#include "cm_timer.h" #include "ddes_perctrl_server.h" #include @@ -32,9 +33,18 @@ static int req_fd = 0; static int ack_fd = 0; #define PERCTRL_ALIGN_SIZE (uint32)512 +#define PERCTRL_ARG_REQ_COUNT_0 0 +#define PERCTRL_ARG_ACK_COUNT_1 1 +#define PERCTRL_ARG_LOG_HOME_COUNT_2 2 +#define PERCTRL_ARG_LOG_LEVEL_COUNT_3 3 +#define PERCTRL_ARG_LOG_BACK_FILE_COUNT_4 4 +#define PERCTRL_ARG_LOG_SIZE_COUNT_5 5 +#define PERCTRL_ARG_LOG_FILE_PERMISS_COUNT_6 6 +#define PERCTRL_ARG_LOG_PATH_PERMISS_COUNT_7 7 +#define PERCTRL_ARG_COUNT 8 + #define PERCTRL_ARG_COUNT_1 1 #define PERCTRL_ARG_COUNT_2 2 -#define PERCTRL_ARG_COUNT_3 3 #define PERCTRL_IO_PROTOCOL_SCSI3 0 #define PERCTRL_IO_PROTOCOL_NVME 1 @@ -98,7 +108,7 @@ int32 exec_scsi3_register(perctrl_packet_t *req, perctrl_packet_t *ack) CM_RETURN_IFERR(ddes_get_int64(req, &sark)); CM_RETURN_IFERR(ddes_open_iof_dev(iof_dev, &fd)); int32 ret = cm_scsi3_register(fd, sark); - LOG_DEBUG_INF("Exec register ret %d.\n", ret); + LOG_RUN_INF("Exec register ret %d, iof_dev: %s, sark: %lld, fd: %d.", ret, iof_dev, sark, fd); (void)close(fd); return ret; } @@ -114,7 +124,7 @@ int32 exec_scsi3_unregister(perctrl_packet_t *req, perctrl_packet_t *ack) CM_RETURN_IFERR(ddes_open_iof_dev(iof_dev, &fd)); int32 ret = cm_scsi3_unregister(fd, rk); (void)close(fd); - LOG_DEBUG_INF("Exec unregister ret %d.\n", ret); + LOG_RUN_INF("Exec unregister ret %d, iof_dev: %s, rk: %lld, fd: %d.", ret, iof_dev, rk, fd); return ret; } @@ -129,7 +139,7 @@ int32 exec_scsi3_reserve(perctrl_packet_t *req, perctrl_packet_t *ack) CM_RETURN_IFERR(ddes_open_iof_dev(iof_dev, &fd)); status_t ret = cm_scsi3_reserve(fd, rk); (void)close(fd); - LOG_DEBUG_INF("Exec reserve ret %d.\n", ret); + LOG_RUN_INF("Exec reserve ret %d, iof_dev: %s, rk: %lld, fd: %d.", ret, iof_dev, rk, fd); return ret; } @@ -144,7 +154,7 @@ int32 exec_scsi3_release(perctrl_packet_t *req, perctrl_packet_t *ack) CM_RETURN_IFERR(ddes_open_iof_dev(iof_dev, &fd)); status_t ret = cm_scsi3_release(fd, rk); (void)close(fd); - LOG_DEBUG_INF("Exec release ret %d.\n", ret); + LOG_RUN_INF("Exec release ret %d, iof_dev: %s, rk: %lld, fd: %d.", ret, iof_dev, rk, fd); return ret; } @@ -159,7 +169,7 @@ int32 exec_scsi3_clear(perctrl_packet_t *req, perctrl_packet_t *ack) CM_RETURN_IFERR(ddes_open_iof_dev(iof_dev, &fd)); status_t ret = cm_scsi3_clear(fd, rk); (void)close(fd); - LOG_DEBUG_INF("Exec clear ret %d.\n", ret); + LOG_RUN_INF("Exec clear ret %d.\n", ret); return ret; } @@ -176,7 +186,7 @@ int32 exec_scsi3_preempt(perctrl_packet_t *req, perctrl_packet_t *ack) CM_RETURN_IFERR(ddes_open_iof_dev(iof_dev, &fd)); status_t ret = cm_scsi3_preempt(fd, rk, sark); (void)close(fd); - LOG_DEBUG_INF("Exec preempt ret %d.\n", ret); + LOG_RUN_INF("Exec preempt ret %d, iof_dev: %s, rk: %lld, sark: %lld, fd: %d.", ret, iof_dev, rk, sark, fd); return ret; } @@ -743,6 +753,7 @@ static status_t exec_perctrl_req(perctrl_packet_t *req, perctrl_packet_t *ack) req->head = (perctrl_cmd_head_t *)req->buf; int32 cmd = (int32)req->head->cmd; + LOG_DEBUG_INF("Receive command : %d", cmd); if (cmd == PERCTRL_CMD_EXIT) { exit(1); } @@ -812,6 +823,78 @@ static int32 perctrl_proc() } #endif +status_t perctrl_init_loggers(cm_log_def_t *log_def, uint32 log_def_count, char *name) +{ + log_param_t *log_param = cm_log_param_instance(); + char file_name[CM_MAX_PATH_LEN]; + uint32 len = CM_MAX_PATH_LEN; + int32 ret; + status_t status; + for (size_t i = 0; i < log_def_count; i++) { + ret = snprintf_s(file_name, len, (len - 1), "%s/%s", log_param->log_home, log_def[i].log_filename); + if (ret == -1) { + CM_RETURN_IFERR_EX(CM_ERROR, (void)printf("Failed to copy, log_home:%s, filename:%s.\n", log_param->log_home, log_def[i].log_filename)); + } + status = cm_log_init(log_def[i].log_id, file_name); + CM_RETURN_IFERR_EX(status, (void)printf("Failed to init %u log def.\n", (uint32)i)); + cm_log_open_compress(log_def[i].log_id, CM_TRUE); + } + log_param->log_instance_startup = CM_TRUE; + cm_init_error_handler(cm_set_log_error); + status = cm_set_log_module_name(name, (int32)strlen(name)); + CM_RETURN_IFERR_EX(status, (void)printf("Failed to set module name %s.\n", name)); + errno_t rc = strcpy_sp(log_param->instance_name, CM_MAX_NAME_LEN, name); + if (rc != EOK) { + (void)printf("Failed to copy instance_name %s.\n", name); + return CM_ERROR; + } + log_param->log_compressed = CM_TRUE; + log_param->log_compress_buf = malloc(CM_LOG_COMPRESS_BUFSIZE); + if (log_param->log_compress_buf == NULL) { + (void)printf("Failed to alloc log_compress_buf.\n"); + return CM_ERROR; + } + return CM_SUCCESS; +} + +status_t perctrl_parse_args(char *buf, uint32 i) +{ + log_param_t *log_param = cm_log_param_instance(); + status_t status = CM_ERROR; + switch (i) { + case PERCTRL_ARG_REQ_COUNT_0: + status = cm_str2int(buf, &req_fd); + CM_RETURN_IFERR_EX(status, (void)printf("The value of req_fd is invalid.\n")); + break; + case PERCTRL_ARG_ACK_COUNT_1: + status = cm_str2int(buf, &ack_fd); + CM_RETURN_IFERR_EX(status, (void)printf("The value of ack_fd is invalid.\n")); + break; + case PERCTRL_ARG_LOG_HOME_COUNT_2: + MEMS_RETURN_IFERR(memcpy_s(log_param->log_home, CM_MAX_LOG_HOME_LEN, buf, strlen(buf))); + break; + case PERCTRL_ARG_LOG_LEVEL_COUNT_3: + status = cm_str2uint32(buf, (uint32 *)&log_param->log_level); + CM_RETURN_IFERR_EX(status, (void)printf("The value of log_level is invalid.\n")); + case PERCTRL_ARG_LOG_BACK_FILE_COUNT_4: + status = cm_str2uint32(buf, (uint32 *)&log_param->log_backup_file_count); + CM_RETURN_IFERR_EX(status, (void)printf("The value of log_backup_file_count is invalid.\n")); + case PERCTRL_ARG_LOG_SIZE_COUNT_5: + status = cm_str2bigint(buf, (int64 *)&log_param->max_log_file_size); + CM_RETURN_IFERR_EX(status, (void)printf("The value of max_log_file_size is invalid.\n")); + case PERCTRL_ARG_LOG_FILE_PERMISS_COUNT_6: + status = cm_str2uint32(buf, (uint32 *)&log_param->log_file_permissions); + CM_RETURN_IFERR_EX(status, (void)printf("The value of log_file_permissions is invalid.\n")); + case PERCTRL_ARG_LOG_PATH_PERMISS_COUNT_7: + status = cm_str2uint32(buf, (uint32 *)&log_param->log_path_permissions); + CM_RETURN_IFERR_EX(status, (void)printf("The value of log_path_permissions is invalid.\n")); + default: + (void)printf("Invalid perctrl argument.\n"); + break; + } + return status; +} + int main(int argc, char **argv) { #ifndef WIN32 @@ -827,15 +910,33 @@ int main(int argc, char **argv) return CM_ERROR; } - if (argc != PERCTRL_ARG_COUNT_3) { + if (argc != PERCTRL_ARG_COUNT_2) { (void)printf("Invalid parameters count:%d.\n", argc); - (void)printf("perctrl \n"); + (void)printf("except perctrl \n"); return CM_ERROR; } - - req_fd = atoi(argv[PERCTRL_ARG_COUNT_1]); - ack_fd = atoi(argv[PERCTRL_ARG_COUNT_2]); - return perctrl_proc(); + status_t status = cm_start_timer(g_timer()); + CM_RETURN_IFERR_EX(status, (void)printf("Perctrl aborted due to starting timer thread.\n")); + char *buf = argv[PERCTRL_ARG_COUNT_1]; + char *next_info = NULL; + uint32 i = 0; + // %d|%d|%s|%u|%u|%llu|%u|%u + char *temp = strtok_s(buf, "|", &next_info); + while (temp != NULL) { + CM_RETURN_IFERR(perctrl_parse_args(temp, i)); + temp = strtok_s(NULL, "|", &next_info); + i++; + } + if (i != PERCTRL_ARG_COUNT) { + (void)printf("Invalid split parameters count:%u.\n", i); + (void)printf("except perctrl \n"); + return CM_ERROR; + } + status = perctrl_init_loggers(g_perctrl_log, sizeof(g_perctrl_log) / sizeof(cm_log_def_t), "perctrl"); + CM_RETURN_IFERR_EX(status, (void)printf("Failed to init loggers.\n")); + status = perctrl_proc(); + CM_FREE_PTR(cm_log_param_instance()->log_compress_buf); + return status; #else return CM_SUCCESS; #endif diff --git a/src/ddes_perctrl/service/ddes_perctrl_server.h b/src/ddes_perctrl/service/ddes_perctrl_server.h index d969ce8..f23080e 100644 --- a/src/ddes_perctrl/service/ddes_perctrl_server.h +++ b/src/ddes_perctrl/service/ddes_perctrl_server.h @@ -34,4 +34,14 @@ typedef struct st_perctrl_cmd_hdl { cmd_executor_t exec[2]; } perctrl_cmd_hdl_t; +typedef struct st_cm_log_def_t { + log_type_t log_id; + char log_filename[CM_MAX_NAME_LEN]; +} cm_log_def_t; + +cm_log_def_t g_perctrl_log[] = { + {LOG_DEBUG, "debug/perctrl.dlog"}, + {LOG_RUN, "run/perctrl.rlog"}, +}; + #endif -- Gitee