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