udphole

Basic UDP wormhole proxy
git clone git://git.finwo.net/app/udphole
Log | Files | Refs | README | LICENSE

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 }