cluster.c (2780B)
1 #include "domain/cluster/cluster.h" 2 3 #include <fcntl.h> 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <string.h> 7 #include <sys/stat.h> 8 #include <unistd.h> 9 10 #include "../common.h" 11 #include "cofyc/argparse.h" 12 #include "common/resp.h" 13 #include "common/scheduler.h" 14 #include "domain/config.h" 15 #include "infrastructure/config.h" 16 #include "interface/api/server.h" 17 #include "rxi/log.h" 18 19 static void register_cluster_commands(void) { 20 api_register_domain_cmd("session.create", cluster_session_create); 21 api_register_domain_cmd("session.list", cluster_session_list); 22 api_register_domain_cmd("session.info", cluster_session_info); 23 api_register_domain_cmd("session.destroy", cluster_session_destroy); 24 api_register_domain_cmd("session.socket.create.listen", cluster_socket_create_listen); 25 api_register_domain_cmd("session.socket.create.connect", cluster_socket_create_connect); 26 api_register_domain_cmd("session.socket.destroy", cluster_socket_destroy); 27 api_register_domain_cmd("session.forward.list", cluster_forward_list); 28 api_register_domain_cmd("session.forward.create", cluster_forward_create); 29 api_register_domain_cmd("session.forward.destroy", cluster_forward_destroy); 30 api_register_domain_cmd("session.count", cluster_session_count); 31 api_register_domain_cmd("system.load", cluster_system_load); 32 log_info("cluster: registered session.* commands"); 33 } 34 35 static int do_daemonize(void) { 36 pid_t pid = fork(); 37 if (pid < 0) { 38 log_fatal("fork: %m"); 39 return -1; 40 } 41 if (pid > 0) _exit(0); 42 if (setsid() < 0) { 43 log_fatal("setsid: %m"); 44 _exit(1); 45 } 46 pid = fork(); 47 if (pid < 0) { 48 log_fatal("fork: %m"); 49 _exit(1); 50 } 51 if (pid > 0) _exit(0); 52 if (chdir("/") != 0) { 53 } 54 int fd; 55 for (fd = 0; fd < 3; fd++) (void)close(fd); 56 fd = open("/dev/null", O_RDWR); 57 if (fd >= 0) { 58 dup2(fd, STDIN_FILENO); 59 dup2(fd, STDOUT_FILENO); 60 dup2(fd, STDERR_FILENO); 61 if (fd > 2) close(fd); 62 } 63 return 0; 64 } 65 66 int cli_cmd_cluster(int argc, const char **argv) { 67 int daemonize_flag = 0; 68 int no_daemonize_flag = 0; 69 70 struct argparse argparse; 71 struct argparse_option options[] = { 72 OPT_HELP(), 73 OPT_BOOLEAN('d', "daemonize", &daemonize_flag, "run in background", NULL, 0, 0), 74 OPT_BOOLEAN('D', "no-daemonize", &no_daemonize_flag, "force foreground", NULL, 0, 0), 75 OPT_END(), 76 }; 77 argparse_init(&argparse, options, (const char *const[]){"udphole cluster", NULL}, ARGPARSE_STOP_AT_NON_OPTION); 78 argparse_parse(&argparse, argc, argv); 79 80 if (!no_daemonize_flag && daemonize_flag) { 81 do_daemonize(); 82 } 83 84 cluster_init(); 85 86 register_cluster_commands(); 87 88 log_info("udphole: starting cluster"); 89 90 sched_create(api_server_pt, NULL); 91 92 log_info("udphole: cluster started"); 93 94 return sched_main(); 95 }