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