Changeset aace70f808787e6416462b9148cc6777dd2b0ec3

Show
Ignore:
Timestamp:
04/27/09 08:48:29 (3 years ago)
Author:
Neutron Soutmun <neo.neutron@…>
Children:
f1184f9058b0f965c8cada118eee1e542b26d70b
Parents:
94c9e9e68a52a85cada2842d74d51b9407ccf5b2
git-committer:
Neutron Soutmun <neo.neutron@…> (04/27/09 08:48:29)
Message:

Add config reloading

2009-04-27 Neutron Soutmun <neo.neutron@…>

  • src/rahunas.c, src/rh-config.h, src/rh-ipset.c, src/rh-server.{h,c}, src/rh-task-dbset.c, src/rh-task-ipset.c, src/rh-task-iptables.c, src/rh-task-memset.c:
    • Add config reloading by issue SIGHUP.
    • Adjust the tasks to the changes of config reloading.
  • example/rahunas.init.in:
    • Add reload function.
    • In restart command, try to start if the process is not running.
  • tools/firewall.sh.in: Add the KEEP_SET funtionality.
Files:
12 modified

Legend:

Unmodified
Added
Removed
  • ChangeLog

    r94c9e9e raace70f  
     12009-04-27  Neutron Soutmun <neo.neutron@gmail.com> 
     2 
     3        * src/rahunas.c, src/rh-config.h, src/rh-ipset.c, src/rh-server.{h,c}, 
     4          src/rh-task-dbset.c, src/rh-task-ipset.c, src/rh-task-iptables.c,  
     5          src/rh-task-memset.c: 
     6          - Add config reloading by issue SIGHUP. 
     7          - Adjust the tasks to the changes of config reloading. 
     8        * example/rahunas.init.in: 
     9          - Add reload function. 
     10          - In restart command, try to start if the process is not running. 
     11        * tools/firewall.sh.in: Add the KEEP_SET funtionality. 
     12 
    1132009-04-23  Neutron Soutmun <neo.neutron@gmail.com> 
    214 
  • example/rahunas.init.in

    r94c9e9e raace70f  
    7878} 
    7979 
     80reload () { 
     81  start-stop-daemon --stop --quiet --signal HUP \ 
     82    --pidfile $PID --name $NAME < /dev/null 
     83  sleep 2 
     84 
     85  if test -n "$PID" && kill -0 $PID 2>/dev/null 
     86  then 
     87    log_action_end_msg 0 
     88  else 
     89    log_action_end_msg 1 
     90  fi 
     91  return 0 
     92} 
     93 
    8094case "$1" in 
    8195  start) 
     
    103117  restart) 
    104118    log_daemon_msg "Restarting $DESC" "$NAME" 
    105     stop 
     119    stop || true 
    106120 
    107121    if [ "$RUN_DAEMON" = "yes" ]; then 
     
    113127    else 
    114128      log_end_msg "disabled, to enable see $INIT" 
     129    fi 
     130    ;; 
     131  reload) 
     132    log_daemon_msg "Reloading $DESC" "$NAME" 
     133     
     134    if reload ; then 
     135      log_end_msg $? 
     136    else 
     137      log_end_msg $? 
    115138    fi 
    116139    ;; 
  • src/rahunasd.c

    rebf1b31 raace70f  
    2727pid_t pid, sid; 
    2828 
     29int getline(int fd, char *buf, size_t size); 
     30 
    2931struct main_server rh_main_server_instance = { 
    3032  .vserver_list = NULL, 
    3133  .task_list = NULL, 
    3234}; 
    33  
    3435struct main_server *rh_main_server = &rh_main_server_instance; 
    35  
    36 int getline(int fd, char *buf, size_t size); 
    37 size_t expired_check(void *data); 
    3836 
    3937void rh_sighandler(int sig) 
     
    5250      } 
    5351      break; 
    54   } 
     52    case SIGHUP: 
     53      if (pid == 0) { 
     54        rh_reload(); 
     55      } else if (pid > 0) { 
     56        syslog(LOG_NOTICE, "Reloading config files"); 
     57        kill(pid, SIGHUP); 
     58      } else { 
     59        syslog(LOG_ERR, "Invalid PID"); 
     60      } 
     61      break; 
     62  } 
     63  return; 
    5564} 
    5665 
     
    135144} 
    136145 
    137 gboolean polling_expired_check(struct main_server *ms, struct vserver *vs) { 
     146int polling_expired_check(struct main_server *ms, struct vserver *vs) { 
    138147  walk_through_set(&expired_check, vs); 
    139   return TRUE; 
     148  return 0; 
    140149} 
    141150 
     
    143152  struct main_server *ms = (struct main_server *)data; 
    144153  struct vserver *vs = NULL; 
     154   
     155  if (ms->polling_blocked) { 
     156    DP("%s", "Skip polling!"); 
     157    return TRUE; 
     158  } 
     159   
    145160  DP("%s", "Start polling!"); 
    146161  walk_through_vserver(&polling_expired_check, ms); 
     
    153168  rh_task_stopservice(rh_main_server); 
    154169  rh_task_unregister(rh_main_server); 
     170  unregister_vserver_all(rh_main_server); 
    155171  rh_closelog(rh_main_server->main_config->log_file); 
     172} 
     173 
     174void rh_reload() 
     175{ 
     176  logmsg(RH_LOG_NORMAL, "Reloading config files"); 
     177  /* Block polling */ 
     178  rh_main_server->polling_blocked = 1; 
     179 
     180  if (rh_main_server->main_config->log_file != NULL) { 
     181    syslog(LOG_INFO, "Open log file: %s",  
     182           rh_main_server->main_config->log_file); 
     183    rh_main_server->log_fd = rh_openlog(rh_main_server->main_config->log_file); 
     184 
     185    if (!rh_main_server->log_fd) { 
     186      syslog(LOG_ERR, "Could not open log file %s\n",  
     187             rh_main_server->main_config->log_file); 
     188      exit(EXIT_FAILURE); 
     189    } 
     190 
     191    rh_logselect(rh_main_server->log_fd); 
     192  } 
     193 
     194  /* Get vserver(s) config, again */ 
     195  if (rh_main_server->main_config->conf_dir != NULL) { 
     196    get_vservers_config(rh_main_server->main_config->conf_dir, rh_main_server); 
     197  } else { 
     198    syslog(LOG_ERR, "The main configuration file is incompleted, lack of conf_dir\n"); 
     199    exit(EXIT_FAILURE); 
     200  } 
     201 
     202  walk_through_vserver(&vserver_reload, rh_main_server); 
     203  vserver_unused_cleanup(rh_main_server); 
     204   
     205  /* Unblock polling */ 
     206  rh_main_server->polling_blocked = 0; 
     207  DP("Config reload finished"); 
     208  return; 
    156209} 
    157210 
     
    256309} 
    257310 
     311 
    258312int main(int argc, char **argv)  
    259313{ 
     
    277331  GMainLoop* main_loop     = NULL; 
    278332 
    279   signal(SIGTERM, rh_sighandler); 
     333  signal(SIGTERM, &rh_sighandler); 
     334  signal(SIGHUP, &rh_sighandler); 
     335  signal(SIGINT, SIG_IGN); 
    280336 
    281337  watch_child(argv); 
     
    350406                         polling, rh_main_server); 
    351407 
    352  
     408  
     409  walk_through_vserver(&vserver_init_done, rh_main_server); 
    353410  logmsg(RH_LOG_NORMAL, "Ready to serve..."); 
    354411  g_main_loop_run(main_loop); 
  • src/rh-config.h

    rebf1b31 raace70f  
    3737  char *vserver_name; 
    3838  int  vserver_id; 
     39  int  init_flag; 
    3940  char *dev_external; 
    4041  char *dev_internal; 
     
    8283}; 
    8384 
     85enum vserver_config_init_flag { 
     86  VS_NONE, 
     87  VS_INIT, 
     88  VS_RELOAD, 
     89  VS_RESET, 
     90  VS_DONE 
     91}; 
     92 
    8493int get_config(const char *cfg_file, union rahunas_config *config); 
    8594int get_value(const char *cfg_file, const char *key, void **data, size_t *len); 
  • src/rh-ipset.c

    rd5429ac raace70f  
    398398  socklen_t size, req_size; 
    399399  int res = 0; 
    400  
     400    
    401401  size = req_size = load_set_list(vs, vs->vserver_config->vserver_name, &idx,  
    402402                                  IP_SET_OP_LIST_SIZE, CMD_LIST);  
  • src/rh-server.c

    rebf1b31 raace70f  
    99#include "rh-utils.h" 
    1010 
    11 int vserver_exists(GList *vserver_list, int vserver_id,  
     11struct vserver *vserver_exists(GList *vserver_list, int vserver_id,  
    1212                   const char *vserver_name) 
    1313{ 
     
    1919    
    2020    if (lvserver->vserver_config->vserver_id == vserver_id) 
    21       return 1;  
     21      return lvserver;  
    2222 
    2323    if (strcmp(lvserver->vserver_config->vserver_name, vserver_name) == 0) 
    24       return 2; 
     24      return lvserver; 
    2525 
    2626    runner = g_list_next(runner);  
    2727  }  
    28   return 0; 
     28  return NULL; 
    2929} 
    3030 
     
    5353  if (vs->vserver_config != NULL) 
    5454    cleanup_vserver_config(vs->vserver_config);   
    55  
    56   if (vs->v_map != NULL) 
    57     // TODO: cleanup map 
    58  
    59   if (vs->v_set != NULL) 
    60     // TODO: cleanup set 
    6155 
    6256  return 0; 
     
    8478  struct rahunas_vserver_config *vserver_config = NULL; 
    8579  struct vserver *new_vserver = NULL; 
     80  struct vserver *old_vserver = NULL; 
    8681 
    8782  union rahunas_config config = { 
    8883    .rh_vserver.vserver_name = NULL, 
    8984    .rh_vserver.vserver_id = VSERVER_ID, 
     85    .rh_vserver.init_flag = VS_INIT, 
    9086    .rh_vserver.dev_external = NULL, 
    9187    .rh_vserver.dev_internal = NULL, 
     
    127123    return -1; 
    128124 
     125  if (get_config(vserver_cfg_file, &config) == 0) { 
     126    old_vserver = vserver_exists(vserver_list, config.rh_vserver.vserver_id,  
     127                    config.rh_vserver.vserver_name); 
     128 
     129    if (old_vserver != NULL) { 
     130      if (old_vserver->dummy_config != NULL) { 
     131        DP("Cleanup old dummy config"); 
     132        rh_free(&old_vserver->dummy_config); 
     133      } 
     134 
     135      old_vserver->dummy_config =  
     136        (struct rahunas_vserver_config *) rh_malloc(sizeof(struct rahunas_vserver_config)); 
     137 
     138      if (old_vserver->dummy_config == NULL) 
     139        return -1; 
     140 
     141      memset(old_vserver->dummy_config, 0,  
     142        sizeof(struct rahunas_vserver_config)); 
     143      memcpy(old_vserver->dummy_config, &config,  
     144        sizeof(struct rahunas_vserver_config)); 
     145 
     146      if (strncmp(config.rh_vserver.vserver_name,  
     147            old_vserver->vserver_config->vserver_name, 32) != 0 ||  
     148          strncmp(config.rh_vserver.clients,  
     149            old_vserver->vserver_config->clients, 18) != 0) { 
     150        old_vserver->vserver_config->init_flag = VS_RESET; 
     151      } else { 
     152        old_vserver->vserver_config->init_flag = VS_RELOAD;   
     153      } 
     154      return 1; 
     155    } 
     156  } else { 
     157    return -1; 
     158  } 
     159 
    129160  vserver_config = (struct rahunas_vserver_config *) rh_malloc(sizeof(struct rahunas_vserver_config)); 
    130161 
     
    134165  memset(vserver_config, 0, sizeof(struct rahunas_vserver_config)); 
    135166 
    136   if (get_config(vserver_cfg_file, &config) != 0) { 
    137     rh_free(&config.rh_vserver.vserver_ip); 
    138     return -1; 
    139   } 
    140  
    141167  memcpy(vserver_config, &config, sizeof(struct rahunas_vserver_config)); 
    142  
    143   if (vserver_exists(vserver_list, vserver_config->vserver_id,  
    144                      vserver_config->vserver_name)) { 
    145     return 1; 
    146   } 
    147168 
    148169  new_vserver = (struct vserver *) rh_malloc(sizeof(struct vserver)); 
     
    155176  new_vserver->vserver_config = vserver_config; 
    156177 
     178  new_vserver->vserver_config->init_flag = VS_INIT; 
    157179  ms->vserver_list = g_list_append(ms->vserver_list, new_vserver); 
    158180  return 0;  
     
    161183int unregister_vserver(struct main_server *ms, int vserver_id) 
    162184{ 
     185  GList *vserver_list = ms->vserver_list; 
     186  GList *runner = g_list_first(vserver_list); 
     187  struct vserver *lvserver = NULL; 
     188 
     189  while (runner != NULL) { 
     190    lvserver = (struct vserver *)runner->data; 
     191    if (lvserver->vserver_config->vserver_id == vserver_id) { 
     192      vserver_cleanup(lvserver); 
     193 
     194      ms->vserver_list = g_list_delete_link(ms->vserver_list, runner); 
     195      break; 
     196    } else { 
     197      runner = g_list_next(runner); 
     198    } 
     199  } 
     200  return 0; 
    163201} 
    164202 
     
    167205  GList *vserver_list = ms->vserver_list; 
    168206  GList *runner = g_list_first(vserver_list); 
     207  GList *deleting = NULL; 
    169208  struct vserver *lvserver = NULL; 
    170209 
     
    172211    lvserver = (struct vserver *)runner->data; 
    173212    vserver_cleanup(lvserver); 
    174     runner = g_list_delete_link(runner, runner); 
     213    deleting = runner; 
     214    runner = g_list_next(runner); 
     215 
     216    cleanup_vserver_config(lvserver->vserver_config); 
     217    ms->vserver_list = g_list_delete_link(ms->vserver_list, deleting); 
    175218  } 
    176219   
     
    194237  return 0; 
    195238} 
     239 
     240void vserver_init_done(struct main_server *ms, struct vserver *vs) 
     241{ 
     242  if (vs != NULL) { 
     243    vs->vserver_config->init_flag = VS_DONE; 
     244    DP("Virtual Sever (%s) - Configured", vs->vserver_config->vserver_name); 
     245  } 
     246} 
     247 
     248void vserver_reload(struct main_server *ms, struct vserver *vs) 
     249{ 
     250  if (vs->vserver_config->init_flag == VS_DONE) { 
     251    // Indicate the unused virtual server 
     252    vs->vserver_config->init_flag = VS_NONE; 
     253    return; 
     254  } 
     255 
     256  while (vs->vserver_config->init_flag != VS_DONE) { 
     257    if (vs->vserver_config->init_flag == VS_INIT) { 
     258      logmsg(RH_LOG_NORMAL, "[%s] - Config init", 
     259             vs->vserver_config->vserver_name); 
     260 
     261      rh_task_init(ms, vs);  
     262      vs->vserver_config->init_flag = VS_DONE; 
     263    } else if (vs->vserver_config->init_flag == VS_RELOAD) { 
     264      logmsg(RH_LOG_NORMAL, "[%s] - Config reload", 
     265             vs->vserver_config->vserver_name); 
     266 
     267      rh_task_cleanup(ms, vs); 
     268 
     269      if (vs->dummy_config != NULL) { 
     270        cleanup_vserver_config(vs->vserver_config); 
     271        memcpy(vs->vserver_config, vs->dummy_config,  
     272          sizeof(struct rahunas_vserver_config)); 
     273      } 
     274 
     275      vs->vserver_config->init_flag = VS_RELOAD; 
     276      rh_task_init(ms, vs);  
     277      vs->vserver_config->init_flag = VS_DONE; 
     278    } else if (vs->vserver_config->init_flag == VS_RESET) { 
     279      logmsg(RH_LOG_NORMAL, "[%s] - Config reset", 
     280             vs->vserver_config->vserver_name); 
     281 
     282      rh_task_cleanup(ms, vs); 
     283 
     284      if (vs->dummy_config != NULL) { 
     285        cleanup_vserver_config(vs->vserver_config); 
     286        memcpy(vs->vserver_config, vs->dummy_config,  
     287          sizeof(struct rahunas_vserver_config)); 
     288        rh_free(&vs->dummy_config); 
     289      } 
     290 
     291      vs->vserver_config->init_flag = VS_INIT; 
     292    } else { 
     293      /* Prevent infinite loop */ 
     294      vs->vserver_config->init_flag = VS_DONE; 
     295    } 
     296  }  
     297} 
     298 
     299 
     300void vserver_unused_cleanup(struct main_server *ms) 
     301{ 
     302  GList *vserver_list = ms->vserver_list; 
     303  GList *runner = g_list_first(vserver_list); 
     304  struct vserver *lvserver = NULL; 
     305 
     306  while (runner != NULL) { 
     307    lvserver = (struct vserver *)runner->data; 
     308    if (lvserver->vserver_config->init_flag == VS_NONE) { 
     309      logmsg(RH_LOG_NORMAL, "[%s] - Config removed", 
     310             lvserver->vserver_config->vserver_name); 
     311      rh_task_cleanup(ms, lvserver); 
     312      unregister_vserver(ms, lvserver->vserver_config->vserver_id); 
     313 
     314      ms->vserver_list = g_list_delete_link(ms->vserver_list, runner); 
     315      runner = g_list_first(ms->vserver_list); 
     316    } else { 
     317      runner = g_list_next(runner); 
     318    } 
     319  } 
     320   
     321  return 0; 
     322} 
  • src/rh-server.h

    rd5429ac raace70f  
    1212struct vserver { 
    1313  struct rahunas_vserver_config *vserver_config; 
     14  struct rahunas_vserver_config *dummy_config; 
    1415  struct rahunas_map *v_map; 
    1516  struct set *v_set; 
     
    2122  GList *task_list; 
    2223  int log_fd; 
     24  int polling_blocked; 
    2325}; 
    2426 
    25 int vserver_exists(GList *vserver_list, int vserver_id,  
     27struct vserver *vserver_exists(GList *vserver_list, int vserver_id,  
    2628                   const char *vserver_name); 
    2729struct vserver *vserver_get_by_id(struct main_server *ms, int search_id); 
     
    3234int unregister_vserver(struct main_server *ms, int vserver_id); 
    3335int unregister_vserver_all(struct main_server *ms); 
    34  
     36void vserver_init_done(struct main_server *ms, struct vserver *vs); 
     37void vserver_reload(struct main_server *ms, struct vserver *vs); 
     38void vserver_unused_cleanup(struct main_server *ms); 
    3539 
    3640#endif // __RH_SERVER_H 
  • src/rh-task-dbset.c

    rebf1b31 raace70f  
    283283  char select_cmd[256]; 
    284284 
     285  if (vs->vserver_config->init_flag == VS_RELOAD) 
     286    return; 
     287 
    285288  logmsg(RH_LOG_NORMAL, "[%s] Task DBSET initialize..", 
    286289         vs->vserver_config->vserver_name);   
  • src/rh-task-ipset.c

    rebf1b31 raace70f  
    6262static void init (struct vserver *vs) 
    6363{ 
     64  if (vs->vserver_config->init_flag == VS_RELOAD) 
     65    return; 
     66 
    6467  vs->v_set = set_adt_get(vs->vserver_config->vserver_name); 
    6568  logmsg(RH_LOG_NORMAL, "[%s] Task IPSET initialize..", 
     
    7780static void cleanup (struct vserver *vs) 
    7881{ 
     82  if (vs->vserver_config->init_flag == VS_RELOAD) 
     83    return; 
     84 
    7985  logmsg(RH_LOG_NORMAL, "[%s] Task IPSET cleanup..", 
    8086         vs->vserver_config->vserver_name);   
  • src/rh-task-iptables.c

    rebf1b31 raace70f  
    3030  int fd = 0; 
    3131  int i = 0; 
    32   char *env[21]; 
     32  char *env[22]; 
    3333 
    3434  env[0]  = g_strdup("ENV_OVERRIDE=yes"); 
     
    5555  env[19] = g_strdup_printf("VSERVER_PORTS_INTERCEPT=%s",  
    5656                            vs->vserver_config->vserver_ports_intercept); 
    57   env[20] = (char *) 0; 
     57  env[20] = g_strdup_printf("KEEP_SET=%s",  
     58                            vs->vserver_config->init_flag == VS_RELOAD ? 
     59                            "yes" : "no"); 
     60  env[21] = (char *) 0; 
    5861 
    5962  for (i = 0; i < 21; i++) { 
     
    156159  logmsg(RH_LOG_NORMAL, "[%s] Task IPTABLES cleanup..", 
    157160         vs->vserver_config->vserver_name);   
     161 
    158162  iptables_stop(vs); 
    159163} 
  • src/rh-task-memset.c

    rebf1b31 raace70f  
    5757  int size; 
    5858 
     59  if (vs->vserver_config->init_flag == VS_RELOAD) 
     60    return; 
     61 
    5962  logmsg(RH_LOG_NORMAL, "[%s] Task MEMSET initialize..", 
    6063         vs->vserver_config->vserver_name);   
     
    8184  GList *deleting = NULL; 
    8285  struct rahunas_member *member = NULL; 
     86 
     87  if (vs->vserver_config->init_flag == VS_RELOAD) 
     88    return; 
    8389 
    8490  logmsg(RH_LOG_NORMAL, "[%s] Task MEMSET cleanup..", 
  • tools/firewall.sh.in

    r94c9e9e raace70f  
    654654start_config() { 
    655655  test ! -f $RUNDIR/$SETNAME || return 0 
    656   add_set 
     656  test "$KEEP_SET" = "yes" || add_set 
    657657  new_chains 
    658658  rules 
     
    681681  test -f $RUNDIR/$SETNAME || return 0 
    682682  cleanup 
    683   cleanup_set 
     683  test "$KEEP_SET" = "yes" || cleanup_set 
    684684  rm -f $RUNDIR/$SETNAME 
    685685  return 0