summaryrefslogtreecommitdiffstats
path: root/lib/output.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/output.c')
-rw-r--r--lib/output.c93
1 files changed, 77 insertions, 16 deletions
diff --git a/lib/output.c b/lib/output.c
index 61fbf832..b398c2ad 100644
--- a/lib/output.c
+++ b/lib/output.c
@@ -13,9 +13,11 @@
13 13
14// == Global variables 14// == Global variables
15static mp_output_format output_format = MP_FORMAT_DEFAULT; 15static mp_output_format output_format = MP_FORMAT_DEFAULT;
16static mp_output_detail_level level_of_detail = MP_DETAIL_ALL;
16 17
17// == Prototypes == 18// == Prototypes ==
18static char *fmt_subcheck_output(mp_output_format output_format, mp_subcheck check, unsigned int indentation); 19static char *fmt_subcheck_output(mp_output_format output_format, mp_subcheck check,
20 unsigned int indentation);
19static inline cJSON *json_serialize_subcheck(mp_subcheck subcheck); 21static inline cJSON *json_serialize_subcheck(mp_subcheck subcheck);
20 22
21// == Implementation == 23// == Implementation ==
@@ -57,7 +59,9 @@ static inline char *fmt_subcheck_perfdata(mp_subcheck check) {
57 * It sets useful defaults 59 * It sets useful defaults
58 */ 60 */
59mp_check mp_check_init(void) { 61mp_check mp_check_init(void) {
60 mp_check check = {0}; 62 mp_check check = {
63 .evaluation_function = &mp_eval_check_default,
64 };
61 return check; 65 return check;
62} 66}
63 67
@@ -120,7 +124,8 @@ void mp_add_perfdata_to_subcheck(mp_subcheck check[static 1], const mp_perfdata
120 */ 124 */
121int mp_add_subcheck_to_subcheck(mp_subcheck check[static 1], mp_subcheck subcheck) { 125int mp_add_subcheck_to_subcheck(mp_subcheck check[static 1], mp_subcheck subcheck) {
122 if (subcheck.output == NULL) { 126 if (subcheck.output == NULL) {
123 die(STATE_UNKNOWN, "%s - %s #%d: %s", __FILE__, __func__, __LINE__, "Sub check output is NULL"); 127 die(STATE_UNKNOWN, "%s - %s #%d: %s", __FILE__, __func__, __LINE__,
128 "Sub check output is NULL");
124 } 129 }
125 130
126 mp_subcheck_list *tmp = NULL; 131 mp_subcheck_list *tmp = NULL;
@@ -193,16 +198,33 @@ char *get_subcheck_summary(mp_check check) {
193 return result; 198 return result;
194} 199}
195 200
201mp_state_enum mp_compute_subcheck_state(const mp_subcheck subcheck) {
202 if (subcheck.evaluation_function == NULL) {
203 return mp_eval_subcheck_default(subcheck);
204 }
205 return subcheck.evaluation_function(subcheck);
206}
207
196/* 208/*
197 * Generate the result state of a mp_subcheck object based on it's own state and it's subchecks states 209 * Generate the result state of a mp_subcheck object based on its own state and its subchecks
210 * states
198 */ 211 */
199mp_state_enum mp_compute_subcheck_state(const mp_subcheck check) { 212mp_state_enum mp_eval_subcheck_default(mp_subcheck subcheck) {
200 if (check.state_set_explicitly) { 213 if (subcheck.evaluation_function != NULL) {
201 return check.state; 214 return subcheck.evaluation_function(subcheck);
202 } 215 }
203 216
204 mp_subcheck_list *scl = check.subchecks; 217 if (subcheck.state_set_explicitly) {
205 mp_state_enum result = check.default_state; 218 return subcheck.state;
219 }
220
221 mp_subcheck_list *scl = subcheck.subchecks;
222
223 if (scl == NULL) {
224 return subcheck.default_state;
225 }
226
227 mp_state_enum result = STATE_OK;
206 228
207 while (scl != NULL) { 229 while (scl != NULL) {
208 result = max_state_alt(result, mp_compute_subcheck_state(scl->subcheck)); 230 result = max_state_alt(result, mp_compute_subcheck_state(scl->subcheck));
@@ -212,10 +234,18 @@ mp_state_enum mp_compute_subcheck_state(const mp_subcheck check) {
212 return result; 234 return result;
213} 235}
214 236
237mp_state_enum mp_compute_check_state(const mp_check check) {
238 // just a safety check
239 if (check.evaluation_function == NULL) {
240 return mp_eval_check_default(check);
241 }
242 return check.evaluation_function(check);
243}
244
215/* 245/*
216 * Generate the result state of a mp_check object based on it's own state and it's subchecks states 246 * Generate the result state of a mp_check object based on it's own state and it's subchecks states
217 */ 247 */
218mp_state_enum mp_compute_check_state(const mp_check check) { 248mp_state_enum mp_eval_check_default(const mp_check check) {
219 assert(check.subchecks != NULL); // a mp_check without subchecks is invalid, die here 249 assert(check.subchecks != NULL); // a mp_check without subchecks is invalid, die here
220 250
221 mp_subcheck_list *scl = check.subchecks; 251 mp_subcheck_list *scl = check.subchecks;
@@ -247,7 +277,11 @@ char *mp_fmt_output(mp_check check) {
247 mp_subcheck_list *subchecks = check.subchecks; 277 mp_subcheck_list *subchecks = check.subchecks;
248 278
249 while (subchecks != NULL) { 279 while (subchecks != NULL) {
250 asprintf(&result, "%s\n%s", result, fmt_subcheck_output(MP_FORMAT_MULTI_LINE, subchecks->subcheck, 1)); 280 if (level_of_detail == MP_DETAIL_ALL ||
281 mp_compute_subcheck_state(subchecks->subcheck) != STATE_OK) {
282 asprintf(&result, "%s\n%s", result,
283 fmt_subcheck_output(MP_FORMAT_MULTI_LINE, subchecks->subcheck, 1));
284 }
251 subchecks = subchecks->next; 285 subchecks = subchecks->next;
252 } 286 }
253 287
@@ -258,7 +292,8 @@ char *mp_fmt_output(mp_check check) {
258 if (pd_string == NULL) { 292 if (pd_string == NULL) {
259 asprintf(&pd_string, "%s", fmt_subcheck_perfdata(subchecks->subcheck)); 293 asprintf(&pd_string, "%s", fmt_subcheck_perfdata(subchecks->subcheck));
260 } else { 294 } else {
261 asprintf(&pd_string, "%s %s", pd_string, fmt_subcheck_perfdata(subchecks->subcheck)); 295 asprintf(&pd_string, "%s %s", pd_string,
296 fmt_subcheck_perfdata(subchecks->subcheck));
262 } 297 }
263 298
264 subchecks = subchecks->next; 299 subchecks = subchecks->next;
@@ -327,19 +362,21 @@ static char *generate_indentation_string(unsigned int indentation) {
327/* 362/*
328 * Helper function to generate the output string of mp_subcheck 363 * Helper function to generate the output string of mp_subcheck
329 */ 364 */
330static inline char *fmt_subcheck_output(mp_output_format output_format, mp_subcheck check, unsigned int indentation) { 365static inline char *fmt_subcheck_output(mp_output_format output_format, mp_subcheck check,
366 unsigned int indentation) {
331 char *result = NULL; 367 char *result = NULL;
332 mp_subcheck_list *subchecks = NULL; 368 mp_subcheck_list *subchecks = NULL;
333 369
334 switch (output_format) { 370 switch (output_format) {
335 case MP_FORMAT_MULTI_LINE: 371 case MP_FORMAT_MULTI_LINE:
336 asprintf(&result, "%s\\_[%s] - %s", generate_indentation_string(indentation), state_text(mp_compute_subcheck_state(check)), 372 asprintf(&result, "%s\\_[%s] - %s", generate_indentation_string(indentation),
337 check.output); 373 state_text(mp_compute_subcheck_state(check)), check.output);
338 374
339 subchecks = check.subchecks; 375 subchecks = check.subchecks;
340 376
341 while (subchecks != NULL) { 377 while (subchecks != NULL) {
342 asprintf(&result, "%s\n%s", result, fmt_subcheck_output(output_format, subchecks->subcheck, indentation + 1)); 378 asprintf(&result, "%s\n%s", result,
379 fmt_subcheck_output(output_format, subchecks->subcheck, indentation + 1));
343 subchecks = subchecks->next; 380 subchecks = subchecks->next;
344 } 381 }
345 return result; 382 return result;
@@ -539,3 +576,27 @@ parsed_output_format mp_parse_output_format(char *format_string) {
539void mp_set_format(mp_output_format format) { output_format = format; } 576void mp_set_format(mp_output_format format) { output_format = format; }
540 577
541mp_output_format mp_get_format(void) { return output_format; } 578mp_output_format mp_get_format(void) { return output_format; }
579
580void mp_set_level_of_detail(mp_output_detail_level level) { level_of_detail = level; }
581
582mp_output_detail_level mp_get_level_of_detail(void) { return level_of_detail; }
583
584mp_state_enum mp_eval_ok(mp_check overall) {
585 (void)overall;
586 return STATE_OK;
587}
588
589mp_state_enum mp_eval_warning(mp_check overall) {
590 (void)overall;
591 return STATE_WARNING;
592}
593
594mp_state_enum mp_eval_critical(mp_check overall) {
595 (void)overall;
596 return STATE_CRITICAL;
597}
598
599mp_state_enum mp_eval_unknown(mp_check overall) {
600 (void)overall;
601 return STATE_UNKNOWN;
602}