diff options
-rw-r--r-- | include/zbxserver.h | 1 | ||||
-rw-r--r-- | src/libs/zbxserver/evalfunc.c | 67 | ||||
-rw-r--r-- | src/libs/zbxserver/evalfunc.h | 9 | ||||
-rw-r--r-- | src/libs/zbxserver/expression.c | 29 |
4 files changed, 68 insertions, 38 deletions
diff --git a/include/zbxserver.h b/include/zbxserver.h index b144f357c33..2c94a345bde 100644 --- a/include/zbxserver.h +++ b/include/zbxserver.h @@ -49,6 +49,7 @@ #define MACRO_TYPE_ALLOWED_HOSTS 0x00800000 #define MACRO_TYPE_ITEM_TAG 0x01000000 #define MACRO_TYPE_EVENT_NAME 0x02000000 /* event name in trigger configuration */ +#define MACRO_TYPE_EXPRESSION 0x04000000 /* macros in expression macro */ #define MACRO_EXPAND_NO 0 #define MACRO_EXPAND_YES 1 diff --git a/src/libs/zbxserver/evalfunc.c b/src/libs/zbxserver/evalfunc.c index 5c76c486e46..a1e0d2910a7 100644 --- a/src/libs/zbxserver/evalfunc.c +++ b/src/libs/zbxserver/evalfunc.c @@ -3384,7 +3384,7 @@ void zbx_format_value(char *value, size_t max_len, zbx_uint64_t valuemapid, * * ******************************************************************************/ int evaluate_macro_function(char **result, const char *host, const char *key, const char *function, - const char *parameter) + const char *parameter, zbx_output_format_t format) { zbx_host_key_t host_key = {(char *)host, (char *)key}; DC_ITEM item; @@ -3411,48 +3411,51 @@ int evaluate_macro_function(char **result, const char *host, const char *key, co } else { - size_t len; + if (ZBX_FORMAT_HUMAN == format) + { + size_t len; - len = strlen(value) + 1 + MAX_BUFFER_LEN; - value = (char *)zbx_realloc(value, len); + len = strlen(value) + 1 + MAX_BUFFER_LEN; + value = (char *)zbx_realloc(value, len); - if (SUCCEED == str_in_list("last,prev", function, ',')) - { - /* last, prev functions can return quoted and escaped string values */ - /* which must be unquoted and unescaped before further processing */ - if ('"' == *value) + if (SUCCEED == str_in_list("last,prev", function, ',')) { - char *src, *dst; + /* last, prev functions can return quoted and escaped string values */ + /* which must be unquoted and unescaped before further processing */ + if ('"' == *value) + { + char *src, *dst; - for (dst = value, src = dst + 1; '"' != *src; ) + for (dst = value, src = dst + 1; '"' != *src; ) + { + if ('\\' == *src) + src++; + if ('\0' == *src) + break; + *dst++ = *src++; + } + *dst = '\0'; + } + zbx_format_value(value, len, item.valuemapid, item.units, item.value_type); + } + else if (SUCCEED == str_in_list("abschange,avg,change,delta,max,min,percentile,sum,forecast", function, + ',')) + { + switch (item.value_type) { - if ('\\' == *src) - src++; - if ('\0' == *src) + case ITEM_VALUE_TYPE_FLOAT: + case ITEM_VALUE_TYPE_UINT64: + add_value_suffix(value, len, item.units, item.value_type); break; - *dst++ = *src++; + default: + ; } - *dst = '\0'; } - zbx_format_value(value, len, item.valuemapid, item.units, item.value_type); - } - else if (SUCCEED == str_in_list("abschange,avg,change,delta,max,min,percentile,sum,forecast", function, - ',')) - { - switch (item.value_type) + else if (SUCCEED == str_in_list("timeleft", function, ',')) { - case ITEM_VALUE_TYPE_FLOAT: - case ITEM_VALUE_TYPE_UINT64: - add_value_suffix(value, len, item.units, item.value_type); - break; - default: - ; + add_value_suffix(value, len, "s", ITEM_VALUE_TYPE_FLOAT); } } - else if (SUCCEED == str_in_list("timeleft", function, ',')) - { - add_value_suffix(value, len, "s", ITEM_VALUE_TYPE_FLOAT); - } *result = zbx_strdup(NULL, value); ret = SUCCEED; diff --git a/src/libs/zbxserver/evalfunc.h b/src/libs/zbxserver/evalfunc.h index e7470a15881..13ca101239e 100644 --- a/src/libs/zbxserver/evalfunc.h +++ b/src/libs/zbxserver/evalfunc.h @@ -20,8 +20,15 @@ #ifndef ZABBIX_EVALFUNC_H #define ZABBIX_EVALFUNC_H +typedef enum +{ + ZBX_FORMAT_RAW, + ZBX_FORMAT_HUMAN +} +zbx_output_format_t; + int evaluate_macro_function(char **result, const char *host, const char *key, const char *function, - const char *parameter); + const char *parameter, zbx_output_format_t format); int evaluatable_for_notsupported(const char *fn); #endif diff --git a/src/libs/zbxserver/expression.c b/src/libs/zbxserver/expression.c index fbc89f1defc..dbb123d9940 100644 --- a/src/libs/zbxserver/expression.c +++ b/src/libs/zbxserver/expression.c @@ -2545,7 +2545,7 @@ static int get_expression_macro_result(const DB_EVENT *event, const DB_EVENT *r_ zabbix_log(LOG_LEVEL_DEBUG, "In %s() expression:'%s'", __func__, *expression); substitute_simple_macros_impl(NULL, event, r_event, NULL, NULL, NULL, NULL, alert, ack, NULL, expression, - MACRO_TYPE_MESSAGE_NORMAL, error, maxerrlen); + MACRO_TYPE_EXPRESSION, error, maxerrlen); zbx_vector_ptr_create(&unknown_msgs); @@ -2736,7 +2736,7 @@ static const char *macro_in_list(const char *str, zbx_strloc_t strloc, const cha * * ******************************************************************************/ static int get_trigger_function_value(const char *expression, char **replace_to, char *data, - const zbx_token_simple_macro_t *simple_macro) + const zbx_token_simple_macro_t *simple_macro, zbx_output_format_t format) { char *host = NULL, *key = NULL; int N_functionid, ret = FAIL; @@ -2760,7 +2760,7 @@ static int get_trigger_function_value(const char *expression, char **replace_to, ret = evaluate_macro_function(replace_to, (NULL == host ? data + simple_macro->host.l : host), (NULL == key ? data + simple_macro->key.l : key), data + simple_macro->func.l, - data + simple_macro->func_param.l + 1); + data + simple_macro->func_param.l + 1, format); data[simple_macro->host.r + 1] = ':'; data[simple_macro->key.r + 1] = '.'; @@ -3055,7 +3055,7 @@ static int substitute_simple_macros_impl(zbx_uint64_t *actionid, const DB_EVENT break; case ZBX_TOKEN_SIMPLE_MACRO: if (0 == (macro_type & (MACRO_TYPE_MESSAGE_NORMAL | MACRO_TYPE_MESSAGE_RECOVERY | - MACRO_TYPE_MESSAGE_ACK)) || + MACRO_TYPE_MESSAGE_ACK | MACRO_TYPE_EXPRESSION)) || EVENT_SOURCE_TRIGGERS != ((NULL != r_event) ? r_event : event)->source) { pos++; @@ -3098,7 +3098,7 @@ static int substitute_simple_macros_impl(zbx_uint64_t *actionid, const DB_EVENT else if (ZBX_TOKEN_SIMPLE_MACRO == token.type) { ret = get_trigger_function_value(c_event->trigger.expression, &replace_to, - *data, &token.data.simple_macro); + *data, &token.data.simple_macro, ZBX_FORMAT_HUMAN); } else if (0 == strncmp(m, MVAR_ACTION, ZBX_CONST_STRLEN(MVAR_ACTION))) { @@ -4721,6 +4721,25 @@ static int substitute_simple_macros_impl(zbx_uint64_t *actionid, const DB_EVENT } } } + else if (0 == indexed_macro && 0 != (macro_type & MACRO_TYPE_EXPRESSION)) + { + const DB_EVENT *c_event; + + c_event = ((NULL != r_event) ? r_event : event); + + if (ZBX_TOKEN_USER_MACRO == token.type) + { + cache_trigger_hostids(&hostids, c_event->trigger.expression, + c_event->trigger.recovery_expression); + DCget_user_macro(hostids.values, hostids.values_num, m, &replace_to); + pos = token.loc.r; + } + else if (ZBX_TOKEN_SIMPLE_MACRO == token.type) + { + ret = get_trigger_function_value(c_event->trigger.expression, &replace_to, + *data, &token.data.simple_macro, ZBX_FORMAT_RAW); + } + } if (0 != (macro_type & MACRO_TYPE_HTTP_JSON) && NULL != replace_to) zbx_json_escape(&replace_to); |