secgateway/Platform/user/ulog/log-sched/sev_sched.c

168 lines
3.8 KiB
C
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <errno.h>
#include <signal.h>
#include <event2/event-config.h>
#include <event2/event.h>
#include "log_common.h"
#include "ulog_api.h"
#define SEV_EVENT_TIMEOUT 1
#define SEV_CMD "systemctl restart rsyslog"
static struct event_base* g_ev_base = NULL;
static struct event *g_ev_exit = NULL;
static struct event *g_ev_sev = NULL;
static void signal_exit(evutil_socket_t fd, short event, void *arg)
{
struct event *signal = arg;
ULOG_DEBUG(g_log, "%s: got signal %d\n", __FUNCTION__, event_get_signal(signal));
event_del(signal);
}
static void sev_restart(evutil_socket_t fd, short event, void *arg)
{
struct event *signal = arg;
ULOG_DEBUG(g_log, "%s: got signal %d\n", __FUNCTION__, event_get_signal(signal));
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);
break;
}
END:
if (pp != NULL) {
pclose(pp);
}
event_del(signal);
}
int called = 0;
static void
signal_cb(evutil_socket_t fd, short event, void *arg)
{
struct event *signal = arg;
printf("signal_cb: got signal %d\n", event_get_signal(signal));
if (called >= 2)
event_del(signal);
called++;
}
int log_sev_init()
{
ULOG_INFO(g_log, "Log service is initiating");
g_ev_base = event_base_new();
if (g_ev_base == NULL) {
ULOG_ERR(g_log, "Allacting event base is failure");
goto FAIL;
}
g_ev_exit = evsignal_new(g_ev_base, SIGINT, signal_exit, event_self_cbarg());
if (g_ev_exit == NULL) {
ULOG_ERR(g_log, "Allacting singal of event exit is failure");
goto FAIL;
}
/*
g_ev_sev = evsignal_new(g_ev_base, -1, sev_restart, event_self_cbarg());
if (g_ev_sev == NULL) {
ULOG_ERR(g_log, "Allacting singal of event service is failure");
goto FAIL;
}
*/
//struct timeval tv = {SEV_EVENT_TIMEOUT, 0};
if (event_add(g_ev_exit, NULL) != 0) {
ULOG_ERR(g_log, "Adding event exit is failure");
goto FAIL;
}
ULOG_INFO(g_log, "Log service which is initited is success");
return 0;
FAIL:
log_sev_free();
ULOG_ERR(g_log, "Log service which is initited is failure");
return -1;
}
int log_sev_wait()
{
int ret = event_base_dispatch(g_ev_base);
if (ret == -1) {
ULOG_ERR(g_log, "service waiting is failure");
} else if (ret == 1) {
ULOG_INFO(g_log, "No events were registered");
}
return ret;
}
int log_sev_exit()
{
if (g_ev_exit == NULL) {
ULOG_WARNING(g_log, "Event exit was initiated");
return -1;
}
event_active(g_ev_exit, 0, 0);
return 0;
}
int log_sev_free()
{
if (g_ev_sev != NULL) {
event_free(g_ev_sev);
g_ev_sev = NULL;
}
if (g_ev_exit != NULL) {
event_free(g_ev_exit);
g_ev_exit = NULL;
}
if (g_ev_base != NULL) {
event_base_free(g_ev_base);
g_ev_base = NULL;
}
}
int log_sev_restart()
{
if (g_ev_sev == NULL) {
ULOG_WARNING(g_log, "Event service was initiated");
return -1;
}
// 如果pending就不需要添加事件
if (event_pending(g_ev_sev, 0, NULL)) {
ULOG_DEBUG(g_log, "Not need set event service");
return 0;
}
struct timeval tv = {SEV_EVENT_TIMEOUT, 0};
if (event_add(g_ev_sev, NULL) != 0) {
ULOG_ERR(g_log, "Setting event service is failure");
return -1;
}
ULOG_DEBUG(g_log, "Setting event service is success");
return 0;
}