summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/output.c103
1 files changed, 102 insertions, 1 deletions
diff --git a/lib/output.c b/lib/output.c
index 4c5041c8..2c537a01 100644
--- a/lib/output.c
+++ b/lib/output.c
@@ -8,6 +8,8 @@
8#include <strings.h> 8#include <strings.h>
9// #include <cjson/cJSON.h> 9// #include <cjson/cJSON.h>
10#include "./vendor/cJSON/cJSON.h" 10#include "./vendor/cJSON/cJSON.h"
11#include "perfdata.h"
12#include "states.h"
11 13
12// == Prototypes == 14// == Prototypes ==
13static char *fmt_subcheck_output(mp_output_format output_format, mp_subcheck check, unsigned int indentation); 15static char *fmt_subcheck_output(mp_output_format output_format, mp_subcheck check, unsigned int indentation);
@@ -359,7 +361,7 @@ static inline char *fmt_subcheck_output(mp_output_format output_format, mp_subch
359 switch (output_format) { 361 switch (output_format) {
360 case MP_FORMAT_ICINGA_WEB_2: 362 case MP_FORMAT_ICINGA_WEB_2:
361 asprintf(&result, "%s\\_[%s] - %s", generate_indentation_string(indentation), state_text(mp_compute_subcheck_state(check)), 363 asprintf(&result, "%s\\_[%s] - %s", generate_indentation_string(indentation), state_text(mp_compute_subcheck_state(check)),
362 check.output); 364 check.output);
363 365
364 subchecks = check.subchecks; 366 subchecks = check.subchecks;
365 367
@@ -385,13 +387,112 @@ static inline char *fmt_subcheck_output(mp_output_format output_format, mp_subch
385 } 387 }
386} 388}
387 389
390static inline cJSON *json_serialise_pd_value(mp_perfdata_value value) {
391 cJSON *result = cJSON_CreateObject();
392
393 switch (value.type) {
394 case PD_TYPE_DOUBLE:
395 cJSON_AddStringToObject(result, "type", "double");
396 break;
397 case PD_TYPE_INT:
398 cJSON_AddStringToObject(result, "type", "int");
399 break;
400 case PD_TYPE_UINT:
401 cJSON_AddStringToObject(result, "type", "uint");
402 break;
403 case PD_TYPE_NONE:
404 die(STATE_UNKNOWN, "Perfdata type was None in json_serialise_pd_value");
405 }
406 cJSON_AddStringToObject(result, "value", pd_value_to_string(value));
407
408 return result;
409}
410
411static inline cJSON *json_serialise_range(mp_range range) {
412 cJSON *result = cJSON_CreateObject();
413
414 if (range.alert_on_inside_range) {
415 cJSON_AddBoolToObject(result, "alert_on_inside", true);
416 } else {
417 cJSON_AddBoolToObject(result, "alert_on_inside", false);
418 }
419
420 if (range.end_infinity) {
421 cJSON_AddStringToObject(result, "end", "inf");
422 } else {
423 cJSON_AddItemToObject(result, "end", json_serialise_pd_value(range.end));
424 }
425
426 if (range.start_infinity) {
427 cJSON_AddStringToObject(result, "start", "inf");
428 } else {
429 cJSON_AddItemToObject(result, "start", json_serialise_pd_value(range.end));
430 }
431
432 return result;
433}
434
435static inline cJSON *json_serialise_pd(mp_perfdata pd_val) {
436 cJSON *result = cJSON_CreateObject();
437
438 // Label
439 cJSON_AddStringToObject(result, "label", pd_val.label);
440
441 // Value
442 cJSON_AddItemToObject(result, "value", json_serialise_pd_value(pd_val.value));
443
444 // Uom
445 cJSON_AddStringToObject(result, "uom", pd_val.uom);
446
447 // Warn/Crit
448 if (pd_val.warn_present) {
449 cJSON *warn = json_serialise_range(pd_val.warn);
450 cJSON_AddItemToObject(result, "warn", warn);
451 }
452 if (pd_val.crit_present) {
453 cJSON *crit = json_serialise_range(pd_val.crit);
454 cJSON_AddItemToObject(result, "crit", crit);
455 }
456
457 if (pd_val.min_present) {
458 cJSON_AddItemToObject(result, "min", json_serialise_pd_value(pd_val.min));
459 }
460 if (pd_val.max_present) {
461 cJSON_AddItemToObject(result, "max", json_serialise_pd_value(pd_val.max));
462 }
463
464 return result;
465}
466
467static inline cJSON *json_serialise_pd_list(pd_list *list) {
468 cJSON *result = cJSON_CreateArray();
469
470 do {
471 cJSON *pd_value = json_serialise_pd(list->data);
472 cJSON_AddItemToArray(result, pd_value);
473 list = list->next;
474 } while (list != NULL);
475
476 return result;
477}
478
388static inline cJSON *json_serialize_subcheck(mp_subcheck subcheck) { 479static inline cJSON *json_serialize_subcheck(mp_subcheck subcheck) {
389 cJSON *result = cJSON_CreateObject(); 480 cJSON *result = cJSON_CreateObject();
481
482 // Human readable output
390 cJSON *output = cJSON_CreateString(subcheck.output); 483 cJSON *output = cJSON_CreateString(subcheck.output);
391 cJSON_AddItemToObject(result, "output", output); 484 cJSON_AddItemToObject(result, "output", output);
485
486 // Test state (aka Exit Code)
392 cJSON *state = cJSON_CreateString(state_text(mp_compute_subcheck_state(subcheck))); 487 cJSON *state = cJSON_CreateString(state_text(mp_compute_subcheck_state(subcheck)));
393 cJSON_AddItemToObject(result, "state", state); 488 cJSON_AddItemToObject(result, "state", state);
394 489
490 // Perfdata
491 if (subcheck.perfdata != NULL) {
492 cJSON *perfdata = json_serialise_pd_list(subcheck.perfdata);
493 cJSON_AddItemToObject(result, "perfdata", perfdata);
494 }
495
395 if (subcheck.subchecks != NULL) { 496 if (subcheck.subchecks != NULL) {
396 cJSON *subchecks = cJSON_CreateArray(); 497 cJSON *subchecks = cJSON_CreateArray();
397 498