1 /*
2 ** Zabbix
3 ** Copyright (C) 2001-2021 Zabbix SIA
4 **
5 ** This program is free software; you can redistribute it and/or modify
6 ** it under the terms of the GNU General Public License as published by
7 ** the Free Software Foundation; either version 2 of the License, or
8 ** (at your option) any later version.
9 **
10 ** This program is distributed in the hope that it will be useful,
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 ** GNU General Public License for more details.
14 **
15 ** You should have received a copy of the GNU General Public License
16 ** along with this program; if not, write to the Free Software
17 ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 **/
19
20 #include "common.h"
21
22 #ifdef HAVE_SQLITE3
23 # error SQLite is not supported as a main Zabbix database backend.
24 #endif
25
26 #include "cfg.h"
27 #include "pid.h"
28 #include "db.h"
29 #include "dbcache.h"
30 #include "zbxdbupgrade.h"
31 #include "log.h"
32 #include "zbxgetopt.h"
33 #include "mutexs.h"
34
35 #include "sysinfo.h"
36 #include "zbxmodules.h"
37 #include "zbxserver.h"
38
39 #include "zbxnix.h"
40 #include "daemon.h"
41 #include "zbxself.h"
42 #include "../libs/zbxnix/control.h"
43
44 #include "alerter/alerter.h"
45 #include "alerter/alert_manager.h"
46 #include "dbsyncer/dbsyncer.h"
47 #include "dbconfig/dbconfig.h"
48 #include "discoverer/discoverer.h"
49 #include "httppoller/httppoller.h"
50 #include "housekeeper/housekeeper.h"
51 #include "pinger/pinger.h"
52 #include "poller/poller.h"
53 #include "timer/timer.h"
54 #include "trapper/trapper.h"
55 #include "snmptrapper/snmptrapper.h"
56 #include "escalator/escalator.h"
57 #include "proxypoller/proxypoller.h"
58 #include "selfmon/selfmon.h"
59 #include "vmware/vmware.h"
60 #include "taskmanager/taskmanager.h"
61 #include "preprocessor/preproc_manager.h"
62 #include "preprocessor/preproc_worker.h"
63 #include "events.h"
64 #include "../libs/zbxdbcache/valuecache.h"
65 #include "setproctitle.h"
66 #include "../libs/zbxcrypto/tls.h"
67 #include "zbxipcservice.h"
68 #include "zbxhistory.h"
69 #include "postinit.h"
70 #include "export.h"
71
72 #ifdef HAVE_OPENIPMI
73 #include "ipmi/ipmi_manager.h"
74 #include "ipmi/ipmi_poller.h"
75 #endif
76
77 const char *progname = NULL;
78 const char title_message[] = "zabbix_server";
79 const char syslog_app_name[] = "zabbix_server";
80 const char *usage_message[] = {
81 "[-c config-file]", NULL,
82 "[-c config-file]", "-R runtime-option", NULL,
83 "-h", NULL,
84 "-V", NULL,
85 NULL /* end of text */
86 };
87
88 const char *help_message[] = {
89 "The core daemon of Zabbix software.",
90 "",
91 "Options:",
92 " -c --config config-file Path to the configuration file",
93 " (default: \"" DEFAULT_CONFIG_FILE "\")",
94 " -f --foreground Run Zabbix server in foreground",
95 " -R --runtime-control runtime-option Perform administrative functions",
96 "",
97 " Runtime control options:",
98 " " ZBX_CONFIG_CACHE_RELOAD " Reload configuration cache",
99 " " ZBX_HOUSEKEEPER_EXECUTE " Execute the housekeeper",
100 " " ZBX_LOG_LEVEL_INCREASE "=target Increase log level, affects all processes if",
101 " target is not specified",
102 " " ZBX_LOG_LEVEL_DECREASE "=target Decrease log level, affects all processes if",
103 " target is not specified",
104 "",
105 " Log level control targets:",
106 " process-type All processes of specified type",
107 " (alerter, alert manager, configuration syncer,",
108 " discoverer, escalator, history syncer,",
109 " housekeeper, http poller, icmp pinger,",
110 " ipmi manager, ipmi poller, java poller,",
111 " poller, preprocessing manager,",
112 " preprocessing worker, proxy poller,",
113 " self-monitoring, snmp trapper, task manager,",
114 " timer, trapper, unreachable poller,",
115 " vmware collector)",
116 " process-type,N Process type and number (e.g., poller,3)",
117 " pid Process identifier, up to 65535. For larger",
118 " values specify target as \"process-type,N\"",
119 "",
120 " -h --help Display this help message",
121 " -V --version Display version number",
122 "",
123 "Some configuration parameter default locations:",
124 " AlertScriptsPath \"" DEFAULT_ALERT_SCRIPTS_PATH "\"",
125 " ExternalScripts \"" DEFAULT_EXTERNAL_SCRIPTS_PATH "\"",
126 #ifdef HAVE_LIBCURL
127 " SSLCertLocation \"" DEFAULT_SSL_CERT_LOCATION "\"",
128 " SSLKeyLocation \"" DEFAULT_SSL_KEY_LOCATION "\"",
129 #endif
130 " LoadModulePath \"" DEFAULT_LOAD_MODULE_PATH "\"",
131 NULL /* end of text */
132 };
133
134 /* COMMAND LINE OPTIONS */
135
136 /* long options */
137 static struct zbx_option longopts[] =
138 {
139 {"config", 1, NULL, 'c'},
140 {"foreground", 0, NULL, 'f'},
141 {"runtime-control", 1, NULL, 'R'},
142 {"help", 0, NULL, 'h'},
143 {"version", 0, NULL, 'V'},
144 {NULL}
145 };
146
147 /* short options */
148 static char shortopts[] = "c:hVR:f";
149
150 /* end of COMMAND LINE OPTIONS */
151
152 int threads_num = 0;
153 pid_t *threads = NULL;
154 static int *threads_flags;
155
156 unsigned char program_type = ZBX_PROGRAM_TYPE_SERVER;
157 unsigned char process_type = ZBX_PROCESS_TYPE_UNKNOWN;
158 int process_num = 0;
159 int server_num = 0;
160
161 int CONFIG_ALERTER_FORKS = 3;
162 int CONFIG_DISCOVERER_FORKS = 1;
163 int CONFIG_HOUSEKEEPER_FORKS = 1;
164 int CONFIG_PINGER_FORKS = 1;
165 int CONFIG_POLLER_FORKS = 5;
166 int CONFIG_UNREACHABLE_POLLER_FORKS = 1;
167 int CONFIG_HTTPPOLLER_FORKS = 1;
168 int CONFIG_IPMIPOLLER_FORKS = 0;
169 int CONFIG_TIMER_FORKS = 1;
170 int CONFIG_TRAPPER_FORKS = 5;
171 int CONFIG_SNMPTRAPPER_FORKS = 0;
172 int CONFIG_JAVAPOLLER_FORKS = 0;
173 int CONFIG_ESCALATOR_FORKS = 1;
174 int CONFIG_SELFMON_FORKS = 1;
175 int CONFIG_DATASENDER_FORKS = 0;
176 int CONFIG_HEARTBEAT_FORKS = 0;
177 int CONFIG_COLLECTOR_FORKS = 0;
178 int CONFIG_PASSIVE_FORKS = 0;
179 int CONFIG_ACTIVE_FORKS = 0;
180 int CONFIG_TASKMANAGER_FORKS = 1;
181 int CONFIG_IPMIMANAGER_FORKS = 0;
182 int CONFIG_ALERTMANAGER_FORKS = 1;
183 int CONFIG_PREPROCMAN_FORKS = 1;
184 int CONFIG_PREPROCESSOR_FORKS = 3;
185
186 int CONFIG_LISTEN_PORT = ZBX_DEFAULT_SERVER_PORT;
187 char *CONFIG_LISTEN_IP = NULL;
188 char *CONFIG_SOURCE_IP = NULL;
189 int CONFIG_TRAPPER_TIMEOUT = 300;
190 char *CONFIG_SERVER = NULL; /* not used in zabbix_server, required for linking */
191
192 int CONFIG_HOUSEKEEPING_FREQUENCY = 1;
193 int CONFIG_MAX_HOUSEKEEPER_DELETE = 5000; /* applies for every separate field value */
194 int CONFIG_HISTSYNCER_FORKS = 4;
195 int CONFIG_HISTSYNCER_FREQUENCY = 1;
196 int CONFIG_CONFSYNCER_FORKS = 1;
197 int CONFIG_CONFSYNCER_FREQUENCY = 60;
198
199 int CONFIG_VMWARE_FORKS = 0;
200 int CONFIG_VMWARE_FREQUENCY = 60;
201 int CONFIG_VMWARE_PERF_FREQUENCY = 60;
202 int CONFIG_VMWARE_TIMEOUT = 10;
203
204 zbx_uint64_t CONFIG_CONF_CACHE_SIZE = 8 * ZBX_MEBIBYTE;
205 zbx_uint64_t CONFIG_HISTORY_CACHE_SIZE = 16 * ZBX_MEBIBYTE;
206 zbx_uint64_t CONFIG_HISTORY_INDEX_CACHE_SIZE = 4 * ZBX_MEBIBYTE;
207 zbx_uint64_t CONFIG_TRENDS_CACHE_SIZE = 4 * ZBX_MEBIBYTE;
208 zbx_uint64_t CONFIG_VALUE_CACHE_SIZE = 8 * ZBX_MEBIBYTE;
209 zbx_uint64_t CONFIG_VMWARE_CACHE_SIZE = 8 * ZBX_MEBIBYTE;
210 zbx_uint64_t CONFIG_EXPORT_FILE_SIZE = ZBX_GIBIBYTE;
211
212 int CONFIG_UNREACHABLE_PERIOD = 45;
213 int CONFIG_UNREACHABLE_DELAY = 15;
214 int CONFIG_UNAVAILABLE_DELAY = 60;
215 int CONFIG_LOG_LEVEL = LOG_LEVEL_WARNING;
216 char *CONFIG_ALERT_SCRIPTS_PATH = NULL;
217 char *CONFIG_EXTERNALSCRIPTS = NULL;
218 char *CONFIG_TMPDIR = NULL;
219 char *CONFIG_FPING_LOCATION = NULL;
220 char *CONFIG_FPING6_LOCATION = NULL;
221 char *CONFIG_DBHOST = NULL;
222 char *CONFIG_DBNAME = NULL;
223 char *CONFIG_DBSCHEMA = NULL;
224 char *CONFIG_DBUSER = NULL;
225 char *CONFIG_DBPASSWORD = NULL;
226 char *CONFIG_DBSOCKET = NULL;
227 char *CONFIG_EXPORT_DIR = NULL;
228 int CONFIG_DBPORT = 0;
229 int CONFIG_ENABLE_REMOTE_COMMANDS = 0;
230 int CONFIG_LOG_REMOTE_COMMANDS = 0;
231 int CONFIG_UNSAFE_USER_PARAMETERS = 0;
232
233 char *CONFIG_SNMPTRAP_FILE = NULL;
234
235 char *CONFIG_JAVA_GATEWAY = NULL;
236 int CONFIG_JAVA_GATEWAY_PORT = ZBX_DEFAULT_GATEWAY_PORT;
237
238 char *CONFIG_SSH_KEY_LOCATION = NULL;
239
240 int CONFIG_LOG_SLOW_QUERIES = 0; /* ms; 0 - disable */
241
242 int CONFIG_SERVER_STARTUP_TIME = 0; /* zabbix server startup time */
243
244 int CONFIG_PROXYPOLLER_FORKS = 1; /* parameters for passive proxies */
245
246 /* how often Zabbix server sends configuration data to proxy, in seconds */
247 int CONFIG_PROXYCONFIG_FREQUENCY = SEC_PER_HOUR;
248 int CONFIG_PROXYDATA_FREQUENCY = 1; /* 1s */
249
250 char *CONFIG_LOAD_MODULE_PATH = NULL;
251 char **CONFIG_LOAD_MODULE = NULL;
252
253 char *CONFIG_USER = NULL;
254
255 /* web monitoring */
256 char *CONFIG_SSL_CA_LOCATION = NULL;
257 char *CONFIG_SSL_CERT_LOCATION = NULL;
258 char *CONFIG_SSL_KEY_LOCATION = NULL;
259
260 /* TLS parameters */
261 unsigned int configured_tls_connect_mode = ZBX_TCP_SEC_UNENCRYPTED; /* not used in server, defined for linking */
262 /* with tls.c */
263 unsigned int configured_tls_accept_modes = ZBX_TCP_SEC_UNENCRYPTED; /* not used in server, defined for linking */
264 /* with tls.c */
265 char *CONFIG_TLS_CA_FILE = NULL;
266 char *CONFIG_TLS_CRL_FILE = NULL;
267 char *CONFIG_TLS_CERT_FILE = NULL;
268 char *CONFIG_TLS_KEY_FILE = NULL;
269 char *CONFIG_TLS_CIPHER_CERT13 = NULL;
270 char *CONFIG_TLS_CIPHER_CERT = NULL;
271 char *CONFIG_TLS_CIPHER_PSK13 = NULL;
272 char *CONFIG_TLS_CIPHER_PSK = NULL;
273 char *CONFIG_TLS_CIPHER_ALL13 = NULL;
274 char *CONFIG_TLS_CIPHER_ALL = NULL;
275 char *CONFIG_TLS_CIPHER_CMD13 = NULL; /* not used in server, defined for linking with tls.c */
276 char *CONFIG_TLS_CIPHER_CMD = NULL; /* not used in server, defined for linking with tls.c */
277 #if defined(HAVE_POLARSSL) || defined(HAVE_GNUTLS) || defined(HAVE_OPENSSL)
278 /* the following TLS parameters are not used in server, they are defined for linking with tls.c */
279 char *CONFIG_TLS_CONNECT = NULL;
280 char *CONFIG_TLS_ACCEPT = NULL;
281 char *CONFIG_TLS_SERVER_CERT_ISSUER = NULL;
282 char *CONFIG_TLS_SERVER_CERT_SUBJECT = NULL;
283 char *CONFIG_TLS_PSK_IDENTITY = NULL;
284 char *CONFIG_TLS_PSK_FILE = NULL;
285 #endif
286
287 static char *CONFIG_SOCKET_PATH = NULL;
288
289 char *CONFIG_HISTORY_STORAGE_URL = NULL;
290 char *CONFIG_HISTORY_STORAGE_OPTS = NULL;
291 int CONFIG_HISTORY_STORAGE_PIPELINES = 0;
292
293 char *CONFIG_STATS_ALLOWED_IP = NULL;
294
295 int get_process_info_by_thread(int local_server_num, unsigned char *local_process_type, int *local_process_num);
296
get_process_info_by_thread(int local_server_num,unsigned char * local_process_type,int * local_process_num)297 int get_process_info_by_thread(int local_server_num, unsigned char *local_process_type, int *local_process_num)
298 {
299 int server_count = 0;
300
301 if (0 == local_server_num)
302 {
303 /* fail if the main process is queried */
304 return FAIL;
305 }
306 else if (local_server_num <= (server_count += CONFIG_CONFSYNCER_FORKS))
307 {
308 /* make initial configuration sync before worker processes are forked */
309 *local_process_type = ZBX_PROCESS_TYPE_CONFSYNCER;
310 *local_process_num = local_server_num - server_count + CONFIG_CONFSYNCER_FORKS;
311 }
312 else if (local_server_num <= (server_count += CONFIG_IPMIMANAGER_FORKS))
313 {
314 *local_process_type = ZBX_PROCESS_TYPE_IPMIMANAGER;
315 *local_process_num = local_server_num - server_count + CONFIG_TASKMANAGER_FORKS;
316 }
317 else if (local_server_num <= (server_count += CONFIG_HOUSEKEEPER_FORKS))
318 {
319 *local_process_type = ZBX_PROCESS_TYPE_HOUSEKEEPER;
320 *local_process_num = local_server_num - server_count + CONFIG_HOUSEKEEPER_FORKS;
321 }
322 else if (local_server_num <= (server_count += CONFIG_TIMER_FORKS))
323 {
324 *local_process_type = ZBX_PROCESS_TYPE_TIMER;
325 *local_process_num = local_server_num - server_count + CONFIG_TIMER_FORKS;
326 }
327 else if (local_server_num <= (server_count += CONFIG_HTTPPOLLER_FORKS))
328 {
329 *local_process_type = ZBX_PROCESS_TYPE_HTTPPOLLER;
330 *local_process_num = local_server_num - server_count + CONFIG_HTTPPOLLER_FORKS;
331 }
332 else if (local_server_num <= (server_count += CONFIG_DISCOVERER_FORKS))
333 {
334 *local_process_type = ZBX_PROCESS_TYPE_DISCOVERER;
335 *local_process_num = local_server_num - server_count + CONFIG_DISCOVERER_FORKS;
336 }
337 else if (local_server_num <= (server_count += CONFIG_HISTSYNCER_FORKS))
338 {
339 *local_process_type = ZBX_PROCESS_TYPE_HISTSYNCER;
340 *local_process_num = local_server_num - server_count + CONFIG_HISTSYNCER_FORKS;
341 }
342 else if (local_server_num <= (server_count += CONFIG_ESCALATOR_FORKS))
343 {
344 *local_process_type = ZBX_PROCESS_TYPE_ESCALATOR;
345 *local_process_num = local_server_num - server_count + CONFIG_ESCALATOR_FORKS;
346 }
347 else if (local_server_num <= (server_count += CONFIG_IPMIPOLLER_FORKS))
348 {
349 *local_process_type = ZBX_PROCESS_TYPE_IPMIPOLLER;
350 *local_process_num = local_server_num - server_count + CONFIG_IPMIPOLLER_FORKS;
351 }
352 else if (local_server_num <= (server_count += CONFIG_JAVAPOLLER_FORKS))
353 {
354 *local_process_type = ZBX_PROCESS_TYPE_JAVAPOLLER;
355 *local_process_num = local_server_num - server_count + CONFIG_JAVAPOLLER_FORKS;
356 }
357 else if (local_server_num <= (server_count += CONFIG_SNMPTRAPPER_FORKS))
358 {
359 *local_process_type = ZBX_PROCESS_TYPE_SNMPTRAPPER;
360 *local_process_num = local_server_num - server_count + CONFIG_SNMPTRAPPER_FORKS;
361 }
362 else if (local_server_num <= (server_count += CONFIG_PROXYPOLLER_FORKS))
363 {
364 *local_process_type = ZBX_PROCESS_TYPE_PROXYPOLLER;
365 *local_process_num = local_server_num - server_count + CONFIG_PROXYPOLLER_FORKS;
366 }
367 else if (local_server_num <= (server_count += CONFIG_SELFMON_FORKS))
368 {
369 *local_process_type = ZBX_PROCESS_TYPE_SELFMON;
370 *local_process_num = local_server_num - server_count + CONFIG_SELFMON_FORKS;
371 }
372 else if (local_server_num <= (server_count += CONFIG_VMWARE_FORKS))
373 {
374 *local_process_type = ZBX_PROCESS_TYPE_VMWARE;
375 *local_process_num = local_server_num - server_count + CONFIG_VMWARE_FORKS;
376 }
377 else if (local_server_num <= (server_count += CONFIG_TASKMANAGER_FORKS))
378 {
379 *local_process_type = ZBX_PROCESS_TYPE_TASKMANAGER;
380 *local_process_num = local_server_num - server_count + CONFIG_TASKMANAGER_FORKS;
381 }
382 else if (local_server_num <= (server_count += CONFIG_POLLER_FORKS))
383 {
384 *local_process_type = ZBX_PROCESS_TYPE_POLLER;
385 *local_process_num = local_server_num - server_count + CONFIG_POLLER_FORKS;
386 }
387 else if (local_server_num <= (server_count += CONFIG_UNREACHABLE_POLLER_FORKS))
388 {
389 *local_process_type = ZBX_PROCESS_TYPE_UNREACHABLE;
390 *local_process_num = local_server_num - server_count + CONFIG_UNREACHABLE_POLLER_FORKS;
391 }
392 else if (local_server_num <= (server_count += CONFIG_TRAPPER_FORKS))
393 {
394 *local_process_type = ZBX_PROCESS_TYPE_TRAPPER;
395 *local_process_num = local_server_num - server_count + CONFIG_TRAPPER_FORKS;
396 }
397 else if (local_server_num <= (server_count += CONFIG_PINGER_FORKS))
398 {
399 *local_process_type = ZBX_PROCESS_TYPE_PINGER;
400 *local_process_num = local_server_num - server_count + CONFIG_PINGER_FORKS;
401 }
402 else if (local_server_num <= (server_count += CONFIG_ALERTMANAGER_FORKS))
403 {
404 *local_process_type = ZBX_PROCESS_TYPE_ALERTMANAGER;
405 *local_process_num = local_server_num - server_count + CONFIG_ALERTMANAGER_FORKS;
406 }
407 else if (local_server_num <= (server_count += CONFIG_ALERTER_FORKS))
408 {
409 *local_process_type = ZBX_PROCESS_TYPE_ALERTER;
410 *local_process_num = local_server_num - server_count + CONFIG_ALERTER_FORKS;
411 }
412 else if (local_server_num <= (server_count += CONFIG_PREPROCMAN_FORKS))
413 {
414 *local_process_type = ZBX_PROCESS_TYPE_PREPROCMAN;
415 *local_process_num = local_server_num - server_count + CONFIG_PREPROCMAN_FORKS;
416 }
417 else if (local_server_num <= (server_count += CONFIG_PREPROCESSOR_FORKS))
418 {
419 *local_process_type = ZBX_PROCESS_TYPE_PREPROCESSOR;
420 *local_process_num = local_server_num - server_count + CONFIG_PREPROCESSOR_FORKS;
421 }
422 else
423 return FAIL;
424
425 return SUCCEED;
426 }
427
428 /******************************************************************************
429 * *
430 * Function: zbx_set_defaults *
431 * *
432 * Purpose: set configuration defaults *
433 * *
434 * Author: Vladimir Levijev *
435 * *
436 ******************************************************************************/
zbx_set_defaults(void)437 static void zbx_set_defaults(void)
438 {
439 CONFIG_SERVER_STARTUP_TIME = time(NULL);
440
441 if (NULL == CONFIG_DBHOST)
442 CONFIG_DBHOST = zbx_strdup(CONFIG_DBHOST, "localhost");
443
444 if (NULL == CONFIG_SNMPTRAP_FILE)
445 CONFIG_SNMPTRAP_FILE = zbx_strdup(CONFIG_SNMPTRAP_FILE, "/tmp/zabbix_traps.tmp");
446
447 if (NULL == CONFIG_PID_FILE)
448 CONFIG_PID_FILE = zbx_strdup(CONFIG_PID_FILE, "/tmp/zabbix_server.pid");
449
450 if (NULL == CONFIG_ALERT_SCRIPTS_PATH)
451 CONFIG_ALERT_SCRIPTS_PATH = zbx_strdup(CONFIG_ALERT_SCRIPTS_PATH, DEFAULT_ALERT_SCRIPTS_PATH);
452
453 if (NULL == CONFIG_LOAD_MODULE_PATH)
454 CONFIG_LOAD_MODULE_PATH = zbx_strdup(CONFIG_LOAD_MODULE_PATH, DEFAULT_LOAD_MODULE_PATH);
455
456 if (NULL == CONFIG_TMPDIR)
457 CONFIG_TMPDIR = zbx_strdup(CONFIG_TMPDIR, "/tmp");
458
459 if (NULL == CONFIG_FPING_LOCATION)
460 CONFIG_FPING_LOCATION = zbx_strdup(CONFIG_FPING_LOCATION, "/usr/local/sbin/fping");
461 #ifdef HAVE_IPV6
462 if (NULL == CONFIG_FPING6_LOCATION)
463 CONFIG_FPING6_LOCATION = zbx_strdup(CONFIG_FPING6_LOCATION, "/usr/local/sbin/fping6");
464 #endif
465 if (NULL == CONFIG_EXTERNALSCRIPTS)
466 CONFIG_EXTERNALSCRIPTS = zbx_strdup(CONFIG_EXTERNALSCRIPTS, DEFAULT_EXTERNAL_SCRIPTS_PATH);
467 #ifdef HAVE_LIBCURL
468 if (NULL == CONFIG_SSL_CERT_LOCATION)
469 CONFIG_SSL_CERT_LOCATION = zbx_strdup(CONFIG_SSL_CERT_LOCATION, DEFAULT_SSL_CERT_LOCATION);
470
471 if (NULL == CONFIG_SSL_KEY_LOCATION)
472 CONFIG_SSL_KEY_LOCATION = zbx_strdup(CONFIG_SSL_KEY_LOCATION, DEFAULT_SSL_KEY_LOCATION);
473
474 if (NULL == CONFIG_HISTORY_STORAGE_OPTS)
475 CONFIG_HISTORY_STORAGE_OPTS = zbx_strdup(CONFIG_HISTORY_STORAGE_OPTS, "uint,dbl,str,log,text");
476 #endif
477
478 #ifdef HAVE_SQLITE3
479 CONFIG_MAX_HOUSEKEEPER_DELETE = 0;
480 #endif
481
482 if (NULL == CONFIG_LOG_TYPE_STR)
483 CONFIG_LOG_TYPE_STR = zbx_strdup(CONFIG_LOG_TYPE_STR, ZBX_OPTION_LOGTYPE_FILE);
484
485 if (NULL == CONFIG_SOCKET_PATH)
486 CONFIG_SOCKET_PATH = zbx_strdup(CONFIG_SOCKET_PATH, "/tmp");
487
488 if (0 != CONFIG_IPMIPOLLER_FORKS)
489 CONFIG_IPMIMANAGER_FORKS = 1;
490 }
491
492 /******************************************************************************
493 * *
494 * Function: zbx_validate_config *
495 * *
496 * Purpose: validate configuration parameters *
497 * *
498 * Author: Vladimir Levijev *
499 * *
500 ******************************************************************************/
zbx_validate_config(ZBX_TASK_EX * task)501 static void zbx_validate_config(ZBX_TASK_EX *task)
502 {
503 char *ch_error;
504 int err = 0;
505
506 if (0 == CONFIG_UNREACHABLE_POLLER_FORKS && 0 != CONFIG_POLLER_FORKS + CONFIG_JAVAPOLLER_FORKS)
507 {
508 zabbix_log(LOG_LEVEL_CRIT, "\"StartPollersUnreachable\" configuration parameter must not be 0"
509 " if regular or Java pollers are started");
510 err = 1;
511 }
512
513 if ((NULL == CONFIG_JAVA_GATEWAY || '\0' == *CONFIG_JAVA_GATEWAY) && 0 < CONFIG_JAVAPOLLER_FORKS)
514 {
515 zabbix_log(LOG_LEVEL_CRIT, "\"JavaGateway\" configuration parameter is not specified or empty");
516 err = 1;
517 }
518
519 if (0 != CONFIG_VALUE_CACHE_SIZE && 128 * ZBX_KIBIBYTE > CONFIG_VALUE_CACHE_SIZE)
520 {
521 zabbix_log(LOG_LEVEL_CRIT, "\"ValueCacheSize\" configuration parameter must be either 0"
522 " or greater than 128KB");
523 err = 1;
524 }
525
526 if (NULL != CONFIG_SOURCE_IP && SUCCEED != is_supported_ip(CONFIG_SOURCE_IP))
527 {
528 zabbix_log(LOG_LEVEL_CRIT, "invalid \"SourceIP\" configuration parameter: '%s'", CONFIG_SOURCE_IP);
529 err = 1;
530 }
531
532 if (NULL != CONFIG_STATS_ALLOWED_IP && FAIL == zbx_validate_peer_list(CONFIG_STATS_ALLOWED_IP, &ch_error))
533 {
534 zabbix_log(LOG_LEVEL_CRIT, "invalid entry in \"StatsAllowedIP\" configuration parameter: %s", ch_error);
535 zbx_free(ch_error);
536 err = 1;
537 }
538 #if !defined(HAVE_IPV6)
539 err |= (FAIL == check_cfg_feature_str("Fping6Location", CONFIG_FPING6_LOCATION, "IPv6 support"));
540 #endif
541 #if !defined(HAVE_LIBCURL)
542 err |= (FAIL == check_cfg_feature_str("SSLCALocation", CONFIG_SSL_CA_LOCATION, "cURL library"));
543 err |= (FAIL == check_cfg_feature_str("SSLCertLocation", CONFIG_SSL_CERT_LOCATION, "cURL library"));
544 err |= (FAIL == check_cfg_feature_str("SSLKeyLocation", CONFIG_SSL_KEY_LOCATION, "cURL library"));
545 err |= (FAIL == check_cfg_feature_str("HistoryStorageURL", CONFIG_HISTORY_STORAGE_URL, "cURL library"));
546 err |= (FAIL == check_cfg_feature_str("HistoryStorageTypes", CONFIG_HISTORY_STORAGE_OPTS, "cURL library"));
547 err |= (FAIL == check_cfg_feature_int("HistoryStorageDateIndex", CONFIG_HISTORY_STORAGE_PIPELINES,
548 "cURL library"));
549 #endif
550
551 #if !defined(HAVE_LIBXML2) || !defined(HAVE_LIBCURL)
552 err |= (FAIL == check_cfg_feature_int("StartVMwareCollectors", CONFIG_VMWARE_FORKS, "VMware support"));
553
554 /* parameters VMwareFrequency, VMwarePerfFrequency, VMwareCacheSize, VMwareTimeout are not checked here */
555 /* because they have non-zero default values */
556 #endif
557
558 if (SUCCEED != zbx_validate_log_parameters(task))
559 err = 1;
560
561 #if !(defined(HAVE_POLARSSL) || defined(HAVE_GNUTLS) || defined(HAVE_OPENSSL))
562 err |= (FAIL == check_cfg_feature_str("TLSCAFile", CONFIG_TLS_CA_FILE, "TLS support"));
563 err |= (FAIL == check_cfg_feature_str("TLSCRLFile", CONFIG_TLS_CRL_FILE, "TLS support"));
564 err |= (FAIL == check_cfg_feature_str("TLSCertFile", CONFIG_TLS_CERT_FILE, "TLS support"));
565 err |= (FAIL == check_cfg_feature_str("TLSKeyFile", CONFIG_TLS_KEY_FILE, "TLS support"));
566 #endif
567 #if !(defined(HAVE_GNUTLS) || defined(HAVE_OPENSSL))
568 err |= (FAIL == check_cfg_feature_str("TLSCipherCert", CONFIG_TLS_CIPHER_CERT, "GnuTLS or OpenSSL"));
569 err |= (FAIL == check_cfg_feature_str("TLSCipherPSK", CONFIG_TLS_CIPHER_PSK, "GnuTLS or OpenSSL"));
570 err |= (FAIL == check_cfg_feature_str("TLSCipherAll", CONFIG_TLS_CIPHER_ALL, "GnuTLS or OpenSSL"));
571 #endif
572 #if !defined(HAVE_OPENSSL)
573 err |= (FAIL == check_cfg_feature_str("TLSCipherCert13", CONFIG_TLS_CIPHER_CERT13, "OpenSSL 1.1.1 or newer"));
574 err |= (FAIL == check_cfg_feature_str("TLSCipherPSK13", CONFIG_TLS_CIPHER_PSK13, "OpenSSL 1.1.1 or newer"));
575 err |= (FAIL == check_cfg_feature_str("TLSCipherAll13", CONFIG_TLS_CIPHER_ALL13, "OpenSSL 1.1.1 or newer"));
576 #endif
577
578 #if !defined(HAVE_OPENIPMI)
579 err |= (FAIL == check_cfg_feature_int("StartIPMIPollers", CONFIG_IPMIPOLLER_FORKS, "IPMI support"));
580 #endif
581 if (0 != err)
582 exit(EXIT_FAILURE);
583 }
584
585 /******************************************************************************
586 * *
587 * Function: zbx_load_config *
588 * *
589 * Purpose: parse config file and update configuration parameters *
590 * *
591 * Parameters: *
592 * *
593 * Return value: *
594 * *
595 * Author: Alexei Vladishev *
596 * *
597 * Comments: will terminate process if parsing fails *
598 * *
599 ******************************************************************************/
zbx_load_config(ZBX_TASK_EX * task)600 static void zbx_load_config(ZBX_TASK_EX *task)
601 {
602 static struct cfg_line cfg[] =
603 {
604 /* PARAMETER, VAR, TYPE,
605 MANDATORY, MIN, MAX */
606 {"StartDBSyncers", &CONFIG_HISTSYNCER_FORKS, TYPE_INT,
607 PARM_OPT, 1, 100},
608 {"StartDiscoverers", &CONFIG_DISCOVERER_FORKS, TYPE_INT,
609 PARM_OPT, 0, 250},
610 {"StartHTTPPollers", &CONFIG_HTTPPOLLER_FORKS, TYPE_INT,
611 PARM_OPT, 0, 1000},
612 {"StartPingers", &CONFIG_PINGER_FORKS, TYPE_INT,
613 PARM_OPT, 0, 1000},
614 {"StartPollers", &CONFIG_POLLER_FORKS, TYPE_INT,
615 PARM_OPT, 0, 1000},
616 {"StartPollersUnreachable", &CONFIG_UNREACHABLE_POLLER_FORKS, TYPE_INT,
617 PARM_OPT, 0, 1000},
618 {"StartIPMIPollers", &CONFIG_IPMIPOLLER_FORKS, TYPE_INT,
619 PARM_OPT, 0, 1000},
620 {"StartTimers", &CONFIG_TIMER_FORKS, TYPE_INT,
621 PARM_OPT, 1, 1000},
622 {"StartTrappers", &CONFIG_TRAPPER_FORKS, TYPE_INT,
623 PARM_OPT, 0, 1000},
624 {"StartJavaPollers", &CONFIG_JAVAPOLLER_FORKS, TYPE_INT,
625 PARM_OPT, 0, 1000},
626 {"StartEscalators", &CONFIG_ESCALATOR_FORKS, TYPE_INT,
627 PARM_OPT, 1, 100},
628 {"JavaGateway", &CONFIG_JAVA_GATEWAY, TYPE_STRING,
629 PARM_OPT, 0, 0},
630 {"JavaGatewayPort", &CONFIG_JAVA_GATEWAY_PORT, TYPE_INT,
631 PARM_OPT, 1024, 32767},
632 {"SNMPTrapperFile", &CONFIG_SNMPTRAP_FILE, TYPE_STRING,
633 PARM_OPT, 0, 0},
634 {"StartSNMPTrapper", &CONFIG_SNMPTRAPPER_FORKS, TYPE_INT,
635 PARM_OPT, 0, 1},
636 {"CacheSize", &CONFIG_CONF_CACHE_SIZE, TYPE_UINT64,
637 PARM_OPT, 128 * ZBX_KIBIBYTE, __UINT64_C(64) * ZBX_GIBIBYTE},
638 {"HistoryCacheSize", &CONFIG_HISTORY_CACHE_SIZE, TYPE_UINT64,
639 PARM_OPT, 128 * ZBX_KIBIBYTE, __UINT64_C(2) * ZBX_GIBIBYTE},
640 {"HistoryIndexCacheSize", &CONFIG_HISTORY_INDEX_CACHE_SIZE, TYPE_UINT64,
641 PARM_OPT, 128 * ZBX_KIBIBYTE, __UINT64_C(2) * ZBX_GIBIBYTE},
642 {"TrendCacheSize", &CONFIG_TRENDS_CACHE_SIZE, TYPE_UINT64,
643 PARM_OPT, 128 * ZBX_KIBIBYTE, __UINT64_C(2) * ZBX_GIBIBYTE},
644 {"ValueCacheSize", &CONFIG_VALUE_CACHE_SIZE, TYPE_UINT64,
645 PARM_OPT, 0, __UINT64_C(64) * ZBX_GIBIBYTE},
646 {"CacheUpdateFrequency", &CONFIG_CONFSYNCER_FREQUENCY, TYPE_INT,
647 PARM_OPT, 1, SEC_PER_HOUR},
648 {"HousekeepingFrequency", &CONFIG_HOUSEKEEPING_FREQUENCY, TYPE_INT,
649 PARM_OPT, 0, 24},
650 {"MaxHousekeeperDelete", &CONFIG_MAX_HOUSEKEEPER_DELETE, TYPE_INT,
651 PARM_OPT, 0, 1000000},
652 {"TmpDir", &CONFIG_TMPDIR, TYPE_STRING,
653 PARM_OPT, 0, 0},
654 {"FpingLocation", &CONFIG_FPING_LOCATION, TYPE_STRING,
655 PARM_OPT, 0, 0},
656 {"Fping6Location", &CONFIG_FPING6_LOCATION, TYPE_STRING,
657 PARM_OPT, 0, 0},
658 {"Timeout", &CONFIG_TIMEOUT, TYPE_INT,
659 PARM_OPT, 1, 30},
660 {"TrapperTimeout", &CONFIG_TRAPPER_TIMEOUT, TYPE_INT,
661 PARM_OPT, 1, 300},
662 {"UnreachablePeriod", &CONFIG_UNREACHABLE_PERIOD, TYPE_INT,
663 PARM_OPT, 1, SEC_PER_HOUR},
664 {"UnreachableDelay", &CONFIG_UNREACHABLE_DELAY, TYPE_INT,
665 PARM_OPT, 1, SEC_PER_HOUR},
666 {"UnavailableDelay", &CONFIG_UNAVAILABLE_DELAY, TYPE_INT,
667 PARM_OPT, 1, SEC_PER_HOUR},
668 {"ListenIP", &CONFIG_LISTEN_IP, TYPE_STRING_LIST,
669 PARM_OPT, 0, 0},
670 {"ListenPort", &CONFIG_LISTEN_PORT, TYPE_INT,
671 PARM_OPT, 1024, 32767},
672 {"SourceIP", &CONFIG_SOURCE_IP, TYPE_STRING,
673 PARM_OPT, 0, 0},
674 {"DebugLevel", &CONFIG_LOG_LEVEL, TYPE_INT,
675 PARM_OPT, 0, 5},
676 {"PidFile", &CONFIG_PID_FILE, TYPE_STRING,
677 PARM_OPT, 0, 0},
678 {"LogType", &CONFIG_LOG_TYPE_STR, TYPE_STRING,
679 PARM_OPT, 0, 0},
680 {"LogFile", &CONFIG_LOG_FILE, TYPE_STRING,
681 PARM_OPT, 0, 0},
682 {"LogFileSize", &CONFIG_LOG_FILE_SIZE, TYPE_INT,
683 PARM_OPT, 0, 1024},
684 {"AlertScriptsPath", &CONFIG_ALERT_SCRIPTS_PATH, TYPE_STRING,
685 PARM_OPT, 0, 0},
686 {"ExternalScripts", &CONFIG_EXTERNALSCRIPTS, TYPE_STRING,
687 PARM_OPT, 0, 0},
688 {"DBHost", &CONFIG_DBHOST, TYPE_STRING,
689 PARM_OPT, 0, 0},
690 {"DBName", &CONFIG_DBNAME, TYPE_STRING,
691 PARM_MAND, 0, 0},
692 {"DBSchema", &CONFIG_DBSCHEMA, TYPE_STRING,
693 PARM_OPT, 0, 0},
694 {"DBUser", &CONFIG_DBUSER, TYPE_STRING,
695 PARM_OPT, 0, 0},
696 {"DBPassword", &CONFIG_DBPASSWORD, TYPE_STRING,
697 PARM_OPT, 0, 0},
698 {"DBSocket", &CONFIG_DBSOCKET, TYPE_STRING,
699 PARM_OPT, 0, 0},
700 {"DBPort", &CONFIG_DBPORT, TYPE_INT,
701 PARM_OPT, 1024, 65535},
702 {"SSHKeyLocation", &CONFIG_SSH_KEY_LOCATION, TYPE_STRING,
703 PARM_OPT, 0, 0},
704 {"LogSlowQueries", &CONFIG_LOG_SLOW_QUERIES, TYPE_INT,
705 PARM_OPT, 0, 3600000},
706 {"StartProxyPollers", &CONFIG_PROXYPOLLER_FORKS, TYPE_INT,
707 PARM_OPT, 0, 250},
708 {"ProxyConfigFrequency", &CONFIG_PROXYCONFIG_FREQUENCY, TYPE_INT,
709 PARM_OPT, 1, SEC_PER_WEEK},
710 {"ProxyDataFrequency", &CONFIG_PROXYDATA_FREQUENCY, TYPE_INT,
711 PARM_OPT, 1, SEC_PER_HOUR},
712 {"LoadModulePath", &CONFIG_LOAD_MODULE_PATH, TYPE_STRING,
713 PARM_OPT, 0, 0},
714 {"LoadModule", &CONFIG_LOAD_MODULE, TYPE_MULTISTRING,
715 PARM_OPT, 0, 0},
716 {"StartVMwareCollectors", &CONFIG_VMWARE_FORKS, TYPE_INT,
717 PARM_OPT, 0, 250},
718 {"VMwareFrequency", &CONFIG_VMWARE_FREQUENCY, TYPE_INT,
719 PARM_OPT, 10, SEC_PER_DAY},
720 {"VMwarePerfFrequency", &CONFIG_VMWARE_PERF_FREQUENCY, TYPE_INT,
721 PARM_OPT, 10, SEC_PER_DAY},
722 {"VMwareCacheSize", &CONFIG_VMWARE_CACHE_SIZE, TYPE_UINT64,
723 PARM_OPT, 256 * ZBX_KIBIBYTE, __UINT64_C(2) * ZBX_GIBIBYTE},
724 {"VMwareTimeout", &CONFIG_VMWARE_TIMEOUT, TYPE_INT,
725 PARM_OPT, 1, 300},
726 {"AllowRoot", &CONFIG_ALLOW_ROOT, TYPE_INT,
727 PARM_OPT, 0, 1},
728 {"User", &CONFIG_USER, TYPE_STRING,
729 PARM_OPT, 0, 0},
730 {"SSLCALocation", &CONFIG_SSL_CA_LOCATION, TYPE_STRING,
731 PARM_OPT, 0, 0},
732 {"SSLCertLocation", &CONFIG_SSL_CERT_LOCATION, TYPE_STRING,
733 PARM_OPT, 0, 0},
734 {"SSLKeyLocation", &CONFIG_SSL_KEY_LOCATION, TYPE_STRING,
735 PARM_OPT, 0, 0},
736 {"TLSCAFile", &CONFIG_TLS_CA_FILE, TYPE_STRING,
737 PARM_OPT, 0, 0},
738 {"TLSCRLFile", &CONFIG_TLS_CRL_FILE, TYPE_STRING,
739 PARM_OPT, 0, 0},
740 {"TLSCertFile", &CONFIG_TLS_CERT_FILE, TYPE_STRING,
741 PARM_OPT, 0, 0},
742 {"TLSKeyFile", &CONFIG_TLS_KEY_FILE, TYPE_STRING,
743 PARM_OPT, 0, 0},
744 {"TLSCipherCert13", &CONFIG_TLS_CIPHER_CERT13, TYPE_STRING,
745 PARM_OPT, 0, 0},
746 {"TLSCipherCert", &CONFIG_TLS_CIPHER_CERT, TYPE_STRING,
747 PARM_OPT, 0, 0},
748 {"TLSCipherPSK13", &CONFIG_TLS_CIPHER_PSK13, TYPE_STRING,
749 PARM_OPT, 0, 0},
750 {"TLSCipherPSK", &CONFIG_TLS_CIPHER_PSK, TYPE_STRING,
751 PARM_OPT, 0, 0},
752 {"TLSCipherAll13", &CONFIG_TLS_CIPHER_ALL13, TYPE_STRING,
753 PARM_OPT, 0, 0},
754 {"TLSCipherAll", &CONFIG_TLS_CIPHER_ALL, TYPE_STRING,
755 PARM_OPT, 0, 0},
756 {"SocketDir", &CONFIG_SOCKET_PATH, TYPE_STRING,
757 PARM_OPT, 0, 0},
758 {"StartAlerters", &CONFIG_ALERTER_FORKS, TYPE_INT,
759 PARM_OPT, 1, 100},
760 {"StartPreprocessors", &CONFIG_PREPROCESSOR_FORKS, TYPE_INT,
761 PARM_OPT, 1, 1000},
762 {"HistoryStorageURL", &CONFIG_HISTORY_STORAGE_URL, TYPE_STRING,
763 PARM_OPT, 0, 0},
764 {"HistoryStorageTypes", &CONFIG_HISTORY_STORAGE_OPTS, TYPE_STRING_LIST,
765 PARM_OPT, 0, 0},
766 {"HistoryStorageDateIndex", &CONFIG_HISTORY_STORAGE_PIPELINES, TYPE_INT,
767 PARM_OPT, 0, 1},
768 {"ExportDir", &CONFIG_EXPORT_DIR, TYPE_STRING,
769 PARM_OPT, 0, 0},
770 {"ExportFileSize", &CONFIG_EXPORT_FILE_SIZE, TYPE_UINT64,
771 PARM_OPT, ZBX_MEBIBYTE, ZBX_GIBIBYTE},
772 {"StatsAllowedIP", &CONFIG_STATS_ALLOWED_IP, TYPE_STRING_LIST,
773 PARM_OPT, 0, 0},
774 {NULL}
775 };
776
777 /* initialize multistrings */
778 zbx_strarr_init(&CONFIG_LOAD_MODULE);
779
780 parse_cfg_file(CONFIG_FILE, cfg, ZBX_CFG_FILE_REQUIRED, ZBX_CFG_STRICT);
781
782 zbx_set_defaults();
783
784 CONFIG_LOG_TYPE = zbx_get_log_type(CONFIG_LOG_TYPE_STR);
785
786 zbx_validate_config(task);
787 #if defined(HAVE_POLARSSL) || defined(HAVE_GNUTLS) || defined(HAVE_OPENSSL)
788 zbx_tls_validate_config();
789 #endif
790 }
791
792 /******************************************************************************
793 * *
794 * Function: zbx_free_config *
795 * *
796 * Purpose: free configuration memory *
797 * *
798 ******************************************************************************/
zbx_free_config(void)799 static void zbx_free_config(void)
800 {
801 zbx_strarr_free(CONFIG_LOAD_MODULE);
802 }
803
804 /******************************************************************************
805 * *
806 * Function: main *
807 * *
808 * Purpose: executes server processes *
809 * *
810 * Author: Eugene Grigorjev *
811 * *
812 ******************************************************************************/
main(int argc,char ** argv)813 int main(int argc, char **argv)
814 {
815 ZBX_TASK_EX t = {ZBX_TASK_START};
816 char ch, *error = NULL;
817 int opt_c = 0, opt_r = 0;
818
819 #if defined(PS_OVERWRITE_ARGV) || defined(PS_PSTAT_ARGV)
820 argv = setproctitle_save_env(argc, argv);
821 #endif
822
823 progname = get_program_name(argv[0]);
824
825 /* parse the command-line */
826 while ((char)EOF != (ch = (char)zbx_getopt_long(argc, argv, shortopts, longopts, NULL)))
827 {
828 switch (ch)
829 {
830 case 'c':
831 opt_c++;
832 if (NULL == CONFIG_FILE)
833 CONFIG_FILE = zbx_strdup(CONFIG_FILE, zbx_optarg);
834 break;
835 case 'R':
836 opt_r++;
837 if (SUCCEED != parse_rtc_options(zbx_optarg, program_type, &t.data))
838 exit(EXIT_FAILURE);
839
840 t.task = ZBX_TASK_RUNTIME_CONTROL;
841 break;
842 case 'h':
843 help();
844 exit(EXIT_SUCCESS);
845 break;
846 case 'V':
847 version();
848 exit(EXIT_SUCCESS);
849 break;
850 case 'f':
851 t.flags |= ZBX_TASK_FLAG_FOREGROUND;
852 break;
853 default:
854 usage();
855 exit(EXIT_FAILURE);
856 break;
857 }
858 }
859
860 /* every option may be specified only once */
861 if (1 < opt_c || 1 < opt_r)
862 {
863 if (1 < opt_c)
864 zbx_error("option \"-c\" or \"--config\" specified multiple times");
865 if (1 < opt_r)
866 zbx_error("option \"-R\" or \"--runtime-control\" specified multiple times");
867
868 exit(EXIT_FAILURE);
869 }
870
871 /* Parameters which are not option values are invalid. The check relies on zbx_getopt_internal() which */
872 /* always permutes command line arguments regardless of POSIXLY_CORRECT environment variable. */
873 if (argc > zbx_optind)
874 {
875 int i;
876
877 for (i = zbx_optind; i < argc; i++)
878 zbx_error("invalid parameter \"%s\"", argv[i]);
879
880 exit(EXIT_FAILURE);
881 }
882
883 if (NULL == CONFIG_FILE)
884 CONFIG_FILE = zbx_strdup(NULL, DEFAULT_CONFIG_FILE);
885
886 /* required for simple checks */
887 init_metrics();
888
889 zbx_load_config(&t);
890
891 if (ZBX_TASK_RUNTIME_CONTROL == t.task)
892 exit(SUCCEED == zbx_sigusr_send(t.data) ? EXIT_SUCCESS : EXIT_FAILURE);
893
894 zbx_initialize_events();
895
896 if (FAIL == zbx_ipc_service_init_env(CONFIG_SOCKET_PATH, &error))
897 {
898 zbx_error("Cannot initialize IPC services: %s", error);
899 zbx_free(error);
900 exit(EXIT_FAILURE);
901 }
902
903 return daemon_start(CONFIG_ALLOW_ROOT, CONFIG_USER, t.flags);
904 }
905
MAIN_ZABBIX_ENTRY(int flags)906 int MAIN_ZABBIX_ENTRY(int flags)
907 {
908 zbx_socket_t listen_sock;
909 char *error = NULL;
910 int i, db_type;
911
912 if (0 != (flags & ZBX_TASK_FLAG_FOREGROUND))
913 {
914 printf("Starting Zabbix Server. Zabbix %s (revision %s).\nPress Ctrl+C to exit.\n\n",
915 ZABBIX_VERSION, ZABBIX_REVISION);
916 }
917
918 if (SUCCEED != zbx_locks_create(&error))
919 {
920 zbx_error("cannot create locks: %s", error);
921 zbx_free(error);
922 exit(EXIT_FAILURE);
923 }
924
925 if (SUCCEED != zabbix_open_log(CONFIG_LOG_TYPE, CONFIG_LOG_LEVEL, CONFIG_LOG_FILE, &error))
926 {
927 zbx_error("cannot open log: %s", error);
928 zbx_free(error);
929 exit(EXIT_FAILURE);
930 }
931
932 #ifdef HAVE_NETSNMP
933 # define SNMP_FEATURE_STATUS "YES"
934 #else
935 # define SNMP_FEATURE_STATUS " NO"
936 #endif
937 #ifdef HAVE_OPENIPMI
938 # define IPMI_FEATURE_STATUS "YES"
939 #else
940 # define IPMI_FEATURE_STATUS " NO"
941 #endif
942 #ifdef HAVE_LIBCURL
943 # define LIBCURL_FEATURE_STATUS "YES"
944 #else
945 # define LIBCURL_FEATURE_STATUS " NO"
946 #endif
947 #if defined(HAVE_LIBCURL) && defined(HAVE_LIBXML2)
948 # define VMWARE_FEATURE_STATUS "YES"
949 #else
950 # define VMWARE_FEATURE_STATUS " NO"
951 #endif
952 #ifdef HAVE_SMTP_AUTHENTICATION
953 # define SMTP_AUTH_FEATURE_STATUS "YES"
954 #else
955 # define SMTP_AUTH_FEATURE_STATUS " NO"
956 #endif
957 #ifdef HAVE_JABBER
958 # define JABBER_FEATURE_STATUS "YES"
959 #else
960 # define JABBER_FEATURE_STATUS " NO"
961 #endif
962 #ifdef HAVE_UNIXODBC
963 # define ODBC_FEATURE_STATUS "YES"
964 #else
965 # define ODBC_FEATURE_STATUS " NO"
966 #endif
967 #if defined(HAVE_SSH2) || defined(HAVE_SSH)
968 # define SSH_FEATURE_STATUS "YES"
969 #else
970 # define SSH_FEATURE_STATUS " NO"
971 #endif
972 #ifdef HAVE_IPV6
973 # define IPV6_FEATURE_STATUS "YES"
974 #else
975 # define IPV6_FEATURE_STATUS " NO"
976 #endif
977 #if defined(HAVE_POLARSSL) || defined(HAVE_GNUTLS) || defined(HAVE_OPENSSL)
978 # define TLS_FEATURE_STATUS "YES"
979 #else
980 # define TLS_FEATURE_STATUS " NO"
981 #endif
982
983 zabbix_log(LOG_LEVEL_INFORMATION, "Starting Zabbix Server. Zabbix %s (revision %s).",
984 ZABBIX_VERSION, ZABBIX_REVISION);
985
986 zabbix_log(LOG_LEVEL_INFORMATION, "****** Enabled features ******");
987 zabbix_log(LOG_LEVEL_INFORMATION, "SNMP monitoring: " SNMP_FEATURE_STATUS);
988 zabbix_log(LOG_LEVEL_INFORMATION, "IPMI monitoring: " IPMI_FEATURE_STATUS);
989 zabbix_log(LOG_LEVEL_INFORMATION, "Web monitoring: " LIBCURL_FEATURE_STATUS);
990 zabbix_log(LOG_LEVEL_INFORMATION, "VMware monitoring: " VMWARE_FEATURE_STATUS);
991 zabbix_log(LOG_LEVEL_INFORMATION, "SMTP authentication: " SMTP_AUTH_FEATURE_STATUS);
992 zabbix_log(LOG_LEVEL_INFORMATION, "Jabber notifications: " JABBER_FEATURE_STATUS);
993 zabbix_log(LOG_LEVEL_INFORMATION, "Ez Texting notifications: " LIBCURL_FEATURE_STATUS);
994 zabbix_log(LOG_LEVEL_INFORMATION, "ODBC: " ODBC_FEATURE_STATUS);
995 zabbix_log(LOG_LEVEL_INFORMATION, "SSH support: " SSH_FEATURE_STATUS);
996 zabbix_log(LOG_LEVEL_INFORMATION, "IPv6 support: " IPV6_FEATURE_STATUS);
997 zabbix_log(LOG_LEVEL_INFORMATION, "TLS support: " TLS_FEATURE_STATUS);
998 zabbix_log(LOG_LEVEL_INFORMATION, "******************************");
999
1000 zabbix_log(LOG_LEVEL_INFORMATION, "using configuration file: %s", CONFIG_FILE);
1001
1002 #if defined(HAVE_POLARSSL) || defined(HAVE_GNUTLS) || defined(HAVE_OPENSSL)
1003 if (SUCCEED != zbx_coredump_disable())
1004 {
1005 zabbix_log(LOG_LEVEL_CRIT, "cannot disable core dump, exiting...");
1006 exit(EXIT_FAILURE);
1007 }
1008 #endif
1009 if (FAIL == zbx_load_modules(CONFIG_LOAD_MODULE_PATH, CONFIG_LOAD_MODULE, CONFIG_TIMEOUT, 1))
1010 {
1011 zabbix_log(LOG_LEVEL_CRIT, "loading modules failed, exiting...");
1012 exit(EXIT_FAILURE);
1013 }
1014
1015 zbx_free_config();
1016
1017 if (SUCCEED != init_database_cache(&error))
1018 {
1019 zabbix_log(LOG_LEVEL_CRIT, "cannot initialize database cache: %s", error);
1020 zbx_free(error);
1021 exit(EXIT_FAILURE);
1022 }
1023
1024 if (SUCCEED != init_configuration_cache(&error))
1025 {
1026 zabbix_log(LOG_LEVEL_CRIT, "cannot initialize configuration cache: %s", error);
1027 zbx_free(error);
1028 exit(EXIT_FAILURE);
1029 }
1030
1031 if (SUCCEED != init_selfmon_collector(&error))
1032 {
1033 zabbix_log(LOG_LEVEL_CRIT, "cannot initialize self-monitoring: %s", error);
1034 zbx_free(error);
1035 exit(EXIT_FAILURE);
1036 }
1037
1038 if (0 != CONFIG_VMWARE_FORKS && SUCCEED != zbx_vmware_init(&error))
1039 {
1040 zabbix_log(LOG_LEVEL_CRIT, "cannot initialize VMware cache: %s", error);
1041 zbx_free(error);
1042 exit(EXIT_FAILURE);
1043 }
1044
1045 if (SUCCEED != zbx_vc_init(&error))
1046 {
1047 zabbix_log(LOG_LEVEL_CRIT, "cannot initialize history value cache: %s", error);
1048 zbx_free(error);
1049 exit(EXIT_FAILURE);
1050 }
1051
1052 if (SUCCEED != zbx_create_itservices_lock(&error))
1053 {
1054 zabbix_log(LOG_LEVEL_CRIT, "cannot create IT services lock: %s", error);
1055 zbx_free(error);
1056 exit(EXIT_FAILURE);
1057 }
1058
1059 if (SUCCEED != zbx_history_init(&error))
1060 {
1061 zabbix_log(LOG_LEVEL_CRIT, "cannot initialize history storage: %s", error);
1062 zbx_free(error);
1063 exit(EXIT_FAILURE);
1064 }
1065
1066 if (FAIL == zbx_export_init(&error))
1067 {
1068 zabbix_log(LOG_LEVEL_CRIT, "cannot initialize export: %s", error);
1069 zbx_free(error);
1070 exit(EXIT_FAILURE);
1071 }
1072
1073 if (ZBX_DB_UNKNOWN == (db_type = zbx_db_get_database_type()))
1074 {
1075 zabbix_log(LOG_LEVEL_CRIT, "cannot use database \"%s\": database is not a Zabbix database",
1076 CONFIG_DBNAME);
1077 exit(EXIT_FAILURE);
1078 }
1079 else if (ZBX_DB_SERVER != db_type)
1080 {
1081 zabbix_log(LOG_LEVEL_CRIT, "cannot use database \"%s\": its \"users\" table is empty (is this the"
1082 " Zabbix proxy database?)", CONFIG_DBNAME);
1083 exit(EXIT_FAILURE);
1084 }
1085
1086 if (SUCCEED != DBcheck_version())
1087 exit(EXIT_FAILURE);
1088 DBcheck_character_set();
1089
1090 threads_num = CONFIG_CONFSYNCER_FORKS + CONFIG_POLLER_FORKS
1091 + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_TRAPPER_FORKS + CONFIG_PINGER_FORKS
1092 + CONFIG_ALERTER_FORKS + CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS
1093 + CONFIG_HTTPPOLLER_FORKS + CONFIG_DISCOVERER_FORKS + CONFIG_HISTSYNCER_FORKS
1094 + CONFIG_ESCALATOR_FORKS + CONFIG_IPMIPOLLER_FORKS + CONFIG_JAVAPOLLER_FORKS
1095 + CONFIG_SNMPTRAPPER_FORKS + CONFIG_PROXYPOLLER_FORKS + CONFIG_SELFMON_FORKS
1096 + CONFIG_VMWARE_FORKS + CONFIG_TASKMANAGER_FORKS + CONFIG_IPMIMANAGER_FORKS
1097 + CONFIG_ALERTMANAGER_FORKS + CONFIG_PREPROCMAN_FORKS + CONFIG_PREPROCESSOR_FORKS;
1098 threads = (pid_t *)zbx_calloc(threads, threads_num, sizeof(pid_t));
1099 threads_flags = (int *)zbx_calloc(threads_flags, threads_num, sizeof(int));
1100
1101 if (0 != CONFIG_TRAPPER_FORKS)
1102 {
1103 if (FAIL == zbx_tcp_listen(&listen_sock, CONFIG_LISTEN_IP, (unsigned short)CONFIG_LISTEN_PORT))
1104 {
1105 zabbix_log(LOG_LEVEL_CRIT, "listener failed: %s", zbx_socket_strerror());
1106 exit(EXIT_FAILURE);
1107 }
1108 }
1109
1110 #if defined(HAVE_POLARSSL) || defined(HAVE_GNUTLS) || defined(HAVE_OPENSSL)
1111 zbx_tls_init_parent();
1112 #endif
1113 zabbix_log(LOG_LEVEL_INFORMATION, "server #0 started [main process]");
1114
1115 for (i = 0; i < threads_num; i++)
1116 {
1117 zbx_thread_args_t thread_args;
1118 unsigned char poller_type;
1119
1120 if (FAIL == get_process_info_by_thread(i + 1, &thread_args.process_type, &thread_args.process_num))
1121 {
1122 THIS_SHOULD_NEVER_HAPPEN;
1123 exit(EXIT_FAILURE);
1124 }
1125
1126 thread_args.server_num = i + 1;
1127 thread_args.args = NULL;
1128
1129 switch (thread_args.process_type)
1130 {
1131 case ZBX_PROCESS_TYPE_CONFSYNCER:
1132 zbx_thread_start(dbconfig_thread, &thread_args, &threads[i]);
1133 DCconfig_wait_sync();
1134
1135 DBconnect(ZBX_DB_CONNECT_NORMAL);
1136
1137 if (SUCCEED != zbx_check_postinit_tasks(&error))
1138 {
1139 zabbix_log(LOG_LEVEL_CRIT, "cannot complete post initialization tasks: %s",
1140 error);
1141 zbx_free(error);
1142 exit(EXIT_FAILURE);
1143 }
1144
1145 /* update maintenance states */
1146 zbx_dc_update_maintenances();
1147
1148 DBclose();
1149
1150 zbx_vc_enable();
1151 break;
1152 case ZBX_PROCESS_TYPE_POLLER:
1153 poller_type = ZBX_POLLER_TYPE_NORMAL;
1154 thread_args.args = &poller_type;
1155 zbx_thread_start(poller_thread, &thread_args, &threads[i]);
1156 break;
1157 case ZBX_PROCESS_TYPE_UNREACHABLE:
1158 poller_type = ZBX_POLLER_TYPE_UNREACHABLE;
1159 thread_args.args = &poller_type;
1160 zbx_thread_start(poller_thread, &thread_args, &threads[i]);
1161 break;
1162 case ZBX_PROCESS_TYPE_TRAPPER:
1163 thread_args.args = &listen_sock;
1164 zbx_thread_start(trapper_thread, &thread_args, &threads[i]);
1165 break;
1166 case ZBX_PROCESS_TYPE_PINGER:
1167 zbx_thread_start(pinger_thread, &thread_args, &threads[i]);
1168 break;
1169 case ZBX_PROCESS_TYPE_ALERTER:
1170 zbx_thread_start(alerter_thread, &thread_args, &threads[i]);
1171 break;
1172 case ZBX_PROCESS_TYPE_HOUSEKEEPER:
1173 zbx_thread_start(housekeeper_thread, &thread_args, &threads[i]);
1174 break;
1175 case ZBX_PROCESS_TYPE_TIMER:
1176 zbx_thread_start(timer_thread, &thread_args, &threads[i]);
1177 break;
1178 case ZBX_PROCESS_TYPE_HTTPPOLLER:
1179 zbx_thread_start(httppoller_thread, &thread_args, &threads[i]);
1180 break;
1181 case ZBX_PROCESS_TYPE_DISCOVERER:
1182 zbx_thread_start(discoverer_thread, &thread_args, &threads[i]);
1183 break;
1184 case ZBX_PROCESS_TYPE_HISTSYNCER:
1185 threads_flags[i] = ZBX_THREAD_WAIT_EXIT;
1186 zbx_thread_start(dbsyncer_thread, &thread_args, &threads[i]);
1187 break;
1188 case ZBX_PROCESS_TYPE_ESCALATOR:
1189 zbx_thread_start(escalator_thread, &thread_args, &threads[i]);
1190 break;
1191 case ZBX_PROCESS_TYPE_JAVAPOLLER:
1192 poller_type = ZBX_POLLER_TYPE_JAVA;
1193 thread_args.args = &poller_type;
1194 zbx_thread_start(poller_thread, &thread_args, &threads[i]);
1195 break;
1196 case ZBX_PROCESS_TYPE_SNMPTRAPPER:
1197 zbx_thread_start(snmptrapper_thread, &thread_args, &threads[i]);
1198 break;
1199 case ZBX_PROCESS_TYPE_PROXYPOLLER:
1200 zbx_thread_start(proxypoller_thread, &thread_args, &threads[i]);
1201 break;
1202 case ZBX_PROCESS_TYPE_SELFMON:
1203 zbx_thread_start(selfmon_thread, &thread_args, &threads[i]);
1204 break;
1205 case ZBX_PROCESS_TYPE_VMWARE:
1206 zbx_thread_start(vmware_thread, &thread_args, &threads[i]);
1207 break;
1208 case ZBX_PROCESS_TYPE_TASKMANAGER:
1209 zbx_thread_start(taskmanager_thread, &thread_args, &threads[i]);
1210 break;
1211 case ZBX_PROCESS_TYPE_PREPROCMAN:
1212 zbx_thread_start(preprocessing_manager_thread, &thread_args, &threads[i]);
1213 break;
1214 case ZBX_PROCESS_TYPE_PREPROCESSOR:
1215 zbx_thread_start(preprocessing_worker_thread, &thread_args, &threads[i]);
1216 break;
1217 #ifdef HAVE_OPENIPMI
1218 case ZBX_PROCESS_TYPE_IPMIMANAGER:
1219 zbx_thread_start(ipmi_manager_thread, &thread_args, &threads[i]);
1220 break;
1221 case ZBX_PROCESS_TYPE_IPMIPOLLER:
1222 zbx_thread_start(ipmi_poller_thread, &thread_args, &threads[i]);
1223 break;
1224 #endif
1225 case ZBX_PROCESS_TYPE_ALERTMANAGER:
1226 zbx_thread_start(alert_manager_thread, &thread_args, &threads[i]);
1227 break;
1228 }
1229 }
1230
1231 if (SUCCEED == zbx_is_export_enabled())
1232 {
1233 zbx_history_export_init("main-process", 0);
1234 zbx_problems_export_init("main-process", 0);
1235 }
1236
1237 while (-1 == wait(&i)) /* wait for any child to exit */
1238 {
1239 if (EINTR != errno)
1240 {
1241 zabbix_log(LOG_LEVEL_ERR, "failed to wait on child processes: %s", zbx_strerror(errno));
1242 break;
1243 }
1244 }
1245
1246 /* all exiting child processes should be caught by signal handlers */
1247 THIS_SHOULD_NEVER_HAPPEN;
1248
1249 zbx_on_exit(FAIL);
1250
1251 return SUCCEED;
1252 }
1253
zbx_on_exit(int ret)1254 void zbx_on_exit(int ret)
1255 {
1256 zabbix_log(LOG_LEVEL_DEBUG, "zbx_on_exit() called");
1257
1258 if (SUCCEED == DBtxn_ongoing())
1259 DBrollback();
1260
1261 if (NULL != threads)
1262 {
1263 zbx_threads_wait(threads, threads_flags, threads_num, ret); /* wait for all child processes to exit */
1264 zbx_free(threads);
1265 zbx_free(threads_flags);
1266 }
1267 #ifdef HAVE_PTHREAD_PROCESS_SHARED
1268 zbx_locks_disable();
1269 #endif
1270 free_metrics();
1271 zbx_ipc_service_free_env();
1272
1273 DBconnect(ZBX_DB_CONNECT_EXIT);
1274
1275 free_database_cache();
1276
1277 DBclose();
1278
1279 free_configuration_cache();
1280
1281 /* free history value cache */
1282 zbx_vc_destroy();
1283
1284 zbx_destroy_itservices_lock();
1285
1286 /* free vmware support */
1287 if (0 != CONFIG_VMWARE_FORKS)
1288 zbx_vmware_destroy();
1289
1290 free_selfmon_collector();
1291
1292 zbx_uninitialize_events();
1293
1294 zbx_unload_modules();
1295
1296 zabbix_log(LOG_LEVEL_INFORMATION, "Zabbix Server stopped. Zabbix %s (revision %s).",
1297 ZABBIX_VERSION, ZABBIX_REVISION);
1298
1299 zabbix_close_log();
1300
1301 #if defined(PS_OVERWRITE_ARGV)
1302 setproctitle_free_env();
1303 #endif
1304
1305 exit(EXIT_SUCCESS);
1306 }
1307