1 /*
2  * Copyright (C) 2018-2022 Intel Corporation.
3  * SPDX-License-Identifier: BSD-3-Clause
4  */
5 
6 #ifndef __LOAD_CONF_H__
7 #define __LOAD_CONF_H__
8 
9 #include <stdio.h>
10 #include <sys/queue.h>
11 #include <ext2fs/ext2fs.h>
12 #include "event_queue.h"
13 #include "probeutils.h"
14 #include "vmrecord.h"
15 
16 #define CONTENT_MAX 10
17 #define EXPRESSION_MAX 5
18 #define LOG_MAX 20
19 #define TRIGGER_MAX 20
20 #define SENDER_MAX 3
21 #define DATA_MAX 3
22 #define CRASH_MAX 20
23 #define INFO_MAX 20
24 #define VM_MAX 4
25 #define VM_EVENT_TYPE_MAX 20
26 
27 struct trigger_t {
28 	int		id;
29 	const char	*name;
30 	size_t		name_len;
31 	const char	*type;
32 	size_t		type_len;
33 	const char	*path;
34 	size_t		path_len;
35 };
36 
37 struct vm_t {
38 	int		id;
39 	const char	*name;
40 	size_t		name_len;
41 	const char	*channel;
42 	size_t		channel_len;
43 	const char	*interval;
44 	size_t		interval_len;
45 	const char	*syncevent[VM_EVENT_TYPE_MAX];
46 	size_t		syncevent_len[VM_EVENT_TYPE_MAX];
47 
48 	ext2_filsys	datafs;
49 	unsigned long	history_size[SENDER_MAX];
50 	char		*history_data;
51 	char		last_evt_detected[SENDER_MAX][SHORT_KEY_LENGTH + 1];
52 };
53 
54 struct log_t {
55 	int		id;
56 	const char	*name;
57 	size_t		name_len;
58 	const char	*type;
59 	size_t		type_len;
60 	const char	*path;
61 	size_t		path_len;
62 	const char	*lines;
63 	size_t		lines_len;
64 	const char	*deletesource;
65 	size_t		deletesource_len;
66 	const char	*sizelimit;
67 	size_t		sizelimit_len;
68 
69 	void (*get)(struct log_t *, void *);
70 };
71 
72 struct crash_t {
73 	int		id;
74 	const char	*name;
75 	size_t		name_len;
76 	const char	*channel;
77 	size_t		channel_len;
78 	const char	*interval;
79 	size_t		interval_len;
80 	struct trigger_t *trigger;
81 	const char	*content[CONTENT_MAX];
82 	size_t		content_len[CONTENT_MAX];
83 	const char	*mightcontent[EXPRESSION_MAX][CONTENT_MAX];
84 	size_t		mightcontent_len[EXPRESSION_MAX][CONTENT_MAX];
85 	struct log_t	*log[LOG_MAX];
86 	const char	*data[DATA_MAX];
87 	size_t		data_len[DATA_MAX];
88 
89 	struct crash_t	*parents;
90 
91 	TAILQ_ENTRY(crash_t) entries;
92 	TAILQ_HEAD(, crash_t) children;
93 
94 	int wd;
95 	int level;
96 	struct crash_t *(*reclassify)(const struct crash_t *, const char*,
97 					char**, size_t *);
98 };
99 
100 struct info_t {
101 	int		id;
102 	const char	*name;
103 	size_t		name_len;
104 	const char	*channel;
105 	size_t		channel_len;
106 	const char	*interval;
107 	size_t		interval_len;
108 	struct trigger_t *trigger;
109 	struct log_t	*log[LOG_MAX];
110 };
111 
112 struct uptime_t {
113 	const char	*name;
114 	size_t		name_len;
115 	const char	*frequency;
116 	size_t		frequency_len;
117 	const char	*eventhours;
118 	size_t		eventhours_len;
119 
120 	int wd;
121 	char *path;
122 };
123 
124 struct sender_t {
125 	int		id;
126 	const char	*name;
127 	size_t		name_len;
128 	const char	*outdir;
129 	size_t		outdir_len;
130 	const char	*maxcrashdirs;
131 	size_t		maxcrashdirs_len;
132 	const char	*maxlines;
133 	size_t		maxlines_len;
134 	const char	*spacequota;
135 	size_t		spacequota_len;
136 	const char	*foldersize;
137 	size_t		foldersize_len;
138 	struct uptime_t *uptime;
139 
140 	void (*send)(struct event_t *);
141 	struct vmrecord_t vmrecord;
142 	size_t		outdir_blocks_size;
143 	int		sw_updated; /* each sender has their own record */
144 };
145 
146 struct conf_t {
147 	struct sender_t *sender[SENDER_MAX];
148 	struct vm_t	*vm[VM_MAX];
149 	struct trigger_t *trigger[TRIGGER_MAX];
150 	struct log_t	*log[LOG_MAX];
151 	struct crash_t	*crash[CRASH_MAX];
152 	struct info_t	*info[INFO_MAX];
153 };
154 
155 struct conf_t conf;
156 
157 #define for_each_sender(id, sender, conf) \
158 		for (id = 0; \
159 		     id < SENDER_MAX && (sender = conf.sender[id]); \
160 		     id++)
161 
162 #define for_each_trigger(id, trigger, conf) \
163 		for (id = 0; \
164 		     id < TRIGGER_MAX && (trigger = conf.trigger[id]); \
165 		     id++)
166 
167 #define for_each_vm(id, vm, conf) \
168 		for (id = 0; \
169 		     id < VM_MAX && (vm = conf.vm[id]); \
170 		     id++)
171 
172 #define for_each_syncevent_vm(id, event, vm) \
173 		for (id = 0; \
174 		     id < VM_EVENT_TYPE_MAX && (event = vm->syncevent[id]); \
175 		     id++)
176 
177 #define for_each_info(id, info, conf) \
178 		for (id = 0; \
179 		     id < INFO_MAX && (info = conf.info[id]); \
180 		     id++)
181 
182 #define for_each_log(id, log, conf) \
183 		for (id = 0; \
184 		     id < LOG_MAX && (log = conf.log[id]); \
185 		     id++)
186 
187 #define for_each_crash(id, crash, conf) \
188 		for (id = 0; \
189 		     id < CRASH_MAX && (crash = conf.crash[id]); \
190 		     id++)
191 
192 #define for_each_log_collect(id, log, type) \
193 		for (id = 0; \
194 		     id < LOG_MAX && (log = type->log[id]); \
195 		     id++)
196 
197 #define for_each_content_crash(id, content, crash) \
198 		for (id = 0; \
199 		     id < CONTENT_MAX && (content = crash->content[id]); \
200 		     id++)
201 
202 #define for_each_content_expression(id, content, exp) \
203 		for (id = 0; \
204 		     id < CONTENT_MAX && (content = exp[id]); \
205 		     id++)
206 
207 #define exp_valid(exp) \
208 (__extension__ \
209 ({ \
210 		int _ret = 0; \
211 		int _id; \
212 		const char *content; \
213 		for_each_content_expression(_id, content, exp) { \
214 			if (content) \
215 				_ret = 1; \
216 		} \
217 		_ret; \
218 }) \
219 )
220 
221 #define for_each_expression_crash(id, exp, crash) \
222 		for (id = 0; \
223 		     id < EXPRESSION_MAX && (exp = crash->mightcontent[id]); \
224 		     id++)
225 
226 #define for_crash_children(crash, tcrash) \
227 			TAILQ_FOREACH(crash, &tcrash->children, entries)
228 
229 #define is_leaf_crash(crash) \
230 			(crash && TAILQ_EMPTY(&crash->children))
231 
232 #define is_root_crash(crash) \
233 			(crash && crash->parents == NULL)
234 
235 #define to_collect_logs(type) \
236 (__extension__ \
237 ({ \
238 		int _id; \
239 		int _ret = 0; \
240 		for (_id = 0; _id < LOG_MAX; _id++) \
241 			if (type->log[_id]) \
242 				_ret = 1; \
243 		_ret; \
244 }) \
245 )
246 
247 int load_conf(const char *path);
248 struct trigger_t *get_trigger_by_name(const char *name);
249 struct log_t *get_log_by_name(const char *name);
250 struct vm_t *get_vm_by_name(const char *name);
251 struct sender_t *get_sender_by_name(const char *name);
252 enum event_type_t get_conf_by_wd(int wd, void **private);
253 struct crash_t *get_crash_by_wd(int wd);
254 int crash_depth(struct crash_t *tcrash);
255 int cfg_atoi(const char *a, size_t alen, int *i);
256 
257 #endif
258