3 * @brief l7vsd main module.
5 * L7VSD: Linux Virtual Server for Layer7 Load Balancing
6 * Copyright (C) 2008 NTT COMWARE Corporation.
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
23 **********************************************************************/
26 #define _GNU_SOURCE /* for getopt_long() */
27 #endif /* _GNU_SOURCE */
28 #include <sys/types.h>
30 #include <sys/socket.h>
37 #include "logger_wrapper.h"
38 #include "parameter_wrapper.h"
40 #include "l7vs_module.h"
41 #include "l7vs_config.h"
42 #include "l7vs_iomuxlist.h"
43 #include "l7vs_config.h"
44 #include "l7vs_lsock.h"
46 static void sig_exit_handler(int sig);
47 static int set_sighandler(int sig, void (*handler)(int));
48 static int set_sighandlers(void);
49 static void usage(FILE *fp, char *ident);
51 static int exit_requested = 0;
52 static int received_sig = 0;
54 l7vs::Logger l7vs::Logger::instance;
55 l7vs::Parameter l7vs::Parameter::instance;
60 * @param[in] sig signal
64 sig_exit_handler(int sig)
66 /*-------- DEBUG LOG --------*/
67 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
68 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,1,
69 "in_function: static void sig_exit_handler(int sig) "
73 /*------ DEBUG LOG END ------*/
78 /*-------- DEBUG LOG --------*/
79 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
80 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,2,
81 "out_function: static void sig_exit_handler(int sig) "
82 "return_value: void");
84 /*------ DEBUG LOG END ------*/
88 * setup signal handler
90 * @param[in] sig signal
91 * @param[in] handler signal handler
96 set_sighandler(int sig, void (*handler)(int))
98 /*-------- DEBUG LOG --------*/
99 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
100 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,3,
101 "in_function: static int set_sighandler(int sig, void (*handler)(int)) "
106 /*------ DEBUG LOG END ------*/
108 struct sigaction act;
111 /*-------- DEBUG LOG --------*/
112 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
113 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,4,
114 "sigaction : sig=%d: act=NULL",
117 /*------ DEBUG LOG END ------*/
118 ret = sigaction(sig, NULL, &act);
120 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SIGNAL,1, "sigaction on signal %d failed", sig);
121 /*-------- DEBUG LOG --------*/
122 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
123 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,5,
124 "out_function: static int set_sighandler(int sig, void (*handler)(int)) "
128 /*------ DEBUG LOG END ------*/
131 act.sa_flags &= ~SA_RESETHAND;
132 act.sa_handler = handler;
134 /*-------- DEBUG LOG --------*/
135 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
136 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,6,
137 "sigaction : sig=%d: act.sa_flags=%d, act.sa_handler=%p",
138 sig, act.sa_flags, act.sa_handler);
140 /*------ DEBUG LOG END ------*/
141 ret = sigaction(sig, &act, NULL);
143 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SIGNAL,2, "sigaction on signal %d failed", sig);
144 /*-------- DEBUG LOG --------*/
145 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
146 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,7,
147 "out_function: static int set_sighandler(int sig, void (*handler)(int)) "
151 /*------ DEBUG LOG END ------*/
155 /*-------- DEBUG LOG --------*/
156 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
157 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,8,
158 "out_function: static int set_sighandler(int sig, void (*handler)(int)) "
161 /*------ DEBUG LOG END ------*/
166 * setup all signal handlers
173 set_sighandlers(void)
175 /*-------- DEBUG LOG --------*/
176 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
177 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,9,
178 "in_function: static int set_sighandlers(void) ");
180 /*------ DEBUG LOG END ------*/
183 #define SET_SIGHANDLER(sig, handler) \
185 ret = set_sighandler((sig), (handler)); \
187 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) { \
188 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,10, \
189 "out_function: static int set_sighandlers(void) " \
190 "return_value: %d", \
197 SET_SIGHANDLER(SIGHUP, sig_exit_handler);
198 SET_SIGHANDLER(SIGINT, sig_exit_handler);
199 SET_SIGHANDLER(SIGQUIT, sig_exit_handler);
200 SET_SIGHANDLER(SIGTERM, sig_exit_handler);
201 SET_SIGHANDLER(SIGUSR1, SIG_IGN);
202 SET_SIGHANDLER(SIGUSR2, SIG_IGN);
203 SET_SIGHANDLER(SIGALRM, SIG_IGN);
204 SET_SIGHANDLER(SIGCHLD, SIG_IGN);
206 #undef SET_SIGHANDLER
208 /*-------- DEBUG LOG --------*/
209 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
210 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,11,
211 "out_function: static int set_sighandlers(void) "
214 /*------ DEBUG LOG END ------*/
221 * @param[in] fp filepointer
222 * @param[in] ident program identifier
226 usage(FILE *fp, char *ident)
228 /*-------- DEBUG LOG --------*/
229 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
231 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,12,
232 "in_function: static void usage(FILE *fp, char *ident) "
237 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,13,
238 "in_function: static void usage(FILE *fp, char *ident) "
239 "fp->_fileno=%d, ident=%s",
243 /*------ DEBUG LOG END ------*/
246 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,1, "fp is NULL.");
247 /*-------- DEBUG LOG --------*/
248 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
249 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,14,
250 "out_function: static void usage(FILE *fp, char *ident) "
251 "return_value: void");
253 /*------ DEBUG LOG END ------*/
257 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,2, "ident is NULL.");
258 /*-------- DEBUG LOG --------*/
259 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
260 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,15,
261 "out_function: static void usage(FILE *fp, char *ident) "
262 "return_value: void");
264 /*------ DEBUG LOG END ------*/
268 "Usage: %s [-d] [-h]\n"
269 " -d --debug run in debug mode (in foreground)\n"
270 " -h --help print this help messages and exit\n"
271 " -b --blocking blocking mode enable( default non-blocking )\n",
274 /*-------- DEBUG LOG --------*/
275 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
276 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,16,
277 "out_function: static void usage(FILE *fp, char *ident) "
278 "return_value: void");
280 /*------ DEBUG LOG END ------*/
286 * @param[in] argc number of arguments
287 * @param[in] argv arguments
288 * @return int exit status
291 //l7vsd_main(int argc, char *argv[])
292 main(int argc, char *argv[])
294 //parameter set function register
295 parameter_register_function_pointer( PARAM_COMP_SNMPAGENT, l7vs_snmpbridge_reload_config );
296 parameter_register_function_pointer( PARAM_COMP_REPLICATION, l7vs_replication_reset );
298 /*-------- DEBUG LOG --------*/
299 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
300 char argv_str[DEBUG_STR_LEN] = {0};
302 for (int i = 0; i < argc; ++i) {
303 if (DEBUG_STR_LEN <= pos + strlen(argv[i]) + 1) {
306 strcpy(argv_str + pos, argv[i]);
307 pos += strlen(argv[i]);
308 *(argv_str + pos) = ' ';
311 *(argv_str + pos) = '\0';
312 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,17,
313 "in_function: int main(int argc, char *argv[]) "
317 /*------ DEBUG LOG END ------*/
324 static struct option options[] = {
325 {"debug", no_argument, NULL, 'd'},
326 {"help", no_argument, NULL, 'h'},
327 {"blocking", no_argument, NULL, 'b'},
331 while ((c = getopt_long(argc, argv, "dhb", options, NULL)) != -1) {
341 fprintf(stderr, "%s: unknown option: %s\n",
342 argv[0], argv[optind - 1]);
343 usage(stderr, argv[0]);
349 usage(stdout, argv[0]);
358 /*-------- DEBUG LOG --------*/
359 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
360 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,18,
361 "deamon : nochdir=0: noclose=0");
363 /*------ DEBUG LOG END ------*/
366 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,3, "daemon() failed: %s", strerror(errno));
367 /*-------- DEBUG LOG --------*/
368 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
369 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,19,
370 "out_function: int main(int argc, char *argv[]) "
373 /*------ DEBUG LOG END ------*/
380 LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_START_STOP,1, "Starting.");
384 sprintf(l7vs_module_path, L7VS_MODULE_PATH);
385 ret = l7vs_iomux_init();
387 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,5, "iomux_init failed. Exitting.");
388 /*-------- DEBUG LOG --------*/
389 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
390 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,20,
391 "out_function: int main(int argc, char *argv[]) "
394 /*------ DEBUG LOG END ------*/
400 //snmpbridge initialize
401 LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_PROGRAM,1, "snmpbridge initialize start.");
402 ret = l7vs_snmpbridge_initialize();
405 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,4, "snmpbridge initialize failure.");
407 LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_PROGRAM,2, "snmpbridge initialize success.");
409 ret = l7vs_config_init();
411 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,6, "config_init failed. Exiting.");
412 /*-------- DEBUG LOG --------*/
413 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
414 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,21,
415 "out_function: int main(int argc, char *argv[]) "
418 /*------ DEBUG LOG END ------*/
424 l7vs_module_init(NULL);
426 l7vs_replication_init();
428 while (!exit_requested) {
429 ret = l7vs_iomux_poll(NULL, blocking);
431 if (errno == EINTR) {
432 /* stop_requested will be checked... */
435 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,1, "poll: %s", strerror(errno));
441 LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_SYSTEM_SIGNAL,1, "signal %d received.", received_sig);
444 l7vs_replication_fini();
450 LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_START_STOP,2, "Exiting.");
452 /*-------- DEBUG LOG --------*/
453 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
454 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,22,
455 "out_function: int main(int argc, char *argv[]) "
458 /*------ DEBUG LOG END ------*/
462 return 0; /* this instruction never called ;-) */