OSDN Git Service

Update INSTALL.ja.utf-8 for new release.
[ultramonkey-l7/ultramonkey-l7-v2.git] / src / l7vsd.c
1 /*
2  * @file  l7vsd.c
3  * @brief l7vsd main module.
4  *
5  * L7VSD: Linux Virtual Server for Layer7 Load Balancing
6  * Copyright (C) 2008  NTT COMWARE Corporation.
7  *
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.
12  *
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.
17  *
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
21  * 02110-1301 USA
22  *
23  **********************************************************************/
24
25 #ifndef _GNU_SOURCE
26 #define _GNU_SOURCE     /* for getopt_long() */
27 #endif /* _GNU_SOURCE */
28 #include <sys/types.h>
29 #include <sys/stat.h>
30 #include <sys/socket.h>
31 #include <signal.h>
32 #include <unistd.h>
33 #include <stdlib.h>
34 #include <getopt.h>
35 #include <glib.h>
36 #include <errno.h>
37 #include "logger_wrapper.h"
38 #include "parameter_wrapper.h"
39 #include "l7vs.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"
45
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);
50
51 static int exit_requested = 0;
52 static int received_sig = 0;
53
54 l7vs::Logger l7vs::Logger::instance;
55 l7vs::Parameter l7vs::Parameter::instance;
56
57 /*!
58  * exit signal handler
59  *
60  * @param[in]   sig signal
61  * @return      void
62  */
63 static void
64 sig_exit_handler(int sig)
65 {
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) "
70             "sig=%d",
71             sig);
72     }
73     /*------ DEBUG LOG END ------*/
74
75     received_sig = sig;
76     exit_requested++;
77
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");
83     }
84     /*------ DEBUG LOG END ------*/
85 }
86
87 /*!
88  * setup signal handler
89  *
90  * @param[in] sig      signal
91  * @param[in] handler  signal handler
92  * @retval     0       succeed
93  * @retval    -1       failed
94  */
95 static int
96 set_sighandler(int sig, void (*handler)(int))
97 {
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)) "
102             "sig=%d: "
103             "handler=%p",
104             sig, handler);
105     }
106     /*------ DEBUG LOG END ------*/
107
108     struct sigaction act;
109     int ret;
110
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",
115             sig);
116     }
117     /*------ DEBUG LOG END ------*/
118     ret = sigaction(sig, NULL, &act);
119     if (ret < 0) {
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)) "
125                 "return_value: %d",
126                 ret);
127         }
128         /*------ DEBUG LOG END ------*/
129         return ret;
130     }
131     act.sa_flags &= ~SA_RESETHAND;
132     act.sa_handler = handler;
133
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);
139     }
140     /*------ DEBUG LOG END ------*/
141     ret = sigaction(sig, &act, NULL);
142     if (ret < 0) {
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)) "
148                 "return_value: %d",
149                 ret);
150         }
151         /*------ DEBUG LOG END ------*/
152         return ret;
153     }
154
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)) "
159             "return_value: 0");
160     }
161     /*------ DEBUG LOG END ------*/
162     return 0;
163 }
164
165 /*!
166  * setup all signal handlers
167  *
168  * @param[in]   void
169  * @retval      0   succeed
170  * @retval      -1  failed
171  */
172 static int
173 set_sighandlers(void)
174 {
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) ");
179     }
180     /*------ DEBUG LOG END ------*/
181     int ret;
182
183 #define SET_SIGHANDLER(sig, handler)                                            \
184     do {                                                                        \
185         ret = set_sighandler((sig), (handler));                                 \
186         if (ret < 0) {                                                          \
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",                                         \
191                     ret);                                                       \
192             }                                                                   \
193             return ret;                                                         \
194         }                                                                       \
195     } while (0)
196
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);
205
206 #undef SET_SIGHANDLER
207
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) "
212             "return_value: 0");
213     }
214     /*------ DEBUG LOG END ------*/
215     return 0;
216 }
217
218 /*!
219  * show usage
220  *
221  * @param[in]   fp      filepointer
222  * @param[in]   ident   program identifier
223  * @return      void
224  */
225 static void
226 usage(FILE *fp, char *ident)
227 {
228     /*-------- DEBUG LOG --------*/
229     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
230         if (!fp) {
231             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,12,
232                 "in_function: static void usage(FILE *fp, char *ident) "
233                 "fp=NULL, ident=%s",
234                 ident);
235         }
236         else {
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",
240                 fp->_fileno, ident);
241         }
242     }
243     /*------ DEBUG LOG END ------*/
244
245     if (!fp) {
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");
252         }
253         /*------ DEBUG LOG END ------*/
254         return;
255     }
256     if (!ident) {
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");
263         }
264         /*------ DEBUG LOG END ------*/
265         return;
266     }
267     fprintf(fp,
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",
272         ident);
273
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");
279     }
280     /*------ DEBUG LOG END ------*/
281 }
282
283 /*!
284  * entry point
285  *
286  * @param[in]   argc    number of arguments
287  * @param[in]   argv    arguments
288  * @return      int     exit status
289  */
290 int
291 //l7vsd_main(int argc, char *argv[])
292 main(int argc, char *argv[])
293 {
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 );
297
298     /*-------- DEBUG LOG --------*/
299     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) {
300         char argv_str[DEBUG_STR_LEN] = {0};
301         size_t pos = 0;
302         for (int i = 0; i < argc; ++i) {
303             if (DEBUG_STR_LEN <= pos + strlen(argv[i]) + 1) {
304                 break;
305             }
306             strcpy(argv_str + pos, argv[i]);
307             pos += strlen(argv[i]);
308             *(argv_str + pos) = ' ';
309             ++pos;
310         }
311         *(argv_str + pos) = '\0';
312         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,17,
313             "in_function: int main(int argc, char *argv[]) "
314             "argc=%d, argv=%s",
315             argc, argv_str);
316     }
317     /*------ DEBUG LOG END ------*/
318
319     int c;
320     int ret;
321     int debug = 0;
322     int blocking = 0;
323
324     static struct option options[] = {
325         {"debug",       no_argument,    NULL,   'd'},
326         {"help",        no_argument,    NULL,   'h'},
327         {"blocking",    no_argument,    NULL,   'b'},
328         {NULL,          0,              NULL,   0  }
329     };
330
331     while ((c = getopt_long(argc, argv, "dhb", options, NULL)) != -1) {
332         switch (c) {
333         case 'd':
334             debug = 1;
335             break;
336         case 'b':
337             blocking = -1;
338             break;
339         case '?':
340         default:
341             fprintf(stderr, "%s: unknown option: %s\n",
342                 argv[0], argv[optind - 1]);
343             usage(stderr, argv[0]);
344             fflush(stdout);
345             fsync(1);
346             _exit(1);
347             break;
348         case 'h':
349             usage(stdout, argv[0]);
350             fflush(stdout);
351             fsync(1);
352             _exit(0);
353             break;
354         }
355     }
356
357     if (!debug) {
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");
362         }
363         /*------ DEBUG LOG END ------*/
364         ret = daemon(0, 0);
365         if (ret < 0) {
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[]) "
371                     "return_value: 1");
372             }
373             /*------ DEBUG LOG END ------*/
374             fflush(stdout);
375             fsync(1);
376             _exit(1);
377         }
378     }
379
380     LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_START_STOP,1, "Starting.");
381
382     set_sighandlers();
383
384     sprintf(l7vs_module_path, L7VS_MODULE_PATH);
385     ret = l7vs_iomux_init();
386     if (ret < 0) {
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[]) "
392                 "return_value: 1");
393         }
394         /*------ DEBUG LOG END ------*/
395         fflush(stdout);
396         fsync(1);
397         _exit(1);
398     }
399
400     //snmpbridge initialize
401     LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_PROGRAM,1, "snmpbridge initialize start.");
402     ret = l7vs_snmpbridge_initialize();
403     if( ret < 0 ){
404         //debug log output
405         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,4, "snmpbridge initialize failure.");
406     }
407     LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_PROGRAM,2, "snmpbridge initialize success.");
408
409     ret = l7vs_config_init();
410     if (ret < 0) {
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[]) "
416                 "return_value: 1");
417         }
418         /*------ DEBUG LOG END ------*/
419         fflush(stdout);
420         fsync(1);
421         _exit(1);
422     }
423
424     l7vs_module_init(NULL);
425     l7vs_lsock_init();
426     l7vs_replication_init();
427     l7vs_conn_init();
428     while (!exit_requested) {
429         ret = l7vs_iomux_poll(NULL, blocking);
430         if (ret < 0) {
431             if (errno == EINTR) {
432                 /* stop_requested will be checked... */
433                 continue;
434             }
435             LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,1, "poll: %s", strerror(errno));
436             break;
437         }
438     }
439
440     if (received_sig) {
441         LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_SYSTEM_SIGNAL,1, "signal %d received.", received_sig);
442     }
443
444     l7vs_replication_fini();
445     l7vs_lsock_fini();
446     l7vs_module_fini();
447     l7vs_config_fini();
448     l7vs_iomux_fini();
449
450     LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_START_STOP,2, "Exiting.");
451
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[]) "
456             "return_value: 0");
457     }
458     /*------ DEBUG LOG END ------*/
459     fflush(stdout);
460     fsync(1);
461     _exit(0);
462     return 0;  /* this instruction never called ;-) */
463 }