diff options
author | Pavlos Emm. Katsoulakis <paul@netdata.rocks> | 2019-06-28 08:27:57 +0200 |
---|---|---|
committer | Pavlos Emm. Katsoulakis <paul@netdata.rocks> | 2019-06-28 08:27:57 +0200 |
commit | 171d8f5d01f17dddbd531139b86e1a1c96f95b0d (patch) | |
tree | 7b2f049259656e4c14c3d7e23a639964ebb2e07b /libnetdata | |
parent | 5d5266dc1a863d877d91cab232b6369091a198ee (diff) |
Revert "Easily disable alarms, by persisting the silencers configuration (#6274)"
This reverts commit 60a73e90de2aa1c2eaae2ebbc45dd1fb96034df2.
Emergency rollback of potential culprit as per issue #6356
Will be re-merging the change after investigation
Diffstat (limited to 'libnetdata')
-rw-r--r-- | libnetdata/Makefile.am | 2 | ||||
-rw-r--r-- | libnetdata/health/Makefile.am | 8 | ||||
-rw-r--r-- | libnetdata/health/health.c | 154 | ||||
-rw-r--r-- | libnetdata/health/health.h | 54 | ||||
-rw-r--r-- | libnetdata/json/Makefile.am | 9 | ||||
-rw-r--r-- | libnetdata/json/README.md | 5 | ||||
-rw-r--r-- | libnetdata/json/jsmn.c | 326 | ||||
-rw-r--r-- | libnetdata/json/jsmn.h | 75 | ||||
-rw-r--r-- | libnetdata/json/json.c | 546 | ||||
-rw-r--r-- | libnetdata/json/json.h | 72 | ||||
-rw-r--r-- | libnetdata/libnetdata.h | 2 |
11 files changed, 0 insertions, 1253 deletions
diff --git a/libnetdata/Makefile.am b/libnetdata/Makefile.am index 8f41d82105..d2710f0a3e 100644 --- a/libnetdata/Makefile.am +++ b/libnetdata/Makefile.am @@ -21,8 +21,6 @@ SUBDIRS = \ storage_number \ threads \ url \ - json \ - health \ $(NULL) dist_noinst_DATA = \ diff --git a/libnetdata/health/Makefile.am b/libnetdata/health/Makefile.am deleted file mode 100644 index 9b7995f175..0000000000 --- a/libnetdata/health/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -# SPDX-License-Identifier: GPL-3.0-or-later - -AUTOMAKE_OPTIONS = subdir-objects -MAINTAINERCLEANFILES = $(srcdir)/Makefile.in - - -dist_noinst_DATA = \ - $(NULL) diff --git a/libnetdata/health/health.c b/libnetdata/health/health.c deleted file mode 100644 index b3d342d406..0000000000 --- a/libnetdata/health/health.c +++ /dev/null @@ -1,154 +0,0 @@ -#include "health.h" - -/** - * Create Silencer - * - * Allocate a new silencer to Netdata. - * - * @return It returns the address off the silencer on success and NULL otherwise - */ -SILENCER *create_silencer(void) { - SILENCER *t = callocz(1, sizeof(SILENCER)); - debug(D_HEALTH, "HEALTH command API: Created empty silencer"); - - return t; -} - -/** - * Health Silencers add - * - * Add more one silencer to the list of silenecers. - * - * @param silencer - */ -void health_silencers_add(SILENCER *silencer) { - // Add the created instance to the linked list in silencers - silencer->next = silencers->silencers; - silencers->silencers = silencer; - debug(D_HEALTH, "HEALTH command API: Added silencer %s:%s:%s:%s:%s", silencer->alarms, - silencer->charts, silencer->contexts, silencer->hosts, silencer->families - ); -} - -/** - * Silencers Add Parameter - * - * Create a new silencer and adjust the variables - * - * @param silencer a pointer to the silencer that will be adjusted - * @param key the key value sent by client - * @param value the value sent to the key - * - * @return It returns the silencer configured on success and NULL otherwise - */ -SILENCER *health_silencers_addparam(SILENCER *silencer, char *key, char *value) { - static uint32_t - hash_alarm = 0, - hash_template = 0, - hash_chart = 0, - hash_context = 0, - hash_host = 0, - hash_families = 0; - - if (unlikely(!hash_alarm)) { - hash_alarm = simple_uhash(HEALTH_ALARM_KEY); - hash_template = simple_uhash(HEALTH_TEMPLATE_KEY); - hash_chart = simple_uhash(HEALTH_CHART_KEY); - hash_context = simple_uhash(HEALTH_CONTEXT_KEY); - hash_host = simple_uhash(HEALTH_HOST_KEY); - hash_families = simple_uhash(HEALTH_FAMILIES_KEY); - } - - uint32_t hash = simple_uhash(key); - if (unlikely(silencer == NULL)) { - if ( - (hash == hash_alarm && !strcasecmp(key, HEALTH_ALARM_KEY)) || - (hash == hash_template && !strcasecmp(key, HEALTH_TEMPLATE_KEY)) || - (hash == hash_chart && !strcasecmp(key, HEALTH_CHART_KEY)) || - (hash == hash_context && !strcasecmp(key, HEALTH_CONTEXT_KEY)) || - (hash == hash_host && !strcasecmp(key, HEALTH_HOST_KEY)) || - (hash == hash_families && !strcasecmp(key, HEALTH_FAMILIES_KEY)) - ) { - silencer = create_silencer(); - if(!silencer) { - error("Cannot add a new silencer to Netdata"); - return NULL; - } - } - } - - if (hash == hash_alarm && !strcasecmp(key, HEALTH_ALARM_KEY)) { - silencer->alarms = strdupz(value); - silencer->alarms_pattern = simple_pattern_create(silencer->alarms, NULL, SIMPLE_PATTERN_EXACT); - } else if (hash == hash_chart && !strcasecmp(key, HEALTH_CHART_KEY)) { - silencer->charts = strdupz(value); - silencer->charts_pattern = simple_pattern_create(silencer->charts, NULL, SIMPLE_PATTERN_EXACT); - } else if (hash == hash_context && !strcasecmp(key, HEALTH_CONTEXT_KEY)) { - silencer->contexts = strdupz(value); - silencer->contexts_pattern = simple_pattern_create(silencer->contexts, NULL, SIMPLE_PATTERN_EXACT); - } else if (hash == hash_host && !strcasecmp(key, HEALTH_HOST_KEY)) { - silencer->hosts = strdupz(value); - silencer->hosts_pattern = simple_pattern_create(silencer->hosts, NULL, SIMPLE_PATTERN_EXACT); - } else if (hash == hash_families && !strcasecmp(key, HEALTH_FAMILIES_KEY)) { - silencer->families = strdupz(value); - silencer->families_pattern = simple_pattern_create(silencer->families, NULL, SIMPLE_PATTERN_EXACT); - } - - return silencer; -} - -/** - * JSON Read Callback - * - * Callback called by netdata to create the silencer. - * - * @param e the main json structure - * - * @return It always return 0. - */ -int health_silencers_json_read_callback(JSON_ENTRY *e) -{ - switch(e->type) { - case JSON_OBJECT: -#ifndef ENABLE_JSONC - e->callback_function = health_silencers_json_read_callback; - if(e->name && strcmp(e->name,"")) { - // init silencer - debug(D_HEALTH, "JSON: Got object with a name, initializing new silencer for %s",e->name); -#endif - e->callback_data = create_silencer(); - if(e->callback_data) { - health_silencers_add(e->callback_data); - } -#ifndef ENABLE_JSONC - } -#endif - break; - - case JSON_ARRAY: - e->callback_function = health_silencers_json_read_callback; - break; - - case JSON_STRING: - if(!strcmp(e->name,"type")) { - debug(D_HEALTH, "JSON: Processing type=%s",e->data.string); - if (!strcmp(e->data.string,"SILENCE")) silencers->stype = STYPE_SILENCE_NOTIFICATIONS; - else if (!strcmp(e->data.string,"DISABLE")) silencers->stype = STYPE_DISABLE_ALARMS; - } else { - debug(D_HEALTH, "JSON: Adding %s=%s", e->name, e->data.string); - health_silencers_addparam(e->callback_data, e->name, e->data.string); - } - break; - - case JSON_BOOLEAN: - debug(D_HEALTH, "JSON: Processing all_alarms"); - silencers->all_alarms=e->data.boolean?1:0; - break; - - case JSON_NUMBER: - case JSON_NULL: - break; - } - - return 0; -} diff --git a/libnetdata/health/health.h b/libnetdata/health/health.h deleted file mode 100644 index 7d560fe95c..0000000000 --- a/libnetdata/health/health.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef NETDATA_HEALTH_LIB -# define NETDATA_HEALTH_LIB 1 - -# include "../libnetdata.h" - -#define HEALTH_ALARM_KEY "alarm" -#define HEALTH_TEMPLATE_KEY "template" -#define HEALTH_CONTEXT_KEY "context" -#define HEALTH_CHART_KEY "chart" -#define HEALTH_HOST_KEY "hosts" -#define HEALTH_OS_KEY "os" -#define HEALTH_FAMILIES_KEY "families" -#define HEALTH_LOOKUP_KEY "lookup" -#define HEALTH_CALC_KEY "calc" - -typedef struct silencer { - char *alarms; - SIMPLE_PATTERN *alarms_pattern; - - char *hosts; - SIMPLE_PATTERN *hosts_pattern; - - char *contexts; - SIMPLE_PATTERN *contexts_pattern; - - char *charts; - SIMPLE_PATTERN *charts_pattern; - - char *families; - SIMPLE_PATTERN *families_pattern; - - struct silencer *next; -} SILENCER; - -typedef enum silence_type { - STYPE_NONE, - STYPE_DISABLE_ALARMS, - STYPE_SILENCE_NOTIFICATIONS -} SILENCE_TYPE; - -typedef struct silencers { - int all_alarms; - SILENCE_TYPE stype; - SILENCER *silencers; -} SILENCERS; - -SILENCERS *silencers; - -extern SILENCER *create_silencer(void); -extern int health_silencers_json_read_callback(JSON_ENTRY *e); -extern void health_silencers_add(SILENCER *silencer); -extern SILENCER * health_silencers_addparam(SILENCER *silencer, char *key, char *value); - -#endif diff --git a/libnetdata/json/Makefile.am b/libnetdata/json/Makefile.am deleted file mode 100644 index 1cb69ed99a..0000000000 --- a/libnetdata/json/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -# SPDX-License-Identifier: GPL-3.0-or-later - -AUTOMAKE_OPTIONS = subdir-objects -MAINTAINERCLEANFILES = $(srcdir)/Makefile.in - - -dist_noinst_DATA = \ - README.md \ - $(NULL) diff --git a/libnetdata/json/README.md b/libnetdata/json/README.md deleted file mode 100644 index fd6cb0f319..0000000000 --- a/libnetdata/json/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# json - -`json` contains a parser for json strings, based on `jsmn` (https://github.com/zserge/jsmn), but case you have installed the JSON-C library, the installation script will prefer it, you can also force its use with `--enable-jsonc` in the compilation time. - -[![analytics](https://www.google-analytics.com/collect?v=1&aip=1&t=pageview&_s=1&ds=github&dr=https%3A%2F%2Fgithub.com%2Fnetdata%2Fnetdata&dl=https%3A%2F%2Fmy-netdata.io%2Fgithub%2Flibnetdata%2Fjson%2FREADME&_u=MAC~&cid=5792dfd7-8dc4-476b-af31-da2fdb9f93d2&tid=UA-64295674-3)]() diff --git a/libnetdata/json/jsmn.c b/libnetdata/json/jsmn.c deleted file mode 100644 index c8d9e73db9..0000000000 --- a/libnetdata/json/jsmn.c +++ /dev/null @@ -1,326 +0,0 @@ -#include <stdlib.h> - -#include "jsmn.h" - -/** - * Alloc token - * - * Allocates a fresh unused token from the token pull. - * - * @param parser the controller - * @param tokens the tokens I am working - * @param num_tokens the number total of tokens. - * - * @return it returns the next token to work. - */ -static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser, - jsmntok_t *tokens, size_t num_tokens) { - jsmntok_t *tok; - if (parser->toknext >= num_tokens) { - return NULL; - } - tok = &tokens[parser->toknext++]; - tok->start = tok->end = -1; - tok->size = 0; -#ifdef JSMN_PARENT_LINKS - tok->parent = -1; -#endif - return tok; -} - -/** - * Fill Token - * - * Fills token type and boundaries. - * - * @param token the structure to set the values - * @param type is the token type - * @param start is the first position of the value - * @param end is the end of the value - */ -static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type, - int start, int end) { - token->type = type; - token->start = start; - token->end = end; - token->size = 0; -} - -/** - * Parse primitive - * - * Fills next available token with JSON primitive. - * - * @param parser is the control structure - * @param js is the json string - * @param type is the token type - */ -static jsmnerr_t jsmn_parse_primitive(jsmn_parser *parser, const char *js, - size_t len, jsmntok_t *tokens, size_t num_tokens) { - jsmntok_t *token; - int start; - - start = parser->pos; - - for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { - switch (js[parser->pos]) { -#ifndef JSMN_STRICT - /* In strict mode primitive must be followed by "," or "}" or "]" */ - case ':': -#endif - case '\t' : case '\r' : case '\n' : case ' ' : - case ',' : case ']' : case '}' : - goto found; - } - if (js[parser->pos] < 32 || js[parser->pos] >= 127) { - parser->pos = start; - return JSMN_ERROR_INVAL; - } - } -#ifdef JSMN_STRICT - /* In strict mode primitive must be followed by a comma/object/array */ - parser->pos = start; - return JSMN_ERROR_PART; -#endif - - found: - if (tokens == NULL) { - parser->pos--; - return 0; - } - token = jsmn_alloc_token(parser, tokens, num_tokens); - if (token == NULL) { - parser->pos = start; - return JSMN_ERROR_NOMEM; - } - jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos); -#ifdef JSMN_PARENT_LINKS - token->parent = parser->toksuper; -#endif - parser->pos--; - return 0; -} - -/** - * Parse string - * - * Fills next token with JSON string. - * - * @param parser is the control structure - * @param js is the json string - * @param len is the js length - * @param tokens is structure with the tokens mapped. - * @param num_tokens is the total number of tokens - * - * @return It returns 0 on success and another integer otherwise - */ -static jsmnerr_t jsmn_parse_string(jsmn_parser *parser, const char *js, - size_t len, jsmntok_t *tokens, size_t num_tokens) { - jsmntok_t *token; - - int start = parser->pos; - - parser->pos++; - - /* Skip starting quote */ - for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { - char c = js[parser->pos]; - - /* Quote: end of string */ - if (c == '\"') { - if (tokens == NULL) { - return 0; - } - token = jsmn_alloc_token(parser, tokens, num_tokens); - if (token == NULL) { - parser->pos = start; - return JSMN_ERROR_NOMEM; - } - jsmn_fill_token(token, JSMN_STRING, start+1, parser->pos); -#ifdef JSMN_PARENT_LINKS - token->parent = parser->toksuper; -#endif - return 0; - } - - /* Backslash: Quoted symbol expected */ - if (c == '\\') { - parser->pos++; - switch (js[parser->pos]) { - /* Allowed escaped symbols */ - case '\"': case '/' : case '\\' : case 'b' : - case 'f' : case 'r' : case 'n' : case 't' : - break; - /* Allows escaped symbol \uXXXX */ - case 'u': - parser->pos++; - int i = 0; - for(; i < 4 && js[parser->pos] != '\0'; i++) { - /* If it isn't a hex character we have an error */ - if(!((js[parser->pos] >= 48 && js[parser->pos] <= 57) || /* 0-9 */ - (js[parser->pos] >= 65 && js[parser->pos] <= 70) || /* A-F */ - (js[parser->pos] >= 97 && js[parser->pos] <= 102))) { /* a-f */ - parser->pos = start; - return JSMN_ERROR_INVAL; - } - parser->pos++; - } - parser->pos--; - break; - /* Unexpected symbol */ - default: - parser->pos = start; - return JSMN_ERROR_INVAL; - } - } - } - parser->pos = start; - return JSMN_ERROR_PART; -} - -/** - * JSMN Parse - * - * Parse JSON string and fill tokens. - * - * @param parser the auxiliar vector used to parser - * @param js the string to parse - * @param len the string length - * @param tokens the place to map the tokens - * @param num_tokens the number of tokens present in the tokens structure. - * - * @return It returns the number of tokens present in the string on success or a negative number otherwise - */ -jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, size_t len, - jsmntok_t *tokens, unsigned int num_tokens) { - jsmnerr_t r; - int i; - jsmntok_t *token; - int count = 0; - - for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { - char c; - jsmntype_t type; - - c = js[parser->pos]; - switch (c) { - case '{': case '[': - count++; - if (tokens == NULL) { - break; - } - token = jsmn_alloc_token(parser, tokens, num_tokens); - if (token == NULL) - return JSMN_ERROR_NOMEM; - if (parser->toksuper != -1) { - tokens[parser->toksuper].size++; -#ifdef JSMN_PARENT_LINKS - token->parent = parser->toksuper; -#endif - } - token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY); - token->start = parser->pos; - parser->toksuper = parser->toknext - 1; - break; - case '}': case ']': - if (tokens == NULL) - break; - type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY); -#ifdef JSMN_PARENT_LINKS - if (parser->toknext < 1) { - return JSMN_ERROR_INVAL; - } - token = &tokens[parser->toknext - 1]; - for (;;) { - if (token->start != -1 && token->end == -1) { - if (token->type != type) { - return JSMN_ERROR_INVAL; - } - token->end = parser->pos + 1; - parser->toksuper = token->parent; - break; - } - if (token->parent == -1) { - break; - } - token = &tokens[token->parent]; - } -#else - for (i = parser->toknext - 1; i >= 0; i--) { - token = &tokens[i]; - if (token->start != -1 && token->end == -1) { - if (token->type != type) { - return JSMN_ERROR_INVAL; - } - parser->toksuper = -1; - token->end = parser->pos + 1; - break; - } - } - /* Error if unmatched closing bracket */ - if (i == -1) return JSMN_ERROR_INVAL; - for (; i >= 0; i--) { - token = &tokens[i]; - if (token->start != -1 && token->end == -1) { - parser->toksuper = i; - break; - } - } -#endif - break; - case '\"': - r = jsmn_parse_string(parser, js, len, tokens, num_tokens); - if (r < 0) return r; - count++; - if (parser->toksuper != -1 && tokens != NULL) - tokens[parser->toksuper].size++; - break; - case '\t' : case '\r' : case '\n' : case ':' : case ',': case ' ': - break; -#ifdef JSMN_STRICT - /* In strict mode primitives are: numbers and booleans */ - case '-': case '0': case '1' : case '2': case '3' : case '4': - case '5': case '6': case '7' : case '8': case '9': - case 't': case 'f': case 'n' : -#else - /* In non-strict mode every unquoted value is a primitive */ - default: -#endif - r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens); - if (r < 0) return r; - count++; - if (parser->toksuper != -1 && tokens != NULL) - tokens[parser->toksuper].size++; - break; - -#ifdef JSMN_STRICT - /* Unexpected char in strict mode */ - default: - return JSMN_ERROR_INVAL; -#endif - } - } - - for (i = parser->toknext - 1; i >= 0; i--) { - /* Unmatched opened object or array */ - if (tokens[i].start != -1 && tokens[i].end == -1) { - return JSMN_ERROR_PART; - } - } - - return count; -} - -/** - * JSMN Init - * - * Creates a new parser based over a given buffer with an array of tokens - * available. - * - * @param parser is the structure with values to reset - */ -void jsmn_init(jsmn_parser *parser) { - parser->pos = 0; - parser->toknext = 0; - parser->toksuper = -1; -}
\ No newline at end of file diff --git a/libnetdata/json/jsmn.h b/libnetdata/json/jsmn.h deleted file mode 100644 index beff586c66..0000000000 --- a/libnetdata/json/jsmn.h +++ /dev/null @@ -1,75 +0,0 @@ -#ifndef __JSMN_H_ -#define __JSMN_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include <stddef.h> -/** - * JSON type identifier. Basic types are: - * o Object - * o Array - * o String - * o Other primitive: number, boolean (true/false) or null - */ -typedef enum { - JSMN_PRIMITIVE = 0, - JSMN_OBJECT = 1, - JSMN_ARRAY = 2, - JSMN_STRING = 3 -} jsmntype_t; - -typedef enum { - /* Not enough tokens were provided */ - JSMN_ERROR_NOMEM = -1, - /* Invalid character inside JSON string */ - JSMN_ERROR_INVAL = -2, - /* The string is not a full JSON packet, more bytes expected */ - JSMN_ERROR_PART = -3, -} jsmnerr_t; - -/** - * JSON token description. - * - * @param type type (object, array, string etc.) - * @param start start position in JSON data string - * @param end end position in JSON data string - */ -typedef struct { - jsmntype_t type; - int start; - int end; - int size; -#ifdef JSMN_PARENT_LINKS - int parent; -#endif -} jsmntok_t; - -/** - * JSON parser. Contains an array of token blocks available. Also stores - * the string being parsed now and current position in that string - */ -typedef struct { - unsigned int pos; /* offset in the JSON string */ - unsigned int toknext; /* next token to allocate */ - int toksuper; /* superior token node, e.g parent object or array */ -} jsmn_parser; - -/** - * Create JSON parser over an array of tokens - */ -void jsmn_init(jsmn_parser *parser); - -/** - * Run JSON parser. It parses a JSON data string into and array of tokens, each describing - * a single JSON object. - */ -jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, size_t len, - jsmntok_t *tokens, unsigned int num_tokens); - -#ifdef __cplusplus -} -#endif - -#endif /* __JSMN_H_ */
\ No newline at end of file diff --git a/libnetdata/json/json.c b/libnetdata/json/json.c deleted file mode 100644 index c9ff39b056..0000000000 --- a/libnetdata/json/json.c +++ /dev/null @@ -1,546 +0,0 @@ -#include "jsmn.h" -#include "../libnetdata.h" -#include "json.h" -#include "libnetdata/libnetdata.h" -#include "../../health/health.h" - -#define JSON_TOKENS 1024 - -int json_tokens = JSON_TOKENS; - -/** - * Json Tokenise - * - * Map the string given inside tokens. - * - * @param js is the string used to create the tokens - * @param len is the string length - * @param count the number of tokens present in the string - * - * @return it returns the json parsed in tokens - */ -#ifdef ENABLE_JSONC -json_object *json_tokenise(char *js) { - if(!js) { - error("JSON: json string is empty."); - return NULL; - } - - json_object *token = json_tokener_parse(js); - if(!token) { - error("JSON: Invalid json string."); - return NULL; - } - - return token; -} -#else -jsmntok_t *json_tokenise(char *js, size_t len, size_t *count) -{ - int n = json_tokens; - if(!js || !len) { - error("JSON: json string is empty."); - return NULL; - } - - jsmn_parser parser; - jsmn_init(&parser); - - jsmntok_t *tokens = mallocz(sizeof(jsmntok_t) * n); - if(!tokens) return NULL; - - int ret = jsmn_parse(&parser, js, len, tokens, n); - while (ret == JSMN_ERROR_NOMEM) { - n *= 2; - jsmntok_t *new = reallocz(tokens, sizeof(jsmntok_t) * n); - if(!new) { - freez(tokens); - return NULL; - } - tokens = new; - ret = jsmn_parse(&parser, js, len, tokens, n); - } - - if (ret == JSMN_ERROR_INVAL) { - error("JSON: Invalid json string."); - freez(tokens); - return NULL; - } - else if (ret == JSMN_ERROR_PART) { - error("JSON: Truncated JSON string."); - freez(tokens); - return NULL; - } - - if(count) *count = (size_t)ret; - - if(json_tokens < n) json_tokens = n; - return tokens; -} -#endif - -/** - * Callback Print - * - * Set callback print case necesary and wrinte an information inside a buffer to write in the log. - * - * @param e a pointer for a structure that has the complete information about json structure. - * - * @return It always return 0 - */ -int json_callback_print(JSON_ENTRY *e) -{ - BUFFER *wb=buffer_create(300); - - buffer_sprintf(wb,"%s = ", e->name); - char txt[50]; - switch(e->type) { - case JSON_OBJECT: - e->callback_function = json_callback_print; - buffer_strcat(wb,"OBJECT"); - break; - - case JSON_ARRAY: - e->callback_function = json_callback_print; - sprintf(txt,"ARRAY[%lu]", e->data.items); - buffer_strcat(wb, txt); - break; - - case JSON_STRING: - buffer_strcat(wb, e->data.string); - break; - - case JSON_NUMBER: - sprintf(txt,"%Lf", e->data.number); - buffer_strcat(wb,txt); - - break; - - case JSON_BOOLEAN: - buffer_strcat(wb, e->data.boolean?"TRUE":"FALSE"); - break; - - case JSON_NULL: - buffer_strcat(wb,"NULL"); - break; - } - info("JSON: %s", buffer_tostring(wb)); - buffer_free(wb); - return 0; -} - -/** - * JSONC Set String - * - * Set the string value of the structure JSON_ENTRY. - * - * @param e the output structure - */ -static inline void json_jsonc_set_string(JSON_ENTRY *e,char *key,const char *value) { - size_t length = strlen(key); - e->type = JSON_STRING; - memcpy(e->name,key,length); - e->name[length] = 0x00; - e->data.string = (char *) value; -} - - -#ifdef ENABLE_JSONC -/** - * JSONC set Boolean - * - * Set the boolean value of the structure JSON_ENTRY - * - * @param e the output structure - * @param value the input value - */ -static inline void json_jsonc_set_boolean(JSON_ENTRY *e,int value) { - e->type = JSON_BOOLEAN; - e->data.boolean = value; -} - -/** - * Parse Array - * - * Parse the array object. - * - * @param ptr the pointer for the object that we will parse. - * @param callback_data additional data to be used together the callback function - * @param callback_function function used to create a silencer. - */ -static inline void json_jsonc_parse_array(json_object *ptr, void *callback_data,int (*callback_function)(struct json_entry *)) { - int end = json_object_array_length(ptr); - JSON_ENTRY e; - - if(end) { - int i; - i = 0; - - enum json_type type; - do { - json_object *jvalue = json_object_array_get_idx(ptr, i); - if(jvalue) { - e.callback_data = callback_data; - e.type = JSON_OBJECT; - callback_function(&e); - json_object_object_foreach(jvalue, key, val) { - type = json_object_get_type(val); - if (type == json_type_array) { - e.type = JSON_ARRAY; - json_jsonc_parse_array(val, callback_data, callback_function); - } else if (type == json_type_object) { - json_walk(val,callback_data,callback_function); - } else if (type == json_type_string) { - json_jsonc_set_string(&e,key,json_object_get_string(val)); - callback_function(&e); - } else if (type == json_type_boolean) { - json_jsonc_set_boolean(&e,json_object_get_boolean(val)); - callback_function(&e); - } - } - } - - } while (++i < end); - } -} -#else - -/** - * Walk string - * - * Set JSON_ENTRY to string and map the values from jsmntok_t. - * - * @param js the original string - * @param t the tokens - * @param start the first position - * @param e the output structure. - * - * @return It always return 1 - */ -size_t json_walk_string(char *js, jsmntok_t *t, size_t start, JSON_ENTRY *e) -{ - char old = js[t[start].end]; - js[t[start].end] = '\0'; - e->original_string = &js[t[start].start]; - - e->type = JSON_STRING; - e->data.string = e->original_string; - if(e->callback_function) e->callback_function(e); - js[t[start].end] = old; - return 1; -} - -/** - * Walk Primitive - * - * Define the data type of the string - * - * @param js the original string - * @param t the tokens - * @param start the first position - * @param e the output structure. - * - * @return It always return 1 - */ -size_t json_walk_primitive(char *js, jsmntok_t *t, size_t start, JSON_ENTRY *e) -{ - char old = js[t[start].end]; - js[t[start].end] = '\0'; - e->original_string = &js[t[start].start]; - - switch(e->original_string[0]) { - case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': - case '8': case '9': case '-': case '.': - e->type = JSON_NUMBER; - e->data.number = strtold(e->original_string, NULL); - break; - - case 't': case 'T': - e->type = JSON_BOOLEAN; - e->data.boolean = 1; - break; - - case 'f': case 'F': - e->type = JSON_BOOLEAN; - |