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 #ifndef ZABBIX_SYSINFO_H
21 #define ZABBIX_SYSINFO_H
22 
23 #include "common.h"
24 #include "module.h"
25 
26 /* CHECK RESULT */
27 
28 #define ISSET_UI64(res)	((res)->type & AR_UINT64)
29 #define ISSET_DBL(res)	((res)->type & AR_DOUBLE)
30 #define ISSET_STR(res)	((res)->type & AR_STRING)
31 #define ISSET_TEXT(res)	((res)->type & AR_TEXT)
32 #define ISSET_LOG(res)	((res)->type & AR_LOG)
33 #define ISSET_MSG(res)	((res)->type & AR_MESSAGE)
34 #define ISSET_META(res)	((res)->type & AR_META)
35 
36 #define ISSET_VALUE(res)	((res)->type & (AR_UINT64 | AR_DOUBLE | AR_STRING | AR_TEXT | AR_LOG))
37 
38 /* UNSET RESULT */
39 
40 #define UNSET_UI64_RESULT(res)						\
41 									\
42 do									\
43 {									\
44 	(res)->type &= ~AR_UINT64;					\
45 	(res)->ui64 = (zbx_uint64_t)0;					\
46 }									\
47 while (0)
48 
49 #define UNSET_DBL_RESULT(res)						\
50 									\
51 do									\
52 {									\
53 	(res)->type &= ~AR_DOUBLE;					\
54 	(res)->dbl = (double)0;						\
55 }									\
56 while (0)
57 
58 #define UNSET_STR_RESULT(res)						\
59 									\
60 do									\
61 {									\
62 	if ((res)->type & AR_STRING)					\
63 	{								\
64 		zbx_free((res)->str);					\
65 		(res)->type &= ~AR_STRING;				\
66 	}								\
67 }									\
68 while (0)
69 
70 #define UNSET_TEXT_RESULT(res)						\
71 									\
72 do									\
73 {									\
74 	if ((res)->type & AR_TEXT)					\
75 	{								\
76 		zbx_free((res)->text);					\
77 		(res)->type &= ~AR_TEXT;				\
78 	}								\
79 }									\
80 while (0)
81 
82 #define UNSET_LOG_RESULT(res)						\
83 									\
84 do									\
85 {									\
86 	if ((res)->type & AR_LOG)					\
87 	{								\
88 		zbx_log_free((res)->log);				\
89 		(res)->log = NULL;					\
90 		(res)->type &= ~AR_LOG;					\
91 	}								\
92 }									\
93 while (0)
94 
95 #define UNSET_MSG_RESULT(res)						\
96 									\
97 do									\
98 {									\
99 	if ((res)->type & AR_MESSAGE)					\
100 	{								\
101 		zbx_free((res)->msg);					\
102 		(res)->type &= ~AR_MESSAGE;				\
103 	}								\
104 }									\
105 while (0)
106 
107 /* AR_META is always excluded */
108 #define UNSET_RESULT_EXCLUDING(res, exc_type) 					\
109 										\
110 do										\
111 {										\
112 	if (!(exc_type & AR_UINT64))	UNSET_UI64_RESULT(res);			\
113 	if (!(exc_type & AR_DOUBLE))	UNSET_DBL_RESULT(res);			\
114 	if (!(exc_type & AR_STRING))	UNSET_STR_RESULT(res);			\
115 	if (!(exc_type & AR_TEXT))	UNSET_TEXT_RESULT(res);			\
116 	if (!(exc_type & AR_LOG))	UNSET_LOG_RESULT(res);			\
117 	if (!(exc_type & AR_MESSAGE))	UNSET_MSG_RESULT(res);			\
118 }										\
119 while (0)
120 
121 /* RETRIEVE RESULT VALUE */
122 
123 #define GET_UI64_RESULT(res)	((zbx_uint64_t *)get_result_value_by_type(res, AR_UINT64))
124 #define GET_DBL_RESULT(res)	((double *)get_result_value_by_type(res, AR_DOUBLE))
125 #define GET_STR_RESULT(res)	((char **)get_result_value_by_type(res, AR_STRING))
126 #define GET_TEXT_RESULT(res)	((char **)get_result_value_by_type(res, AR_TEXT))
127 #define GET_LOG_RESULT(res)	((zbx_log_t *)get_result_value_by_type(res, AR_LOG))
128 #define GET_MSG_RESULT(res)	((char **)get_result_value_by_type(res, AR_MESSAGE))
129 
130 void	*get_result_value_by_type(AGENT_RESULT *result, int require_type);
131 
132 #define ZBX_FLOAT_PRECISION	0.0001
133 
134 extern int	CONFIG_ENABLE_REMOTE_COMMANDS;
135 extern int	CONFIG_LOG_REMOTE_COMMANDS;
136 extern int	CONFIG_UNSAFE_USER_PARAMETERS;
137 
138 /* collector */
139 #define MAX_COLLECTOR_HISTORY	(15 * SEC_PER_MIN + 1)
140 #define ZBX_AVG1		0
141 #define ZBX_AVG5		1
142 #define ZBX_AVG15		2
143 #define ZBX_AVG_COUNT		3
144 
145 #if defined(_WINDOWS)
146 #	define MAX_COLLECTOR_PERIOD	(15 * SEC_PER_MIN)
147 #endif
148 
149 #define ZBX_CPU_STATE_USER	0
150 #define ZBX_CPU_STATE_SYSTEM	1
151 #define ZBX_CPU_STATE_NICE	2
152 #define ZBX_CPU_STATE_IDLE	3
153 #define ZBX_CPU_STATE_INTERRUPT	4
154 #define ZBX_CPU_STATE_IOWAIT	5
155 #define ZBX_CPU_STATE_SOFTIRQ	6
156 #define ZBX_CPU_STATE_STEAL	7
157 #define ZBX_CPU_STATE_GCPU	8
158 #define ZBX_CPU_STATE_GNICE	9
159 #define ZBX_CPU_STATE_COUNT	10
160 
161 #define ZBX_PROC_STAT_ALL	0
162 #define ZBX_PROC_STAT_RUN	1
163 #define ZBX_PROC_STAT_SLEEP	2
164 #define ZBX_PROC_STAT_ZOMB	3
165 #define ZBX_PROC_STAT_DISK	4
166 #define ZBX_PROC_STAT_TRACE	5
167 
168 #define ZBX_DO_SUM		0
169 #define ZBX_DO_MAX		1
170 #define ZBX_DO_MIN		2
171 #define ZBX_DO_AVG		3
172 #define ZBX_DO_ONE		4
173 
174 #define ZBX_DSTAT_TYPE_SECT	0
175 #define ZBX_DSTAT_TYPE_OPER	1
176 #define ZBX_DSTAT_TYPE_BYTE	2
177 #define ZBX_DSTAT_TYPE_SPS	3
178 #define ZBX_DSTAT_TYPE_OPS	4
179 #define ZBX_DSTAT_TYPE_BPS	5
180 
181 /* disk statistics */
182 #define ZBX_DSTAT_R_SECT	0
183 #define ZBX_DSTAT_R_OPER	1
184 #define ZBX_DSTAT_R_BYTE	2
185 #define ZBX_DSTAT_W_SECT	3
186 #define ZBX_DSTAT_W_OPER	4
187 #define ZBX_DSTAT_W_BYTE	5
188 #define ZBX_DSTAT_MAX		6
189 int	get_diskstat(const char *devname, zbx_uint64_t *dstat);
190 
191 /* flags for process */
192 #define PROCESS_LOCAL_COMMAND	0x1
193 #define PROCESS_MODULE_COMMAND	0x2
194 #define PROCESS_WITH_ALIAS	0x4
195 
196 typedef enum
197 {
198 	ZBX_KEY_ACCESS_ALLOW,
199 	ZBX_KEY_ACCESS_DENY
200 }
201 zbx_key_access_rule_type_t;
202 
203 void	init_metrics(void);
204 int	add_metric(ZBX_METRIC *metric, char *error, size_t max_error_len);
205 int	add_metric_local(ZBX_METRIC *metric, char *error, size_t max_error_len);
206 void	free_metrics(void);
207 
208 void	init_key_access_rules(void);
209 void	finalize_key_access_rules_configuration(void);
210 int	add_key_access_rule(const char *parameter, char *pattern, zbx_key_access_rule_type_t type);
211 int	check_key_access_rules(const char *metric);
212 int	check_request_access_rules(AGENT_REQUEST *request);
213 void	free_key_access_rules(void);
214 
215 int	process(const char *in_command, unsigned flags, AGENT_RESULT *result);
216 
217 int	add_user_parameter(const char *itemkey, char *command, char *error, size_t max_error_len);
218 int	add_user_module(const char *key, int (*function)(void));
219 void	test_parameters(void);
220 void	test_parameter(const char *key);
221 
222 void	init_result(AGENT_RESULT *result);
223 void	zbx_log_free(zbx_log_t *log);
224 void	free_result(AGENT_RESULT *result);
225 
226 void	init_request(AGENT_REQUEST *request);
227 void	free_request(AGENT_REQUEST *request);
228 
229 int	parse_item_key(const char *itemkey, AGENT_REQUEST *request);
230 
231 void	unquote_key_param(char *param);
232 int	quote_key_param(char **param, int forced);
233 
234 int	set_result_type(AGENT_RESULT *result, int value_type, char *c);
235 void	set_result_meta(AGENT_RESULT *result, zbx_uint64_t lastlogsize, int mtime);
236 
237 #ifdef HAVE_KSTAT_H
238 zbx_uint64_t	get_kstat_numeric_value(const kstat_named_t *kn);
239 #endif
240 
241 /* external system functions */
242 
243 int	GET_SENSOR(AGENT_REQUEST *request, AGENT_RESULT *result);
244 int	KERNEL_MAXFILES(AGENT_REQUEST *request, AGENT_RESULT *result);
245 int	KERNEL_MAXPROC(AGENT_REQUEST *request, AGENT_RESULT *result);
246 
247 #ifdef ZBX_PROCSTAT_COLLECTOR
248 int	PROC_CPU_UTIL(AGENT_REQUEST *request, AGENT_RESULT *result);
249 #endif
250 
251 int	PROC_MEM(AGENT_REQUEST *request, AGENT_RESULT *result);
252 int	PROC_NUM(AGENT_REQUEST *request, AGENT_RESULT *result);
253 int	NET_IF_IN(AGENT_REQUEST *request, AGENT_RESULT *result);
254 int	NET_IF_OUT(AGENT_REQUEST *request, AGENT_RESULT *result);
255 int	NET_IF_TOTAL(AGENT_REQUEST *request, AGENT_RESULT *result);
256 int	NET_IF_COLLISIONS(AGENT_REQUEST *request, AGENT_RESULT *result);
257 int	NET_IF_DISCOVERY(AGENT_REQUEST *request, AGENT_RESULT *result);
258 int	NET_TCP_LISTEN(AGENT_REQUEST *request, AGENT_RESULT *result);
259 int	NET_UDP_LISTEN(AGENT_REQUEST *request, AGENT_RESULT *result);
260 int	SYSTEM_CPU_SWITCHES(AGENT_REQUEST *request, AGENT_RESULT *result);
261 int	SYSTEM_CPU_INTR(AGENT_REQUEST *request, AGENT_RESULT *result);
262 int	SYSTEM_CPU_LOAD(AGENT_REQUEST *request, AGENT_RESULT *result);
263 int	SYSTEM_CPU_UTIL(AGENT_REQUEST *request, AGENT_RESULT *result);
264 int	SYSTEM_CPU_NUM(AGENT_REQUEST *request, AGENT_RESULT *result);
265 int	SYSTEM_CPU_DISCOVERY(AGENT_REQUEST *request, AGENT_RESULT *result);
266 int	SYSTEM_HOSTNAME(AGENT_REQUEST *request, AGENT_RESULT *result);
267 int	SYSTEM_HW_CHASSIS(AGENT_REQUEST *request, AGENT_RESULT *result);
268 int	SYSTEM_HW_CPU(AGENT_REQUEST *request, AGENT_RESULT *result);
269 int	SYSTEM_HW_DEVICES(AGENT_REQUEST *request, AGENT_RESULT *result);
270 int	SYSTEM_HW_MACADDR(AGENT_REQUEST *request, AGENT_RESULT *result);
271 int	SYSTEM_SW_ARCH(AGENT_REQUEST *request, AGENT_RESULT *result);
272 int	SYSTEM_SW_OS(AGENT_REQUEST *request, AGENT_RESULT *result);
273 int	SYSTEM_SW_PACKAGES(AGENT_REQUEST *request, AGENT_RESULT *result);
274 int	SYSTEM_SWAP_IN(AGENT_REQUEST *request, AGENT_RESULT *result);
275 int	SYSTEM_SWAP_OUT(AGENT_REQUEST *request, AGENT_RESULT *result);
276 int	SYSTEM_SWAP_SIZE(AGENT_REQUEST *request, AGENT_RESULT *result);
277 int	SYSTEM_UPTIME(AGENT_REQUEST *request, AGENT_RESULT *result);
278 int	SYSTEM_UNAME(AGENT_REQUEST *request, AGENT_RESULT *result);
279 int	SYSTEM_BOOTTIME(AGENT_REQUEST *request, AGENT_RESULT *result);
280 int	VFS_DEV_READ(AGENT_REQUEST *request, AGENT_RESULT *result);
281 int	VFS_DEV_WRITE(AGENT_REQUEST *request, AGENT_RESULT *result);
282 int	VFS_DEV_DISCOVERY(AGENT_REQUEST *request, AGENT_RESULT *result);
283 int	VFS_FS_INODE(AGENT_REQUEST *request, AGENT_RESULT *result);
284 int	VFS_FS_SIZE(AGENT_REQUEST *request, AGENT_RESULT *result);
285 int	VFS_FS_DISCOVERY(AGENT_REQUEST *request, AGENT_RESULT *result);
286 int	VFS_FS_GET(AGENT_REQUEST *request, AGENT_RESULT *result);
287 int	VM_MEMORY_SIZE(AGENT_REQUEST *request, AGENT_RESULT *result);
288 
289 #if defined(_WINDOWS) || defined(__MINGW32__)
290 int	USER_PERF_COUNTER(AGENT_REQUEST *request, AGENT_RESULT *result);
291 int	PERF_COUNTER(AGENT_REQUEST *request, AGENT_RESULT *result);
292 int	PERF_COUNTER_EN(AGENT_REQUEST *request, AGENT_RESULT *result);
293 int	PERF_INSTANCE_DISCOVERY(AGENT_REQUEST *request, AGENT_RESULT *result);
294 int	PERF_INSTANCE_DISCOVERY_EN(AGENT_REQUEST *request, AGENT_RESULT *result);
295 int	SERVICE_DISCOVERY(AGENT_REQUEST *request, AGENT_RESULT *result);
296 int	SERVICE_INFO(AGENT_REQUEST *request, AGENT_RESULT *result);
297 int	SERVICE_STATE(AGENT_REQUEST *request, AGENT_RESULT *result);
298 int	SERVICES(AGENT_REQUEST *request, AGENT_RESULT *result);
299 int	PROC_INFO(AGENT_REQUEST *request, AGENT_RESULT *result);
300 int	NET_IF_LIST(AGENT_REQUEST *request, AGENT_RESULT *result);
301 int	WMI_GET(AGENT_REQUEST *request, AGENT_RESULT *result);
302 int	WMI_GETALL(AGENT_REQUEST *request, AGENT_RESULT *result);
303 int	VM_VMEMORY_SIZE(AGENT_REQUEST *request, AGENT_RESULT *result);
304 #endif
305 
306 #ifdef _AIX
307 int	SYSTEM_STAT(AGENT_REQUEST *request, AGENT_RESULT *result);
308 #endif
309 
310 #if defined(_WINDOWS) || defined(__MINGW32__)
311 typedef int (*zbx_metric_func_t)(AGENT_REQUEST *request, AGENT_RESULT *result, HANDLE timeout_event);
312 #else
313 typedef int (*zbx_metric_func_t)(AGENT_REQUEST *request, AGENT_RESULT *result);
314 #endif
315 
316 typedef struct
317 {
318 	const char	*mode;
319 	int		(*function)(const char *devname, AGENT_RESULT *result);
320 }
321 MODE_FUNCTION;
322 
323 typedef struct
324 {
325 	zbx_uint64_t	total;
326 	zbx_uint64_t	not_used;
327 	zbx_uint64_t	used;
328 	double		pfree;
329 	double		pused;
330 }
331 zbx_fs_metrics_t;
332 
333 typedef struct
334 {
335 	char			fsname[MAX_STRING_LEN];
336 	char			fstype[MAX_STRING_LEN];
337 	zbx_fs_metrics_t	bytes;
338 	zbx_fs_metrics_t	inodes;
339 }
340 zbx_mpoint_t;
341 
342 #define ZBX_LLD_MACRO_FSNAME		"{#FSNAME}"
343 #define ZBX_LLD_MACRO_FSTYPE		"{#FSTYPE}"
344 #define ZBX_LLD_MACRO_FSDRIVETYPE	"{#FSDRIVETYPE}"
345 
346 #define ZBX_SYSINFO_TAG_FSNAME			"fsname"
347 #define ZBX_SYSINFO_TAG_FSTYPE			"fstype"
348 #define ZBX_SYSINFO_TAG_FSDRIVETYPE		"fsdrivetype"
349 #define ZBX_SYSINFO_TAG_BYTES			"bytes"
350 #define ZBX_SYSINFO_TAG_INODES			"inodes"
351 #define ZBX_SYSINFO_TAG_TOTAL			"total"
352 #define ZBX_SYSINFO_TAG_FREE			"free"
353 #define ZBX_SYSINFO_TAG_USED			"used"
354 #define ZBX_SYSINFO_TAG_PFREE			"pfree"
355 #define ZBX_SYSINFO_TAG_PUSED			"pused"
356 
357 int	zbx_execute_threaded_metric(zbx_metric_func_t metric_func, AGENT_REQUEST *request, AGENT_RESULT *result);
358 void	zbx_mpoints_free(zbx_mpoint_t *mpoint);
359 
360 /* the fields used by proc queries */
361 #define ZBX_SYSINFO_PROC_NONE		0x0000
362 #define ZBX_SYSINFO_PROC_PID		0x0001
363 #define ZBX_SYSINFO_PROC_NAME		0x0002
364 #define ZBX_SYSINFO_PROC_CMDLINE	0x0004
365 #define ZBX_SYSINFO_PROC_USER		0x0008
366 
367 #if defined(_WINDOWS) || defined(__MINGW32__)
368 #define ZBX_MUTEX_ALL_ALLOW		0
369 #define ZBX_MUTEX_THREAD_DENIED		1
370 #define ZBX_MUTEX_LOGGING_DENIED	2
371 zbx_uint32_t get_thread_global_mutex_flag(void);
372 #endif
373 
374 #ifndef _WINDOWS
375 int	hostname_handle_params(AGENT_REQUEST *request, AGENT_RESULT *result, char *hostname);
376 #endif
377 
378 #endif
379 
380