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:
authorAndris Zeila <andris.zeila@zabbix.com>2021-04-12 15:36:45 +0300
committerAndris Zeila <andris.zeila@zabbix.com>2021-04-12 15:37:20 +0300
commitb3d03b8df55767fc41c66a07b6db0a7054497bdd (patch)
tree9ef8b29546258e9d2ca17af9acbdbad8032e5671 /include
parent54398cf5ee892f5dfce1b01f85963c6daac2cfa9 (diff)
........S. [ZBXNEXT-6451] copied libzxbeval from the calculated item branch, added macro expression evaluation
Diffstat (limited to 'include')
-rw-r--r--include/common.h1
-rw-r--r--include/dbcache.h3
-rw-r--r--include/zbxeval.h75
-rw-r--r--include/zbxserver.h8
4 files changed, 62 insertions, 25 deletions
diff --git a/include/common.h b/include/common.h
index b7f3bde2b46..fc2a669d77d 100644
--- a/include/common.h
+++ b/include/common.h
@@ -1183,6 +1183,7 @@ void zbx_strncpy_alloc(char **str, size_t *alloc_len, size_t *offset, const char
void zbx_strcpy_alloc(char **str, size_t *alloc_len, size_t *offset, const char *src);
void zbx_chrcpy_alloc(char **str, size_t *alloc_len, size_t *offset, char c);
void zbx_str_memcpy_alloc(char **str, size_t *alloc_len, size_t *offset, const char *src, size_t n);
+void zbx_strquote_alloc(char **str, size_t *str_alloc, size_t *str_offset, const char *value_str);
void zbx_strsplit(const char *src, char delimiter, char **left, char **right);
diff --git a/include/dbcache.h b/include/dbcache.h
index 41bba8facc9..3aacdd44a13 100644
--- a/include/dbcache.h
+++ b/include/dbcache.h
@@ -975,6 +975,9 @@ const char *zbx_dc_get_instanceid(void);
char *zbx_dc_expand_user_macros(const char *text, zbx_uint64_t hostid);
char *zbx_dc_expand_user_macros_in_func_params(const char *params, zbx_uint64_t hostid);
+int zbx_dc_expand_user_macros_len(const char *text, size_t text_len, zbx_uint64_t *hostids, int hostids_num,
+ char **value, char **error);
+
/* diagnostic data */
void zbx_hc_get_diag_stats(zbx_uint64_t *items_num, zbx_uint64_t *values_num);
diff --git a/include/zbxeval.h b/include/zbxeval.h
index 85d7f6fee2d..73bf9b87530 100644
--- a/include/zbxeval.h
+++ b/include/zbxeval.h
@@ -58,21 +58,20 @@
#define ZBX_EVAL_TOKEN_OP_NOT (14 | ZBX_EVAL_CLASS_OPERATOR1 | ZBX_EVAL_OP_SET_PRECEDENCE(2))
#define ZBX_EVAL_TOKEN_VAR_NUM (15 | ZBX_EVAL_CLASS_OPERAND)
#define ZBX_EVAL_TOKEN_VAR_STR (16 | ZBX_EVAL_CLASS_OPERAND)
-#define ZBX_EVAL_TOKEN_VAR_TIME (17 | ZBX_EVAL_CLASS_OPERAND)
-#define ZBX_EVAL_TOKEN_VAR_MACRO (18 | ZBX_EVAL_CLASS_OPERAND)
-#define ZBX_EVAL_TOKEN_VAR_USERMACRO (19 | ZBX_EVAL_CLASS_OPERAND)
-#define ZBX_EVAL_TOKEN_VAR_LLDMACRO (20 | ZBX_EVAL_CLASS_OPERAND)
-#define ZBX_EVAL_TOKEN_FUNCTIONID (21 | ZBX_EVAL_CLASS_OPERAND)
-#define ZBX_EVAL_TOKEN_FUNCTION (22 | ZBX_EVAL_CLASS_FUNCTION)
-#define ZBX_EVAL_TOKEN_HIST_FUNCTION (23 | ZBX_EVAL_CLASS_FUNCTION)
-#define ZBX_EVAL_TOKEN_GROUP_OPEN (24 | ZBX_EVAL_CLASS_SEPARATOR)
-#define ZBX_EVAL_TOKEN_GROUP_CLOSE (25 | ZBX_EVAL_CLASS_OPERAND)
-#define ZBX_EVAL_TOKEN_COMMA (26 | ZBX_EVAL_CLASS_SEPARATOR)
-#define ZBX_EVAL_TOKEN_ARG_QUERY (27 | ZBX_EVAL_CLASS_OPERAND)
-#define ZBX_EVAL_TOKEN_ARG_PERIOD (28 | ZBX_EVAL_CLASS_OPERAND)
-#define ZBX_EVAL_TOKEN_ARG_NULL (29 | ZBX_EVAL_CLASS_OPERAND)
-#define ZBX_EVAL_TOKEN_ARG_RAW (30 | ZBX_EVAL_CLASS_OPERAND)
-#define ZBX_EVAL_TOKEN_EXCEPTION (31 | ZBX_EVAL_CLASS_FUNCTION)
+#define ZBX_EVAL_TOKEN_VAR_MACRO (17 | ZBX_EVAL_CLASS_OPERAND)
+#define ZBX_EVAL_TOKEN_VAR_USERMACRO (18 | ZBX_EVAL_CLASS_OPERAND)
+#define ZBX_EVAL_TOKEN_VAR_LLDMACRO (19 | ZBX_EVAL_CLASS_OPERAND)
+#define ZBX_EVAL_TOKEN_FUNCTIONID (20 | ZBX_EVAL_CLASS_OPERAND)
+#define ZBX_EVAL_TOKEN_FUNCTION (21 | ZBX_EVAL_CLASS_FUNCTION)
+#define ZBX_EVAL_TOKEN_HIST_FUNCTION (22 | ZBX_EVAL_CLASS_FUNCTION)
+#define ZBX_EVAL_TOKEN_GROUP_OPEN (23 | ZBX_EVAL_CLASS_SEPARATOR)
+#define ZBX_EVAL_TOKEN_GROUP_CLOSE (24 | ZBX_EVAL_CLASS_OPERAND)
+#define ZBX_EVAL_TOKEN_COMMA (25 | ZBX_EVAL_CLASS_SEPARATOR)
+#define ZBX_EVAL_TOKEN_ARG_QUERY (26 | ZBX_EVAL_CLASS_OPERAND)
+#define ZBX_EVAL_TOKEN_ARG_PERIOD (27 | ZBX_EVAL_CLASS_OPERAND)
+#define ZBX_EVAL_TOKEN_ARG_NULL (28 | ZBX_EVAL_CLASS_OPERAND)
+#define ZBX_EVAL_TOKEN_ARG_RAW (29 | ZBX_EVAL_CLASS_OPERAND)
+#define ZBX_EVAL_TOKEN_EXCEPTION (30 | ZBX_EVAL_CLASS_FUNCTION)
/* expression parsing rules */
@@ -89,7 +88,11 @@
ZBX_EVAL_PARSE_FUNCTIONID | ZBX_EVAL_PARSE_FUNCTION)
#define ZBX_EVAL_PARSE_CALC_EXPRESSSION (ZBX_EVAL_PARSE_MACRO | ZBX_EVAL_PARSE_USERMACRO | \
- ZBX_EVAL_PARSE_ITEM_QUERY | ZBX_EVAL_PARSE_FUNCTION)
+ ZBX_EVAL_PARSE_ITEM_QUERY | ZBX_EVAL_PARSE_FUNCTION | \
+ ZBX_EVAL_PARSE_COMPOUND_CONST)
+
+#define ZBX_EVAL_PARSE_EXPRESSION_MACRO (ZBX_EVAL_PARSE_USERMACRO | ZBX_EVAL_PARSE_ITEM_QUERY | \
+ ZBX_EVAL_PARSE_FUNCTION | ZBX_EVAL_PARSE_COMPOUND_CONST)
/* expression composition rules */
@@ -111,6 +114,11 @@
ZBX_EVAL_COMPOSE_LLD | \
ZBX_EVAL_COMPOSE_FUNCTIONID)
+#define ZBX_EVAL_CALC_EXPRESSION_LLD (ZBX_EVAL_PARSE_CALC_EXPRESSSION | \
+ ZBX_EVAL_PARSE_LLDMACRO | \
+ ZBX_EVAL_COMPOSE_LLD)
+
+
typedef zbx_uint32_t zbx_token_type_t;
/******************************************************************************
@@ -123,6 +131,8 @@ typedef zbx_uint32_t zbx_token_type_t;
* len - [IN] the function name length *
* args_num - [IN] the number of function arguments *
* args - [IN] an array of the function arguments. *
+ * data - [IN] the caller data used for function evaluation *
+ * ts - [IN] the function execution time *
* value - [OUT] the function return value *
* error - [OUT] the error message if function failed *
* *
@@ -131,7 +141,7 @@ typedef zbx_uint32_t zbx_token_type_t;
* *
******************************************************************************/
typedef int (*zbx_eval_function_cb_t)(const char *name, size_t len, int args_num, const zbx_variant_t *args,
- zbx_variant_t *value, char **error);
+ void *data, const zbx_timespec_t *ts, zbx_variant_t *value, char **error);
typedef struct
{
@@ -154,7 +164,9 @@ typedef struct
zbx_timespec_t ts;
zbx_vector_eval_token_t stack;
zbx_vector_eval_token_t ops;
- zbx_eval_function_cb_t function_cb;
+ zbx_eval_function_cb_t common_func_cb;
+ zbx_eval_function_cb_t history_func_cb;
+ void *data_cb;
}
zbx_eval_context_t;
@@ -162,7 +174,6 @@ typedef int (*zbx_macro_resolve_func_t)(const char *str, size_t length, zbx_uint
int hostids_num, char **value, char **error);
int zbx_eval_parse_expression(zbx_eval_context_t *ctx, const char *expression, zbx_uint64_t rules, char **error);
-zbx_eval_context_t *zbx_eval_parse_expression_dyn(const char *expression, zbx_uint64_t rules, char **error);
void zbx_eval_init(zbx_eval_context_t *ctx);
void zbx_eval_clear(zbx_eval_context_t *ctx);
int zbx_eval_status(const zbx_eval_context_t *ctx);
@@ -171,8 +182,8 @@ void zbx_eval_deserialize(zbx_eval_context_t *ctx, const char *expression, zbx_u
const unsigned char *data);
void zbx_eval_compose_expression(const zbx_eval_context_t *ctx, char **expression);
int zbx_eval_execute(zbx_eval_context_t *ctx, const zbx_timespec_t *ts, zbx_variant_t *value, char **error);
-int zbx_eval_execute_ext(zbx_eval_context_t *ctx, const zbx_timespec_t *ts, zbx_eval_function_cb_t function_cb,
- zbx_variant_t *value, char **error);
+int zbx_eval_execute_ext(zbx_eval_context_t *ctx, const zbx_timespec_t *ts, zbx_eval_function_cb_t common_func_cb,
+ zbx_eval_function_cb_t history_func_cb, void *data, zbx_variant_t *value, char **error);
void zbx_eval_get_functionids(zbx_eval_context_t *ctx, zbx_vector_uint64_t *functionids);
void zbx_eval_get_functionids_ordered(zbx_eval_context_t *ctx, zbx_vector_uint64_t *functionids);
int zbx_eval_expand_user_macros(const zbx_eval_context_t *ctx, zbx_uint64_t *hostids, int hostids_num,
@@ -198,4 +209,26 @@ void zbx_eval_copy(zbx_eval_context_t *dst, const zbx_eval_context_t *src, const
char *zbx_eval_format_function_error(const char *function, const char *host, const char *key,
const char *parameter, const char *error);
+void zbx_eval_extract_item_refs(zbx_eval_context_t *ctx, zbx_vector_str_t *refs);
+
+typedef enum
+{
+ ZBX_ITEM_QUERY_UNKNOWN,
+ ZBX_ITEM_QUERY_SINGLE,
+ ZBX_ITEM_QUERY_MULTI
+}
+zbx_item_query_type_t;
+
+typedef struct
+{
+ char *host;
+ char *key;
+ zbx_item_query_type_t type;
+ int index;
+}
+zbx_item_query_t;
+
+void zbx_eval_parse_query(const char *str, size_t len, zbx_item_query_t *query);
+void zbx_eval_clear_query(zbx_item_query_t *query);
+
#endif
diff --git a/include/zbxserver.h b/include/zbxserver.h
index 4f540cea9dc..1c6509b02cd 100644
--- a/include/zbxserver.h
+++ b/include/zbxserver.h
@@ -50,10 +50,9 @@
#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_TYPE_SCRIPT_PARAMS_FIELD 0x08000000
-#define MACRO_TYPE_SCRIPT_NORMAL 0x10000000
-#define MACRO_TYPE_SCRIPT_RECOVERY 0x20000000
+#define MACRO_TYPE_SCRIPT_PARAMS_FIELD 0x04000000
+#define MACRO_TYPE_SCRIPT_NORMAL 0x08000000
+#define MACRO_TYPE_SCRIPT_RECOVERY 0x10000000
#define MACRO_EXPAND_NO 0
#define MACRO_EXPAND_YES 1
@@ -65,6 +64,7 @@ int evaluate_function(char **value, DC_ITEM *item, const char *function, const c
int evaluate_function2(zbx_variant_t *value, DC_ITEM *item, const char *function, const char *parameter,
const zbx_timespec_t *ts, char **error);
+int zbx_is_trigger_function(const char *name, size_t len);
int substitute_simple_macros(const zbx_uint64_t *actionid, const DB_EVENT *event, const DB_EVENT *r_event,
const zbx_uint64_t *userid, const zbx_uint64_t *hostid, const DC_HOST *dc_host, const DC_ITEM *dc_item,