| 1 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | |
| 3 | #include "api_v2_calls.h" |
| 4 | |
| 5 | // -------------------------------------------------------------------------------------------------------------------- |
| 6 | |
| 7 | int api_v2_contexts_internal(RRDHOST *host __maybe_unused, struct web_client *w, char *url, CONTEXTS_V2_MODE mode, CONTEXTS_OPTIONS options) { |
| 8 | struct api_v2_contexts_request req = { |
| 9 | .options = options, |
| 10 | }; |
| 11 | |
| 12 | while(url) { |
| 13 | char *value = strsep_skip_consecutive_separators(&url, "&"); |
| 14 | if(!value || !*value) continue; |
| 15 | |
| 16 | char *name = strsep_skip_consecutive_separators(&value, "="); |
| 17 | if(!name || !*name) continue; |
| 18 | if(!value || !*value) continue; |
| 19 | |
| 20 | // name and value are now the parameters |
| 21 | // they are not null and not empty |
| 22 | |
| 23 | if(!strcmp(name, "scope_nodes")) |
| 24 | req.scope_nodes = value; |
| 25 | else if(!strcmp(name, "nodes")) |
| 26 | req.nodes = value; |
| 27 | else if((mode & (CONTEXTS_V2_NODES | CONTEXTS_V2_CONTEXTS | CONTEXTS_V2_SEARCH | CONTEXTS_V2_ALERTS | CONTEXTS_V2_ALERT_TRANSITIONS)) && !strcmp(name, "scope_contexts")) |
| 28 | req.scope_contexts = value; |
| 29 | else if((mode & (CONTEXTS_V2_NODES | CONTEXTS_V2_CONTEXTS | CONTEXTS_V2_SEARCH | CONTEXTS_V2_ALERTS | CONTEXTS_V2_ALERT_TRANSITIONS)) && !strcmp(name, "contexts")) |
| 30 | req.contexts = value; |
| 31 | else if((mode & CONTEXTS_V2_SEARCH) && !strcmp(name, "q")) |
| 32 | req.q = value; |
| 33 | else if(!strcmp(name, "options")) |
| 34 | req.options |= contexts_options_str_to_id(value); |
| 35 | else if(!strcmp(name, "after")) |
| 36 | req.after = str2l(value); |
| 37 | else if(!strcmp(name, "before")) |
| 38 | req.before = str2l(value); |
| 39 | else if(!strcmp(name, "timeout")) |
| 40 | req.timeout_ms = str2l(value); |
| 41 | else if(!strcmp(name, "cardinality") || !strcmp(name, "cardinality_limit")) |
| 42 | req.cardinality_limit = str2ul(value); |
| 43 | else if(mode & (CONTEXTS_V2_ALERTS | CONTEXTS_V2_ALERT_TRANSITIONS)) { |
| 44 | if (!strcmp(name, "alert")) |
| 45 | req.alerts.alert = value; |
| 46 | else if (!strcmp(name, "transition")) |
| 47 | req.alerts.transition = value; |
| 48 | else if(mode & CONTEXTS_V2_ALERTS) { |
| 49 | if (!strcmp(name, "status")) |
| 50 | req.alerts.status = contexts_alert_status_str_to_id(value); |
| 51 | } |
| 52 | else if(mode & CONTEXTS_V2_ALERT_TRANSITIONS) { |
| 53 | if (!strcmp(name, "last")) |
| 54 | req.alerts.last = strtoul(value, NULL, 0); |
| 55 | else if(!strcmp(name, "context")) |
| 56 | req.contexts = value; |
| 57 | else if (!strcmp(name, "anchor_gi")) { |
| 58 | req.alerts.global_id_anchor = str2ull(value, NULL); |
| 59 | } |
| 60 | else { |
| 61 | for(int i = 0; i < ATF_TOTAL_ENTRIES ;i++) { |
| 62 | if(!strcmp(name, alert_transition_facets[i].query_param)) |
| 63 | req.alerts.facets[i] = value; |
| 64 | } |
| 65 | } |
| 66 | } |
| 67 | } |
| 68 | } |
| 69 | |
| 70 | if ((mode & CONTEXTS_V2_ALERT_TRANSITIONS) && !req.alerts.last) |
| 71 | req.alerts.last = 1; |
| 72 | |
| 73 | buffer_flush(w->response.data); |
| 74 | buffer_no_cacheable(w->response.data); |
| 75 | return rrdcontext_to_json_v2(w->response.data, &req, mode); |
| 76 | } |
| 77 | |
| 78 | int api_v2_contexts(RRDHOST *host __maybe_unused, struct web_client *w, char *url) { |
| 79 | return api_v2_contexts_internal( |
| 80 | host, w, url, CONTEXTS_V2_CONTEXTS | CONTEXTS_V2_NODES | CONTEXTS_V2_AGENTS | CONTEXTS_V2_VERSIONS, |
| 81 | CONTEXTS_OPTION_PRIORITIES | CONTEXTS_OPTION_RETENTION | CONTEXTS_OPTION_LIVENESS | |
| 82 | CONTEXTS_OPTION_FAMILY | CONTEXTS_OPTION_UNITS); |
| 83 | } |