diff options
author | Andris Zeila <andris.zeila@zabbix.com> | 2021-04-12 15:36:45 +0300 |
---|---|---|
committer | Andris Zeila <andris.zeila@zabbix.com> | 2021-04-12 15:37:20 +0300 |
commit | b3d03b8df55767fc41c66a07b6db0a7054497bdd (patch) | |
tree | 9ef8b29546258e9d2ca17af9acbdbad8032e5671 /include | |
parent | 54398cf5ee892f5dfce1b01f85963c6daac2cfa9 (diff) |
........S. [ZBXNEXT-6451] copied libzxbeval from the calculated item branch, added macro expression evaluation
Diffstat (limited to 'include')
-rw-r--r-- | include/common.h | 1 | ||||
-rw-r--r-- | include/dbcache.h | 3 | ||||
-rw-r--r-- | include/zbxeval.h | 75 | ||||
-rw-r--r-- | include/zbxserver.h | 8 |
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, |