Changeset aace70f808787e6416462b9148cc6777dd2b0ec3
- Timestamp:
- 04/27/09 08:48:29 (3 years ago)
- Children:
- f1184f9058b0f965c8cada118eee1e542b26d70b
- Parents:
- 94c9e9e68a52a85cada2842d74d51b9407ccf5b2
- git-committer:
- Neutron Soutmun <neo.neutron@…> (04/27/09 08:48:29)
- Files:
-
- 12 modified
-
ChangeLog (modified) (1 diff)
-
example/rahunas.init.in (modified) (3 diffs)
-
src/rahunasd.c (modified) (8 diffs)
-
src/rh-config.h (modified) (2 diffs)
-
src/rh-ipset.c (modified) (1 diff)
-
src/rh-server.c (modified) (11 diffs)
-
src/rh-server.h (modified) (3 diffs)
-
src/rh-task-dbset.c (modified) (1 diff)
-
src/rh-task-ipset.c (modified) (2 diffs)
-
src/rh-task-iptables.c (modified) (3 diffs)
-
src/rh-task-memset.c (modified) (2 diffs)
-
tools/firewall.sh.in (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
ChangeLog
r94c9e9e raace70f 1 2009-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 1 13 2009-04-23 Neutron Soutmun <neo.neutron@gmail.com> 2 14 -
example/rahunas.init.in
r94c9e9e raace70f 78 78 } 79 79 80 reload () { 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 80 94 case "$1" in 81 95 start) … … 103 117 restart) 104 118 log_daemon_msg "Restarting $DESC" "$NAME" 105 stop 119 stop || true 106 120 107 121 if [ "$RUN_DAEMON" = "yes" ]; then … … 113 127 else 114 128 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 $? 115 138 fi 116 139 ;; -
src/rahunasd.c
rebf1b31 raace70f 27 27 pid_t pid, sid; 28 28 29 int getline(int fd, char *buf, size_t size); 30 29 31 struct main_server rh_main_server_instance = { 30 32 .vserver_list = NULL, 31 33 .task_list = NULL, 32 34 }; 33 34 35 struct 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);38 36 39 37 void rh_sighandler(int sig) … … 52 50 } 53 51 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; 55 64 } 56 65 … … 135 144 } 136 145 137 gbooleanpolling_expired_check(struct main_server *ms, struct vserver *vs) {146 int polling_expired_check(struct main_server *ms, struct vserver *vs) { 138 147 walk_through_set(&expired_check, vs); 139 return TRUE;148 return 0; 140 149 } 141 150 … … 143 152 struct main_server *ms = (struct main_server *)data; 144 153 struct vserver *vs = NULL; 154 155 if (ms->polling_blocked) { 156 DP("%s", "Skip polling!"); 157 return TRUE; 158 } 159 145 160 DP("%s", "Start polling!"); 146 161 walk_through_vserver(&polling_expired_check, ms); … … 153 168 rh_task_stopservice(rh_main_server); 154 169 rh_task_unregister(rh_main_server); 170 unregister_vserver_all(rh_main_server); 155 171 rh_closelog(rh_main_server->main_config->log_file); 172 } 173 174 void 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; 156 209 } 157 210 … … 256 309 } 257 310 311 258 312 int main(int argc, char **argv) 259 313 { … … 277 331 GMainLoop* main_loop = NULL; 278 332 279 signal(SIGTERM, rh_sighandler); 333 signal(SIGTERM, &rh_sighandler); 334 signal(SIGHUP, &rh_sighandler); 335 signal(SIGINT, SIG_IGN); 280 336 281 337 watch_child(argv); … … 350 406 polling, rh_main_server); 351 407 352 408 409 walk_through_vserver(&vserver_init_done, rh_main_server); 353 410 logmsg(RH_LOG_NORMAL, "Ready to serve..."); 354 411 g_main_loop_run(main_loop); -
src/rh-config.h
rebf1b31 raace70f 37 37 char *vserver_name; 38 38 int vserver_id; 39 int init_flag; 39 40 char *dev_external; 40 41 char *dev_internal; … … 82 83 }; 83 84 85 enum vserver_config_init_flag { 86 VS_NONE, 87 VS_INIT, 88 VS_RELOAD, 89 VS_RESET, 90 VS_DONE 91 }; 92 84 93 int get_config(const char *cfg_file, union rahunas_config *config); 85 94 int get_value(const char *cfg_file, const char *key, void **data, size_t *len); -
src/rh-ipset.c
rd5429ac raace70f 398 398 socklen_t size, req_size; 399 399 int res = 0; 400 400 401 401 size = req_size = load_set_list(vs, vs->vserver_config->vserver_name, &idx, 402 402 IP_SET_OP_LIST_SIZE, CMD_LIST); -
src/rh-server.c
rebf1b31 raace70f 9 9 #include "rh-utils.h" 10 10 11 intvserver_exists(GList *vserver_list, int vserver_id,11 struct vserver *vserver_exists(GList *vserver_list, int vserver_id, 12 12 const char *vserver_name) 13 13 { … … 19 19 20 20 if (lvserver->vserver_config->vserver_id == vserver_id) 21 return 1;21 return lvserver; 22 22 23 23 if (strcmp(lvserver->vserver_config->vserver_name, vserver_name) == 0) 24 return 2;24 return lvserver; 25 25 26 26 runner = g_list_next(runner); 27 27 } 28 return 0;28 return NULL; 29 29 } 30 30 … … 53 53 if (vs->vserver_config != NULL) 54 54 cleanup_vserver_config(vs->vserver_config); 55 56 if (vs->v_map != NULL)57 // TODO: cleanup map58 59 if (vs->v_set != NULL)60 // TODO: cleanup set61 55 62 56 return 0; … … 84 78 struct rahunas_vserver_config *vserver_config = NULL; 85 79 struct vserver *new_vserver = NULL; 80 struct vserver *old_vserver = NULL; 86 81 87 82 union rahunas_config config = { 88 83 .rh_vserver.vserver_name = NULL, 89 84 .rh_vserver.vserver_id = VSERVER_ID, 85 .rh_vserver.init_flag = VS_INIT, 90 86 .rh_vserver.dev_external = NULL, 91 87 .rh_vserver.dev_internal = NULL, … … 127 123 return -1; 128 124 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 129 160 vserver_config = (struct rahunas_vserver_config *) rh_malloc(sizeof(struct rahunas_vserver_config)); 130 161 … … 134 165 memset(vserver_config, 0, sizeof(struct rahunas_vserver_config)); 135 166 136 if (get_config(vserver_cfg_file, &config) != 0) {137 rh_free(&config.rh_vserver.vserver_ip);138 return -1;139 }140 141 167 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 }147 168 148 169 new_vserver = (struct vserver *) rh_malloc(sizeof(struct vserver)); … … 155 176 new_vserver->vserver_config = vserver_config; 156 177 178 new_vserver->vserver_config->init_flag = VS_INIT; 157 179 ms->vserver_list = g_list_append(ms->vserver_list, new_vserver); 158 180 return 0; … … 161 183 int unregister_vserver(struct main_server *ms, int vserver_id) 162 184 { 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; 163 201 } 164 202 … … 167 205 GList *vserver_list = ms->vserver_list; 168 206 GList *runner = g_list_first(vserver_list); 207 GList *deleting = NULL; 169 208 struct vserver *lvserver = NULL; 170 209 … … 172 211 lvserver = (struct vserver *)runner->data; 173 212 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); 175 218 } 176 219 … … 194 237 return 0; 195 238 } 239 240 void 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 248 void 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 300 void 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 12 12 struct vserver { 13 13 struct rahunas_vserver_config *vserver_config; 14 struct rahunas_vserver_config *dummy_config; 14 15 struct rahunas_map *v_map; 15 16 struct set *v_set; … … 21 22 GList *task_list; 22 23 int log_fd; 24 int polling_blocked; 23 25 }; 24 26 25 intvserver_exists(GList *vserver_list, int vserver_id,27 struct vserver *vserver_exists(GList *vserver_list, int vserver_id, 26 28 const char *vserver_name); 27 29 struct vserver *vserver_get_by_id(struct main_server *ms, int search_id); … … 32 34 int unregister_vserver(struct main_server *ms, int vserver_id); 33 35 int unregister_vserver_all(struct main_server *ms); 34 36 void vserver_init_done(struct main_server *ms, struct vserver *vs); 37 void vserver_reload(struct main_server *ms, struct vserver *vs); 38 void vserver_unused_cleanup(struct main_server *ms); 35 39 36 40 #endif // __RH_SERVER_H -
src/rh-task-dbset.c
rebf1b31 raace70f 283 283 char select_cmd[256]; 284 284 285 if (vs->vserver_config->init_flag == VS_RELOAD) 286 return; 287 285 288 logmsg(RH_LOG_NORMAL, "[%s] Task DBSET initialize..", 286 289 vs->vserver_config->vserver_name); -
src/rh-task-ipset.c
rebf1b31 raace70f 62 62 static void init (struct vserver *vs) 63 63 { 64 if (vs->vserver_config->init_flag == VS_RELOAD) 65 return; 66 64 67 vs->v_set = set_adt_get(vs->vserver_config->vserver_name); 65 68 logmsg(RH_LOG_NORMAL, "[%s] Task IPSET initialize..", … … 77 80 static void cleanup (struct vserver *vs) 78 81 { 82 if (vs->vserver_config->init_flag == VS_RELOAD) 83 return; 84 79 85 logmsg(RH_LOG_NORMAL, "[%s] Task IPSET cleanup..", 80 86 vs->vserver_config->vserver_name); -
src/rh-task-iptables.c
rebf1b31 raace70f 30 30 int fd = 0; 31 31 int i = 0; 32 char *env[2 1];32 char *env[22]; 33 33 34 34 env[0] = g_strdup("ENV_OVERRIDE=yes"); … … 55 55 env[19] = g_strdup_printf("VSERVER_PORTS_INTERCEPT=%s", 56 56 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; 58 61 59 62 for (i = 0; i < 21; i++) { … … 156 159 logmsg(RH_LOG_NORMAL, "[%s] Task IPTABLES cleanup..", 157 160 vs->vserver_config->vserver_name); 161 158 162 iptables_stop(vs); 159 163 } -
src/rh-task-memset.c
rebf1b31 raace70f 57 57 int size; 58 58 59 if (vs->vserver_config->init_flag == VS_RELOAD) 60 return; 61 59 62 logmsg(RH_LOG_NORMAL, "[%s] Task MEMSET initialize..", 60 63 vs->vserver_config->vserver_name); … … 81 84 GList *deleting = NULL; 82 85 struct rahunas_member *member = NULL; 86 87 if (vs->vserver_config->init_flag == VS_RELOAD) 88 return; 83 89 84 90 logmsg(RH_LOG_NORMAL, "[%s] Task MEMSET cleanup..", -
tools/firewall.sh.in
r94c9e9e raace70f 654 654 start_config() { 655 655 test ! -f $RUNDIR/$SETNAME || return 0 656 add_set656 test "$KEEP_SET" = "yes" || add_set 657 657 new_chains 658 658 rules … … 681 681 test -f $RUNDIR/$SETNAME || return 0 682 682 cleanup 683 cleanup_set683 test "$KEEP_SET" = "yes" || cleanup_set 684 684 rm -f $RUNDIR/$SETNAME 685 685 return 0
