Add aaa-12 callback and schedule rsyslog service

RCA:
SOL:
修改人:zhangtao
检视人:
This commit is contained in:
zhangtaohz 2019-08-16 15:49:28 +08:00
parent 8da634826a
commit 81707f4425
6 changed files with 134 additions and 90 deletions

View File

@ -10,10 +10,9 @@
#define FILTER_CONTENT ":msg,contains,\""MODULE_FMT"\"\n"
static int copy_file(const char *src, const char *dst)
{
//return -1;
int ret = -1;
FILE *src_fp = NULL,*dst_fp = NULL;
src_fp = fopen(src, "r");
@ -63,12 +62,12 @@ static int __log_conf(const char *mode, const u8 level, const char *conf_path, c
u8 exist_backup = 1;
/********** rsyslog configure **********/
char conf_path_file[MAX_PATH_SZ];
snprintf(conf_path_file, sizeof(conf_path_file), "%s%s", conf_path, conf_file);
char conf_path_file[MAX_PATH_SZ], bak_file[MAX_PATH_SZ];
char bak_file[MAX_PATH_SZ];
snprintf(conf_path_file, sizeof(conf_path_file), "%s%s", conf_path, conf_file);
snprintf(bak_file, sizeof(bak_file), BAK_FILE, conf_file);
//if (rename(conf_path_file, bak_file) < 0)
//if (rename(conf_path_file, bak_file) < 0) {
if (copy_file(conf_path_file, bak_file) != 0) {
if (errno == ENOENT) {
exist_backup = 0;
@ -229,30 +228,40 @@ int log_off_with_file(const char *path, const char *file_name)
return ret;
}
void rpc_conf_proc(rpc_conn *conn, pointer input, int input_len, int need_len, rpc_cb cb)
void rpc_conf_proc(rpc_conn *conn, pointer input, int input_len, int need_len, rpc_cb cb, void *arg)
{
char str_err[1024];
if (input == NULL) {
strncpy(str_err, "Input is not null", sizeof(str_err));
ULOG_WARNING(g_log, str_err);
goto FAIL;
}
if (input_len < need_len) {
if (snprintf(str_err, sizeof(str_err),
"The input paramter of rpc log is needed length of %u, but the actual length is %u",
need_len, input_len) < 0) {
ULOG_ERR(g_log, "Setting error to string is failure");
return;
strncpy(str_err, "Setting error message is failure", sizeof(str_err));
ULOG_ERR(g_log, str_err);
} else {
ULOG_WARNING(g_log, str_err);
}
ULOG_WARNING(g_log, str_err);
goto FAIL;
}
if (cb(input, str_err, sizeof(str_err)) != 0) {
// ret == 1,不需要重启服务;ret == 0需要重启服务
int ret = cb(input, arg, str_err, sizeof(str_err));
if (ret < 0) {
ULOG_ERR(g_log, str_err);
goto FAIL;
}
if (log_sev_restart() != 0) {
if ((ret == 0) && (log_sev_restart() != 0)) {
if (snprintf(str_err, sizeof(str_err),
"Restarting log service is failure") < 0) {
ULOG_ERR(g_log, "Setting error to string is failure");
return;
strncpy(str_err, "Setting error message is failure", sizeof(str_err));
ULOG_ERR(g_log, str_err);
}
goto FAIL;
}

View File

@ -15,13 +15,12 @@
#define REDIRECT_SEPERATE " "
typedef int (*rpc_cb)(const void *arg, char *str_err, int str_len);
typedef int (*rpc_cb)(pointer *input, const void *arg, char *str_err, int str_len);
extern ulog_t *g_log;
extern FILE *g_conf_fp;
extern char g_conf_file[MAX_PATH_SZ];
int log_conf(const u8 level, const char *conf_path, const char *conf_file, const char *filter_mod,
int (*cb_content)(FILE *fp, const u8 level, const char *filter_mod, void *arg), void *arg);
int log_conf_append(const u8 level, const char *conf_path, const char *conf_file, const char *filter_mod,
@ -30,6 +29,6 @@ int write_conf_content(FILE *fp, const u8 level, const char *filter_mod, void *a
int write_conf_content_authorizing(FILE *fp, const u8 level, const char *filter_mod, void *arg);
int log_level_to_str(const u8 level, char *str, u32 len);
int log_off_with_file(const char *path, const char *file_name);
void rpc_conf_proc(rpc_conn *conn, pointer input, int input_len, int need_len, rpc_cb cb);
void rpc_conf_proc(rpc_conn *conn, pointer input, int input_len, int need_len, rpc_cb cb, void *arg);
#endif

View File

@ -78,9 +78,9 @@ static int config_log_console(const log_console_t *conf)
return ret;
}
static int __rpc_conf_log_console(const void *arg, char *str_err, int str_len)
static int __rpc_conf_log_console(pointer input, const void *arg, char *str_err, int str_len)
{
if (config_log_console((const log_console_t *)arg) != 0) {
if (config_log_console((const log_console_t *)input) != 0) {
strncpy(str_err, "Configuring console of log is faiure", str_len);
return -1;
}
@ -90,7 +90,7 @@ static int __rpc_conf_log_console(const void *arg, char *str_err, int str_len)
void rpc_conf_log_console(rpc_conn *conn, pointer input, int input_len, pointer data)
{
rpc_conf_proc(conn, input, input_len, sizeof(log_console_t), __rpc_conf_log_console);
rpc_conf_proc(conn, input, input_len, sizeof(log_console_t), __rpc_conf_log_console, NULL);
/*
u32 need_len = sizeof(log_console_t);

View File

@ -76,21 +76,17 @@ static int config_log_pty(const log_pty_t *conf)
return ret;
}
void rpc_conf_log_pty(rpc_conn *conn, pointer input, int input_len, pointer data)
static int __rpc_conf_log_pty(pointer input, const void *arg, char *str_err, int str_len)
{
u32 need_len = sizeof(log_pty_t);
if (input_len < need_len) {
ULOG_WARNING(g_log,
"The input paramter of rpc log pty is needed length of %u, but the actual length is %u",
need_len, input_len);
return;
}
if (config_log_pty((const log_pty_t *)input) != 0) {
ULOG_ERR(g_log, "Configuring pty of log is faiure");
rpc_return_error(conn, RET_ERR, "Configuring pty of log is faiure");
return;
strncpy(str_err, "Configuring pty of log is faiure", str_len);
return -1;
}
rpc_return_null(conn);
return 0;
}
void rpc_conf_log_pty(rpc_conn *conn, pointer input, int input_len, pointer data)
{
rpc_conf_proc(conn, input, input_len, sizeof(log_pty_t), __rpc_conf_log_pty, NULL);
}

View File

@ -1,4 +1,5 @@
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
@ -39,12 +40,6 @@ static int match_remote_config(const char *line, const void *src)
ULOG_DEBUG(g_log, "The line:%s will be matched", line);
n = sscanf(line, "%s"REDIRECT_SEPERATE"%s", text_level, old_redirect);
if (errno != 0) {
// 错误发生
ULOG_ERR(g_log, "Parsing remote line is failure:%s", strerror(errno));
return -1;
}
if (n == 2) {
// 匹配到
// 是否相同配置判读
@ -52,6 +47,10 @@ static int match_remote_config(const char *line, const void *src)
if (strcmp(old_redirect, src) == 0) {
return 0;
}
} else if (n == EOF) {
// 错误发生
ULOG_ERR(g_log, "Parsing remote line is failure:%s", strerror(errno));
return -1;
} else {
// 未能识别行
ULOG_DEBUG(g_log, "The line:%s can't be parsed", line);
@ -68,6 +67,7 @@ static int remote_conf_content(FILE *fp, const u8 level, const char *filter_mod,
int ret = -1;
FILE *bak_fp = NULL;
char path[MAX_PATH_SZ];
char *line = NULL;
snprintf(path, sizeof(path), BAK_FILE, LOG_CONF_REMOTE_FILE_NAME);
bak_fp = fopen(path, "r");
if (bak_fp == NULL) {
@ -79,7 +79,7 @@ static int remote_conf_content(FILE *fp, const u8 level, const char *filter_mod,
}
}
char *line = NULL;
ssize_t n, n1;
char text_level[MAX_LINE_SZ], old_redirect[MAX_LINE_SZ];
while ((n = getline(&line, &n, bak_fp)) != -1) {
@ -98,7 +98,6 @@ static int remote_conf_content(FILE *fp, const u8 level, const char *filter_mod,
goto END;
}
}
FINAL_PHASE:
if (final_cb != NULL) {
if (final_cb(fp, level, filter_mod, arg) != 0) {
@ -124,7 +123,10 @@ static int remote_conf_level_content(FILE *fp, const u8 level)
int ret = -1;
FILE *bak_fp = NULL;
char path[MAX_PATH_SZ];
snprintf(path, sizeof(path), BAK_FILE, LOG_CONF_REMOTE_FILE_NAME);
if (snprintf(path, sizeof(path), BAK_FILE, LOG_CONF_REMOTE_FILE_NAME) < 0) {
ULOG_DEBUG(g_log, "[remote-level]:Buildbackup path(%s) is failure", BAK_FILE, LOG_CONF_REMOTE_FILE_NAME);
return -1;
}
bak_fp = fopen(path, "r");
if (bak_fp == NULL) {
ULOG_ERR(g_log, "Opening remote backup file:%s is failure:%s", path, strerror(errno));
@ -138,11 +140,6 @@ static int remote_conf_level_content(FILE *fp, const u8 level)
char rewrite_line[MAX_LINE_SZ];
while ((n1 = getline(&line, &n, bak_fp)) != -1) {
n3 = sscanf(line, "%s"REDIRECT_SEPERATE"%s", text_level, old_redirect);
if (errno != 0) {
// 错误发生
ULOG_ERR(g_log, "Parsing remote line is failure:%s", strerror(errno));
goto END;
}
if (n3 == 2) {
// 匹配到
// 改变该行日志级别
@ -155,6 +152,10 @@ static int remote_conf_level_content(FILE *fp, const u8 level)
strcat(rewrite_line, old_redirect);
strcat(rewrite_line, "\n");
n3 = strlen(rewrite_line);
} else if (n == EOF) {
// 错误发生
ULOG_ERR(g_log, "Parsing remote line is failure:%s", strerror(errno));
goto END;
} else {
// 未能识别行
ULOG_DEBUG(g_log, "The line:%s can't be parsed", line);
@ -176,7 +177,6 @@ END:
if (bak_fp != NULL) {
fclose(bak_fp);
}
return ret;
}
@ -206,14 +206,13 @@ static int get_log_level()
char *line = NULL;
u8 value;
while ((n1 = getline(&line, &n, g_conf_fp)) != -1) {
ULOG_DEBUG(g_log, "config file line:%s", line);
n2 = sscanf(line, LOG_CONF_KEY_REMOTE_LEVEL"%u", &value);
if (errno != 0) {
// 错误发生
ULOG_ERR(g_log, "Parsing level from configure is failure:%s", strerror(errno));
return -1;
}
if (n2 == 1) {
return value;
} else if (n2 == EOF) {
ULOG_ERR(g_log, "Parsing level from configure is failure:%s", strerror(errno));
return -1;
} else {
ULOG_DEBUG(g_log, "Unknown level row:%s", line);
}
@ -225,7 +224,7 @@ static int get_log_level()
static int add_remote_host(const log_remote_host_t *conf)
{
ULOG_INFO(g_log, "Adding remote log server[%s:%u], rfc is %s", conf->host, conf->port, rfc_tbl[conf->rfc].fmt);
char prefix[1] = "";
char prefix[2] = {0};
if (conf->rfc == LOG_RFC_5424) {
strcat(prefix, "@");
};
@ -242,6 +241,7 @@ static int add_remote_host(const log_remote_host_t *conf)
ULOG_ERR(g_log, "Getting log level is failure");
return -1;
}
if (log_conf(level, LOG_CONF_PATH, LOG_CONF_REMOTE_FILE_NAME, NULL,
add_remote_conf_content, (void *)redirect) != 0) {
ULOG_ERR(g_log, "Adding remote server[%s:%u:%s] is faulure", conf->host, conf->port, rfc_tbl[conf->rfc].fmt);
@ -317,20 +317,34 @@ static int config_log_remote_level(const log_remote_level_t *level)
}
fflush(g_conf_fp);
if (log_conf(level->level, LOG_CONF_PATH, LOG_CONF_REMOTE_FILE_NAME, NULL,
modify_remote_conf_log_level, NULL) != 0) {
ULOG_ERR(g_log, "Modifing log level:%u of remote server [%s:%u:%s] is faulure", level->level);
//判断是否有rsyslog的remote配置如果有才写入
char path[MAX_PATH_SZ];
if (snprintf(path, sizeof(path), BAK_FILE, LOG_CONF_REMOTE_FILE_NAME) < 0) {
ULOG_DEBUG(g_log, "Build backup path(%s) is failure", BAK_FILE, LOG_CONF_REMOTE_FILE_NAME);
return -1;
}
if(access(path, F_OK) != 0) {
ULOG_DEBUG(g_log, "Backup file:%s is not exist:%s", path, strerror(errno));
return 1;
} else {
if (log_conf(level->level, LOG_CONF_PATH, LOG_CONF_REMOTE_FILE_NAME, NULL,
modify_remote_conf_log_level, NULL) != 0) {
ULOG_ERR(g_log, "Modifing log level:%u of remote server is faulure", level->level);
return -1;
}
}
return 0;
}
static void rpc_conf_log_remote(const log_op_t op, rpc_conn *conn, pointer input, int input_len, pointer data)
{
char str_err[1024];
if (input == NULL) {
ULOG_WARNING(g_log, "Remote log configure can't null");
return;
strncpy(str_err, "Remote log configure can't be null", sizeof(str_err));
ULOG_WARNING(g_log, str_err);
goto FAIL;
}
u32 need_len = sizeof(log_remote_host_t);
@ -346,40 +360,51 @@ static void rpc_conf_log_remote(const log_op_t op, rpc_conn *conn, point
rpc_return_error(conn, RET_ERR, "Configuring remote of log is faiure");
return;
}
rpc_return_null(conn);
FAIL:
rpc_return_error(conn, RET_ERR, str_err);
}
static int __rpc_conf_log_remote(pointer input, const void *arg, char *str_err, int str_len)
{
log_op_t op;
memcpy(&op, arg, sizeof(op));
int ret = config_log_remote_host(op, (const log_remote_level_t *)input);
if (ret < 0) {
strncpy(str_err, "Configuring remote of log is faiure", str_len);
}
return ret;
}
void rpc_conf_log_add_remote(rpc_conn *conn, pointer input, int input_len, pointer data)
{
rpc_conf_log_remote(LOG_REMOTE_OP_ADD, conn, input, input_len, data);
//rpc_conf_log_remote(LOG_REMOTE_OP_ADD, conn, input, input_len, data);
log_op_t op = LOG_REMOTE_OP_ADD;
rpc_conf_proc(conn, input, input_len, sizeof(log_remote_host_t), __rpc_conf_log_remote, (void *)&op);
}
void rpc_conf_log_del_remote(rpc_conn *conn, pointer input, int input_len, pointer data)
{
rpc_conf_log_remote(LOG_REMOTE_OP_DEL, conn, input, input_len, data);
//rpc_conf_log_remote(LOG_REMOTE_OP_DEL, conn, input, input_len, data);
log_op_t op = LOG_REMOTE_OP_DEL;
rpc_conf_proc(conn, input, input_len, sizeof(log_remote_host_t), __rpc_conf_log_remote, (void *)&op);
}
static int __rpc_conf_log_remote_level(pointer input, const void *arg, char *str_err, int str_len)
{
int ret = config_log_remote_level((const log_remote_level_t *)input);
if (ret < 0) {
strncpy(str_err, "Configuring remote level of log is faiure", str_len);
}
return ret;
}
void rpc_conf_log_remote_level(rpc_conn *conn, pointer input, int input_len, pointer data)
{
if (input == NULL) {
ULOG_WARNING(g_log, "Remote log level can't null");
return;
}
u32 need_len = sizeof(log_remote_level_t);
if (input_len < need_len) {
ULOG_WARNING(g_log,
"The input paramter of rpc log remote level is needed length of %u, but the actual length is %u",
need_len, input_len);
return;
}
if (config_log_remote_level((const log_remote_level_t *)input) != 0) {
ULOG_ERR(g_log, "Configuring remote level of log is faiure");
rpc_return_error(conn, RET_ERR, "Configuring remote level of log is faiure");
return;
}
rpc_return_null(conn);
rpc_conf_proc(conn, input, input_len, sizeof(log_remote_level_t), __rpc_conf_log_remote_level, NULL);
}

View File

@ -8,8 +8,14 @@
#define SEV_TIMEOUT 1
#define SEV_CMD "systemctl restart rsyslog"
typedef enum {
SEV_STATE_RESTARTING,
SEV_STATE_WAIT
} sev_state_t;
static sem_t g_sem;
static int is_exit = 0;
static volatile int g_is_exit = 0;
static volatile sev_state_t g_sev_state = SEV_STATE_WAIT;
static void sev_restart()
{
@ -43,12 +49,15 @@ void sev_loop()
ULOG_ERR(g_log, "Waitting semaphore is failure:%s", strerror(errno));
break;
}
if (is_exit == 1) {
g_sev_state = SEV_STATE_RESTARTING;
if (g_is_exit == 1) {
ULOG_DEBUG(g_log, "Service loop is exit");
break;
}
sleep(SEV_TIMEOUT);
// 减少在短时间内频繁更改配置使重启变多,这里进行限制
sleep(SEV_TIMEOUT);
g_sev_state = SEV_STATE_WAIT;
sev_restart();
}
}
@ -75,7 +84,7 @@ static int set_sem()
int log_sev_exit()
{
is_exit = 1;
g_is_exit = 1;
set_sem();
sem_destroy(&g_sem);
@ -84,6 +93,7 @@ int log_sev_exit()
int log_sev_restart()
{
/*
int val;
if (sem_getvalue(&g_sem, &val) != 0) {
ULOG_ERR(g_log, "Get semaphore value is failure:%s", strerror(errno));
@ -94,6 +104,11 @@ int log_sev_restart()
ULOG_ERR(g_log, "Current semaphore value is %d, not need to set semaphore");
return 0;
}
*/
if (g_sev_state == SEV_STATE_RESTARTING) {
ULOG_DEBUG(g_log, "Current service state:%u, not need to set semaphore", g_sev_state);
return 0;
}
if (set_sem() != 0) {
return -1;