Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/zabbix/zabbix.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/zbxserver.h1
-rw-r--r--src/libs/zbxserver/evalfunc.c67
-rw-r--r--src/libs/zbxserver/evalfunc.h9
-rw-r--r--src/libs/zbxserver/expression.c29
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);