From 1cbd7e8deff52e2118626d2a6121d9929a8c5963 Mon Sep 17 00:00:00 2001 From: Dnomd343 Date: Thu, 22 Sep 2022 19:32:40 +0800 Subject: [PATCH] update: process manager module --- Dockerfile | 2 +- include/utils/process.h | 17 +++--- src/applet/adguard.c | 8 +-- src/cleardns.c | 14 ++--- src/utils/process.c | 125 ++++++++++++++++++---------------------- 5 files changed, 73 insertions(+), 93 deletions(-) diff --git a/Dockerfile b/Dockerfile index bdc8d66..fea61aa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -64,4 +64,4 @@ COPY --from=cleardns /tmp/toJSON /asset/usr/bin/ FROM ${ALPINE_IMG} COPY --from=asset /asset/ / -#ENTRYPOINT ["cleardns"] +ENTRYPOINT ["cleardns"] diff --git a/include/utils/process.h b/include/utils/process.h index 7a04f92..d3af671 100644 --- a/include/utils/process.h +++ b/include/utils/process.h @@ -4,21 +4,20 @@ #include typedef struct { - int pid; - char *name; - char **cmd; - char **env; - char *cwd; + int pid; // process id + char *name; // caption + char **cmd; // process command + char **env; // environment variable + char *cwd; // working directory } process; +extern process **process_list; + void process_list_run(); void process_list_init(); +void process_list_daemon(); void process_list_append(process *proc); void process_add_arg(process *proc, const char *arg); process* process_init(const char *caption, const char *bin); -#include -void process_exec(process *proc); -void process_list_daemon(); - #endif diff --git a/src/applet/adguard.c b/src/applet/adguard.c index 4fc1433..6aad475 100644 --- a/src/applet/adguard.c +++ b/src/applet/adguard.c @@ -88,13 +88,11 @@ process* adguard_load(adguard *info, const char *dir) { // load adguard options char *adguard_config_ret; char *adguard_config_file = string_join(dir, "AdGuardHome.yaml"); - // TODO: skip to-json if AdGuardHome configure not exist - - char *adguard_config_raw = to_json(adguard_config_file); - if (adguard_config_raw == NULL) { // configure not exist + if (!is_file_exist(adguard_config_file)) { // AdGuardHome configure not exist log_info("Create AdGuardHome configure"); adguard_config_ret = adguard_config(info, "{}"); // begin with empty json - } else { + } else { // configure exist -> modify + char *adguard_config_raw = to_json(adguard_config_file); adguard_config_ret = adguard_config(info, adguard_config_raw); free(adguard_config_raw); } diff --git a/src/cleardns.c b/src/cleardns.c index c1d63ef..3007db9 100644 --- a/src/cleardns.c +++ b/src/cleardns.c @@ -4,15 +4,15 @@ #include #include "loader.h" #include "logger.h" +#include "sundry.h" +#include "system.h" +#include "assets.h" +#include "adguard.h" +#include "crontab.h" #include "constant.h" #include "dnsproxy.h" #include "overture.h" -#include "adguard.h" -#include "system.h" -#include "sundry.h" #include "structure.h" -#include "assets.h" -#include "crontab.h" char* init(int argc, char *argv[]) { // return config file char *config = string_init(CONFIG_FILE); @@ -43,10 +43,8 @@ char* init(int argc, char *argv[]) { // return config file int main(int argc, char *argv[]) { // ClearDNS service char *config_file = init(argc, argv); - - LOG_LEVEL = LOG_DEBUG; - log_info("ClearDNS server start (%s)", VERSION); + create_folder(EXPOSE_DIR); create_folder(WORK_DIR); extract_assets(); load_config(config_file); diff --git a/src/utils/process.c b/src/utils/process.c index 93d7603..f099b96 100644 --- a/src/utils/process.c +++ b/src/utils/process.c @@ -1,17 +1,22 @@ #include #include #include -#include #include -//#include +#include +#include "logger.h" #include "sundry.h" #include "process.h" #include "constant.h" #include "structure.h" -#include "logger.h" process **process_list; +void get_sub_exit(); +void get_exit_signal(); +void server_exit(int exit_code); +void process_dump(process *proc); +void process_exec(process *proc); + process* process_init(const char *caption, const char *bin) { // init process struct process *proc = (process *)malloc(sizeof(process)); proc->pid = 0; // process not running @@ -23,104 +28,66 @@ process* process_init(const char *caption, const char *bin) { // init process st return proc; } -void process_add_arg(process *proc, const char *arg) { // add argument for process - string_list_append(&proc->cmd, arg); -} - -void process_list_init() { // init process list - process_list = (process **)malloc(sizeof(process *)); - *process_list = NULL; -} - -void process_list_append(process *proc) { // add new process into process list - int proc_num = 0; - for (process **p = process_list; *p != NULL; ++p, ++proc_num); // get process number - process_list = (process **)realloc(process_list, sizeof(process *) * (proc_num + 2)); - process_list[proc_num++] = proc; // add into process list - process_list[proc_num] = NULL; - log_debug("%s process added", proc->name); -} - -void server_exit(int exit_code) { // kill sub process and exit - log_info("Kill subprocess"); - - // TODO: kill subprocess and exit cleardns - - exit(exit_code); -} - -void get_exit_signal() { // get SIGINT or SIGTERM signal - log_info("Get exit signal"); - - server_exit(EXIT_NORMAL); -} - -void get_sub_exit() { // catch child process exit - - log_debug("Get SIGCHLD signal"); - - // TODO: check exit subprocess and restart it -} - -void process_list_run() { - - signal(SIGINT, get_exit_signal); // catch Ctrl + C (2) - signal(SIGTERM, get_exit_signal); // catch exit signal (15) - signal(SIGCHLD, get_sub_exit); // callback when child process die - - for (process **p = process_list; *p != NULL; ++p) { - - process_exec(*p); - - } - - log_warn("Process list start complete"); - -} - -void process_dump(process *proc) { +void process_dump(process *proc) { // output process options into debug log char *process_cmd = string_list_dump(proc->cmd); char *process_env = string_list_dump(proc->env); log_debug("%s cwd -> %s", proc->name, proc->cwd); log_debug("%s command -> %s", proc->name, process_cmd); log_debug("%s env variable -> %s", proc->name, process_env); -// log_debug("%s new group -> %s", proc->name, show_bool(proc->is_group)); free(process_env); free(process_cmd); } void process_exec(process *proc) { pid_t pid; - process_dump(proc); - log_info("%s start", proc->name); if ((pid = fork()) < 0) { // fork error log_perror("%s fork error", proc->name); server_exit(EXIT_FORK_ERROR); } else if (pid == 0) { // child process - - // TODO: new process group -// if (proc->is_group) { -// setpgrp(); // new process group -// } - if (chdir(proc->cwd)) { // change working directory log_perror("%s with invalid cwd `%s` -> ", proc->name, proc->cwd); exit(2); } - prctl(PR_SET_PDEATHSIG, SIGKILL); // child process die with father process if (execvpe(*(proc->cmd), proc->cmd, proc->env) < 0) { log_perror("%s exec error -> ", proc->name); exit(1); } } - proc->pid = pid; log_info("%s running success -> PID = %d", proc->name, proc->pid); +} +void process_add_arg(process *proc, const char *arg) { // add argument for process + string_list_append(&proc->cmd, arg); +} + +void process_list_init() { // init process list + process_list = (process **)malloc(sizeof(process *)); + *process_list = NULL; +} + +void process_list_append(process *proc) { // add new process into process list + int proc_num = 0; + for (process **p = process_list; *p != NULL; ++p, ++proc_num); // get process number + process_list = (process **)realloc(process_list, sizeof(process *) * (proc_num + 2)); + process_list[proc_num++] = proc; // add into process list + process_list[proc_num] = NULL; + log_debug("%s process added", proc->name); +} + +void process_list_run() { // start process list + signal(SIGINT, get_exit_signal); // catch Ctrl + C (2) + signal(SIGTERM, get_exit_signal); // catch exit signal (15) + signal(SIGCHLD, get_sub_exit); // callback when child process die + for (process **p = process_list; *p != NULL; ++p) { + process_exec(*p); + usleep(100 * 1000); // delay 100ms + } + log_info("Process start complete"); } void process_list_daemon() { @@ -128,3 +95,21 @@ void process_list_daemon() { wait(&status); } +void server_exit(int exit_code) { // kill sub process and exit + log_info("Kill subprocess"); + + // TODO: kill subprocess and exit cleardns + + exit(exit_code); +} + +void get_exit_signal() { // get SIGINT or SIGTERM signal + log_info("Get exit signal"); + server_exit(EXIT_NORMAL); +} + +void get_sub_exit() { // catch child process exit + log_debug("Get SIGCHLD signal"); + + // TODO: check exit subprocess and restart it +}