2019-08-15 06:04:17 +00:00
|
|
|
#include <errno.h>
|
|
|
|
#include <signal.h>
|
2019-08-15 09:17:12 +00:00
|
|
|
#include <semaphore.h>
|
2019-08-15 06:04:17 +00:00
|
|
|
|
|
|
|
#include "log_common.h"
|
|
|
|
#include "ulog_api.h"
|
|
|
|
|
2019-08-15 09:17:12 +00:00
|
|
|
#define SEV_TIMEOUT 1
|
2019-08-15 06:04:17 +00:00
|
|
|
#define SEV_CMD "systemctl restart rsyslog"
|
|
|
|
|
2019-08-16 07:49:28 +00:00
|
|
|
typedef enum {
|
|
|
|
SEV_STATE_RESTARTING,
|
|
|
|
SEV_STATE_WAIT
|
|
|
|
} sev_state_t;
|
|
|
|
|
2019-08-15 09:17:12 +00:00
|
|
|
static sem_t g_sem;
|
2019-08-16 07:49:28 +00:00
|
|
|
static volatile int g_is_exit = 0;
|
|
|
|
static volatile sev_state_t g_sev_state = SEV_STATE_WAIT;
|
2019-08-15 06:04:17 +00:00
|
|
|
|
2019-08-15 09:17:12 +00:00
|
|
|
static void sev_restart()
|
2019-08-15 06:04:17 +00:00
|
|
|
{
|
2019-08-15 09:17:12 +00:00
|
|
|
ULOG_DEBUG(g_log, "Log service is restarting");
|
2019-08-15 06:04:17 +00:00
|
|
|
|
|
|
|
FILE *pp = popen(SEV_CMD, "r");
|
|
|
|
if (pp == NULL) {
|
|
|
|
ULOG_ERR(g_log, "Open cmd:%s is failure:%s", SEV_CMD, strerror(errno));
|
|
|
|
goto END;
|
|
|
|
}
|
|
|
|
|
|
|
|
char buff[256];
|
|
|
|
while(fread(buff, 1, sizeof(buff), pp) > 0)
|
|
|
|
{
|
|
|
|
ULOG_ERR(g_log, "Executing cmd:%s is failure, response content is %s", SEV_CMD, buff);
|
2019-08-15 09:17:12 +00:00
|
|
|
goto END;
|
2019-08-15 06:04:17 +00:00
|
|
|
}
|
2019-08-15 09:17:12 +00:00
|
|
|
ULOG_INFO(g_log, "Restarting log service is success");
|
2019-08-15 06:04:17 +00:00
|
|
|
|
|
|
|
END:
|
|
|
|
if (pp != NULL) {
|
|
|
|
pclose(pp);
|
|
|
|
}
|
2019-08-15 09:17:12 +00:00
|
|
|
//event_del(signal);
|
2019-08-15 06:04:17 +00:00
|
|
|
}
|
|
|
|
|
2019-08-15 09:17:12 +00:00
|
|
|
void sev_loop()
|
2019-08-15 06:04:17 +00:00
|
|
|
{
|
2019-08-15 09:17:12 +00:00
|
|
|
while (1) {
|
|
|
|
if (sem_wait(&g_sem) != 0) {
|
|
|
|
ULOG_ERR(g_log, "Waitting semaphore is failure:%s", strerror(errno));
|
|
|
|
break;
|
|
|
|
}
|
2019-08-16 07:49:28 +00:00
|
|
|
g_sev_state = SEV_STATE_RESTARTING;
|
|
|
|
if (g_is_exit == 1) {
|
2019-08-15 09:17:12 +00:00
|
|
|
ULOG_DEBUG(g_log, "Service loop is exit");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2019-08-16 07:49:28 +00:00
|
|
|
// 减少在短时间内频繁更改配置使重启变多,这里进行限制
|
|
|
|
sleep(SEV_TIMEOUT);
|
|
|
|
g_sev_state = SEV_STATE_WAIT;
|
2019-08-15 09:17:12 +00:00
|
|
|
sev_restart();
|
|
|
|
}
|
2019-08-15 06:04:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int log_sev_init()
|
|
|
|
{
|
|
|
|
ULOG_INFO(g_log, "Log service is initiating");
|
2019-08-15 09:17:12 +00:00
|
|
|
if (sem_init(&g_sem, 0, 0) != 0) {
|
|
|
|
ULOG_ERR(g_log, "Init sem is failure:%s", strerror(errno));
|
|
|
|
return -1;
|
2019-08-15 06:04:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2019-08-15 09:17:12 +00:00
|
|
|
static int set_sem()
|
2019-08-15 06:04:17 +00:00
|
|
|
{
|
2019-08-15 09:17:12 +00:00
|
|
|
if (sem_post(&g_sem) == -1) {
|
|
|
|
ULOG_ERR(g_log, "Posting semaphore is failure:%s", strerror(errno));
|
2019-08-15 06:04:17 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2019-08-15 09:17:12 +00:00
|
|
|
int log_sev_exit()
|
2019-08-15 06:04:17 +00:00
|
|
|
{
|
2019-08-16 07:49:28 +00:00
|
|
|
g_is_exit = 1;
|
2019-08-15 09:17:12 +00:00
|
|
|
set_sem();
|
|
|
|
sem_destroy(&g_sem);
|
2019-08-15 06:04:17 +00:00
|
|
|
|
2019-08-15 09:17:12 +00:00
|
|
|
return 0;
|
2019-08-15 06:04:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int log_sev_restart()
|
|
|
|
{
|
2019-08-16 07:49:28 +00:00
|
|
|
/*
|
2019-08-15 09:17:12 +00:00
|
|
|
int val;
|
|
|
|
if (sem_getvalue(&g_sem, &val) != 0) {
|
|
|
|
ULOG_ERR(g_log, "Get semaphore value is failure:%s", strerror(errno));
|
2019-08-15 06:04:17 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2019-08-15 09:17:12 +00:00
|
|
|
if (val > 0) {
|
|
|
|
ULOG_ERR(g_log, "Current semaphore value is %d, not need to set semaphore");
|
2019-08-15 06:04:17 +00:00
|
|
|
return 0;
|
2019-08-16 07:49:28 +00:00
|
|
|
}
|
|
|
|
*/
|
|
|
|
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;
|
|
|
|
}
|
2019-08-15 06:04:17 +00:00
|
|
|
|
2019-08-15 09:17:12 +00:00
|
|
|
if (set_sem() != 0) {
|
2019-08-15 06:04:17 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|