diff options
author | Andris Zeila <andris.zeila@zabbix.com> | 2021-01-23 19:08:46 +0300 |
---|---|---|
committer | Andris Zeila <andris.zeila@zabbix.com> | 2021-01-23 19:08:46 +0300 |
commit | 477f6cf0ec943b422d571b256d4fb45160bb7744 (patch) | |
tree | 6999e9dddc33485efd73ecda7a09f9465e7577f1 | |
parent | 5afa58b768619e2a636aa3b5ca6473a1621aeb2f (diff) |
.......PS. [ZBXNEXT-6451] moved expression parsing code to separate library to avoid cyclic dependencies
-rw-r--r-- | .gitignore | 10 | ||||
-rw-r--r-- | configure.ac | 1 | ||||
-rw-r--r-- | include/dbcache.h | 4 | ||||
-rw-r--r-- | include/zbxeval.h | 176 | ||||
-rw-r--r-- | include/zbxserver.h | 148 | ||||
-rw-r--r-- | include/zbxvariant.h | 85 | ||||
-rw-r--r-- | src/libs/Makefile.am | 9 | ||||
-rw-r--r-- | src/libs/zbxalgo/serialize.c | 102 | ||||
-rw-r--r-- | src/libs/zbxdbcache/dbconfig.c | 4 | ||||
-rw-r--r-- | src/libs/zbxdbcache/dbsync.c | 1 | ||||
-rw-r--r-- | src/libs/zbxeval/Makefile.am | 9 | ||||
-rw-r--r-- | src/libs/zbxeval/execute.c (renamed from src/libs/zbxserver/eval_execute.c) | 0 | ||||
-rw-r--r-- | src/libs/zbxeval/misc.c | 132 | ||||
-rw-r--r-- | src/libs/zbxeval/parse.c (renamed from src/libs/zbxserver/eval.c) | 0 | ||||
-rw-r--r-- | src/libs/zbxserver/Makefile.am | 5 | ||||
-rw-r--r-- | src/zabbix_proxy/Makefile.am | 1 | ||||
-rw-r--r-- | src/zabbix_server/Makefile.am | 1 | ||||
-rw-r--r-- | tests/conf_tests.m4 | 1 | ||||
-rw-r--r-- | tests/libs/Makefile.am | 3 | ||||
-rw-r--r-- | tests/libs/zbxdbcache/Makefile.am | 1 | ||||
-rw-r--r-- | tests/libs/zbxdbhigh/Makefile.am | 1 | ||||
-rwxr-xr-x | tests/libs/zbxeval/Makefile.am | 157 | ||||
-rw-r--r-- | tests/libs/zbxeval/mock_eval.c (renamed from tests/libs/zbxserver/mock_eval.c) | 0 | ||||
-rw-r--r-- | tests/libs/zbxeval/mock_eval.h (renamed from tests/libs/zbxserver/mock_eval.h) | 0 | ||||
-rw-r--r-- | tests/libs/zbxeval/zbx_eval_compose_expression.c (renamed from tests/libs/zbxserver/zbx_eval_compose_expression.c) | 2 | ||||
-rw-r--r-- | tests/libs/zbxeval/zbx_eval_compose_expression.yaml (renamed from tests/libs/zbxserver/zbx_eval_compose_expression.yaml) | 0 | ||||
-rw-r--r-- | tests/libs/zbxeval/zbx_eval_execute.c (renamed from tests/libs/zbxserver/zbx_eval_execute.c) | 2 | ||||
-rw-r--r-- | tests/libs/zbxeval/zbx_eval_execute.yaml (renamed from tests/libs/zbxserver/zbx_eval_execute.yaml) | 0 | ||||
-rw-r--r-- | tests/libs/zbxeval/zbx_eval_execute_ext.c (renamed from tests/libs/zbxserver/zbx_eval_execute_ext.c) | 2 | ||||
-rw-r--r-- | tests/libs/zbxeval/zbx_eval_execute_ext.yaml (renamed from tests/libs/zbxserver/zbx_eval_execute_ext.yaml) | 0 | ||||
-rw-r--r-- | tests/libs/zbxeval/zbx_eval_parse_expression.c (renamed from tests/libs/zbxserver/zbx_eval_parse_expression.c) | 2 | ||||
-rw-r--r-- | tests/libs/zbxeval/zbx_eval_parse_expression.yaml (renamed from tests/libs/zbxserver/zbx_eval_parse_expression.yaml) | 0 | ||||
-rw-r--r-- | tests/libs/zbxeval/zbx_eval_serialize.c (renamed from tests/libs/zbxserver/zbx_eval_serialize.c) | 2 | ||||
-rw-r--r-- | tests/libs/zbxeval/zbx_eval_serialize.yaml (renamed from tests/libs/zbxserver/zbx_eval_serialize.yaml) | 0 | ||||
-rwxr-xr-x | tests/libs/zbxserver/Makefile.am | 77 |
35 files changed, 697 insertions, 241 deletions
diff --git a/.gitignore b/.gitignore index b7bd5571c71..caa9da04d80 100644 --- a/.gitignore +++ b/.gitignore @@ -163,6 +163,11 @@ tests/libs/zbxdbcache/zbx_vc_get_values tests/libs/zbxdbcache/dc_function_calculate_nextcheck tests/libs/zbxdbhigh/DBadd_condition_alloc tests/libs/zbxdbhigh/DBselect_uint64 +tests/libs/zbxeval/zbx_eval_compose_expression +tests/libs/zbxeval/zbx_eval_execute +tests/libs/zbxeval/zbx_eval_execute_ext +tests/libs/zbxeval/zbx_eval_parse_expression +tests/libs/zbxeval/zbx_eval_serialize tests/libs/zbxhistory/zbx_history_get_values tests/libs/zbxjson/zbx_json_decodevalue tests/libs/zbxjson/zbx_json_decodevalue_dyn @@ -178,11 +183,6 @@ tests/libs/zbxserver/evaluate_function tests/libs/zbxserver/get_trigger_expression_constant tests/libs/zbxserver/macro_fmttime tests/libs/zbxserver/substitute_lld_macros -tests/libs/zbxserver/zbx_eval_compose_expression -tests/libs/zbxserver/zbx_eval_execute -tests/libs/zbxserver/zbx_eval_execute_ext -tests/libs/zbxserver/zbx_eval_parse_expression -tests/libs/zbxserver/zbx_eval_serialize tests/libs/zbxsysinfo/check_key_access_rules tests/libs/zbxsysinfo/common/SYSTEM_LOCALTIME tests/libs/zbxsysinfo/common/VFS_FILE_EXISTS diff --git a/configure.ac b/configure.ac index 4c197de0cc2..13d7fd8ddfc 100644 --- a/configure.ac +++ b/configure.ac @@ -2030,6 +2030,7 @@ AC_OUTPUT([ src/libs/zbxhttp/Makefile src/libs/zbxserver/Makefile src/libs/zbxicmpping/Makefile + src/libs/zbxeval/Makefile src/libs/zbxexec/Makefile src/libs/zbxself/Makefile src/libs/zbxmodules/Makefile diff --git a/include/dbcache.h b/include/dbcache.h index 7759d3d645f..e9c07adf576 100644 --- a/include/dbcache.h +++ b/include/dbcache.h @@ -26,6 +26,7 @@ #include "zbxalgo.h" #include "zbxjson.h" #include "memalloc.h" +#include "zbxeval.h" #define ZBX_SYNC_DONE 0 #define ZBX_SYNC_MORE 1 @@ -257,6 +258,9 @@ typedef struct _DC_TRIGGER unsigned char flags; zbx_vector_ptr_t tags; + + zbx_eval_context_t *eval_ctx; + zbx_eval_context_t *eval_ctx_r; } DC_TRIGGER; diff --git a/include/zbxeval.h b/include/zbxeval.h new file mode 100644 index 00000000000..c9482108acd --- /dev/null +++ b/include/zbxeval.h @@ -0,0 +1,176 @@ +/* +** Zabbix +** Copyright (C) 2001-2021 Zabbix SIA +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +**/ + +#ifndef ZABBIX_ZBXEVAL_H +#define ZABBIX_ZBXEVAL_H + +#include "common.h" +#include "zbxalgo.h" +#include "zbxvariant.h" + +/* + * Token type flags (32 bits): + * | 6 bits | 4 bits | 22 bits | + * | token class | operator precedence | token type | + */ +#define ZBX_EVAL_CLASS_OPERAND (__UINT64_C(0x01) << 26) +#define ZBX_EVAL_CLASS_OPERATOR1 (__UINT64_C(0x02) << 26) +#define ZBX_EVAL_CLASS_OPERATOR2 (__UINT64_C(0x04) << 26) +#define ZBX_EVAL_CLASS_FUNCTION (__UINT64_C(0x08) << 26) +#define ZBX_EVAL_CLASS_SEPARATOR (__UINT64_C(0x10) << 26) +#define ZBX_EVAL_CLASS_OPERATOR (ZBX_EVAL_CLASS_OPERATOR1 | ZBX_EVAL_CLASS_OPERATOR2) + +#define ZBX_EVAL_BEFORE_OPERAND (ZBX_EVAL_CLASS_OPERATOR | ZBX_EVAL_CLASS_SEPARATOR) +#define ZBX_EVAL_BEFORE_OPERATOR (ZBX_EVAL_CLASS_OPERAND) + +#define ZBX_EVAL_OP_SET_PRECEDENCE(x) ((x) << 22) +#define ZBX_EVAL_OP_PRIORITY ZBX_EVAL_OP_SET_PRECEDENCE(0xf) + +#define ZBX_EVAL_TOKEN_OP_ADD (1 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(4)) +#define ZBX_EVAL_TOKEN_OP_SUB (2 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(4)) +#define ZBX_EVAL_TOKEN_OP_MUL (3 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(3)) +#define ZBX_EVAL_TOKEN_OP_DIV (4 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(3)) +#define ZBX_EVAL_TOKEN_OP_MINUS (5 | ZBX_EVAL_CLASS_OPERATOR1 | ZBX_EVAL_OP_SET_PRECEDENCE(2)) +#define ZBX_EVAL_TOKEN_OP_EQ (6 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(7)) +#define ZBX_EVAL_TOKEN_OP_LT (7 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(6)) +#define ZBX_EVAL_TOKEN_OP_GT (8 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(6)) +#define ZBX_EVAL_TOKEN_OP_LE (9 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(6)) +#define ZBX_EVAL_TOKEN_OP_GE (10 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(6)) +#define ZBX_EVAL_TOKEN_OP_NE (11 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(7)) +#define ZBX_EVAL_TOKEN_OP_AND (12 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(11)) +#define ZBX_EVAL_TOKEN_OP_OR (13 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(12)) +#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_TIME (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) + +/* expression parsing rules */ + +#define ZBX_EVAL_PARSE_MACRO __UINT64_C(0x0001) +#define ZBX_EVAL_PARSE_USERMACRO __UINT64_C(0x0002) +#define ZBX_EVAL_PARSE_LLDMACRO __UINT64_C(0x0004) +#define ZBX_EVAL_PARSE_FUNCTIONID __UINT64_C(0x0008) +#define ZBX_EVAL_PARSE_ITEM_QUERY __UINT64_C(0x0010) +#define ZBX_EVAL_PARSE_FUNCTION __UINT64_C(0x0020) +#define ZBX_EVAL_PARSE_CONST_INDEX __UINT64_C(0x0040) + +#define ZBX_EVAL_PARSE_TRIGGER_EXPRESSSION (ZBX_EVAL_PARSE_MACRO | ZBX_EVAL_PARSE_USERMACRO | \ + 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) + +/* expression composition rules */ + +#define ZBX_EVAL_QUOTE_MACRO __UINT64_C(0x00010000) +#define ZBX_EVAL_QUOTE_USERMACRO __UINT64_C(0x00020000) +#define ZBX_EVAL_QUOTE_LLDMACRO __UINT64_C(0x00040000) + +#define ZBX_EVAL_COMPOSE_TRIGGER_EXPRESSION (ZBX_EVAL_QUOTE_MACRO | ZBX_EVAL_QUOTE_USERMACRO) +#define ZBX_EVAL_COMPOSE_LLD_EXPRESSION ZBX_EVAL_QUOTE_LLDMACRO + +/* expression evaluation rules */ + +#define ZBX_EVAL_PROCESS_ERROR __UINT64_C(0x000100000000) + +/* composite rules */ + +#define ZBX_EVAL_TRIGGER_EXPRESSION (ZBX_EVAL_PARSE_TRIGGER_EXPRESSSION | \ + ZBX_EVAL_COMPOSE_TRIGGER_EXPRESSION | \ + ZBX_EVAL_PROCESS_ERROR) + +typedef zbx_uint32_t zbx_token_type_t; + +/****************************************************************************** + * * + * Typedef: zbx_eval_function_cb_t * + * * + * Purpose: define callback function to calculate custom functions * + * * + * Parameters: name - [IN] the function name (not zero terminated) * + * len - [IN] the function name length * + * args_num - [IN] the number of function arguments * + * args - [IN] an array of the function arguments. * + * value - [OUT] the function return value * + * error - [OUT] the error message if function failed * + * * + * Return value: SUCCEED - the function was executed successfully * + * FAIL - otherwise * + * * + ******************************************************************************/ +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); + +typedef struct +{ + zbx_token_type_t type; + zbx_uint32_t opt; + zbx_strloc_t loc; + zbx_variant_t value; +} +zbx_eval_token_t; + +ZBX_VECTOR_DECL(eval_token, zbx_eval_token_t) + +typedef struct +{ + const char *expression; + zbx_token_type_t last_token_type; + int const_index; + int functionid_index; + zbx_uint64_t rules; + 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_context_t; + +typedef char *(*zbx_macro_resolve_func_t)(const char *str, size_t length, zbx_uint64_t *hostids, + int hostids_num); + +int zbx_eval_parse_expression(zbx_eval_context_t *ctx, const char *expression, zbx_uint64_t rules, char **error); +void zbx_eval_clear(zbx_eval_context_t *ctx); +size_t zbx_eval_serialize(const zbx_eval_context_t *ctx, zbx_mem_malloc_func_t malloc_func, unsigned char **data); +void zbx_eval_deserialize(zbx_eval_context_t *ctx, const char *expression, zbx_uint64_t rules, + 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); +void zbx_eval_get_functionids(const zbx_eval_context_t *ctx, zbx_vector_uint64_t *functionids); +void zbx_eval_expand_user_macros(const zbx_eval_context_t *ctx, zbx_uint64_t *hostids, int hostids_num, + zbx_macro_resolve_func_t resolver_cb); +void zbx_eval_set_exception(zbx_eval_context_t *ctx, char *message); + +#endif diff --git a/include/zbxserver.h b/include/zbxserver.h index 7864987b092..29999ee4490 100644 --- a/include/zbxserver.h +++ b/include/zbxserver.h @@ -110,152 +110,4 @@ int substitute_macros_in_json_pairs(char **data, const struct zbx_json_parse *jp const zbx_vector_ptr_t *lld_macro_paths, char *error, int maxerrlen); int xml_xpath_check(const char *xpath, char *error, size_t errlen); -/* - * Token type flags (32 bits): - * | 6 bits | 4 bits | 22 bits | - * | token class | operator precedence | token type | - */ -#define ZBX_EVAL_CLASS_OPERAND (__UINT64_C(0x01) << 26) -#define ZBX_EVAL_CLASS_OPERATOR1 (__UINT64_C(0x02) << 26) -#define ZBX_EVAL_CLASS_OPERATOR2 (__UINT64_C(0x04) << 26) -#define ZBX_EVAL_CLASS_FUNCTION (__UINT64_C(0x08) << 26) -#define ZBX_EVAL_CLASS_SEPARATOR (__UINT64_C(0x10) << 26) -#define ZBX_EVAL_CLASS_OPERATOR (ZBX_EVAL_CLASS_OPERATOR1 | ZBX_EVAL_CLASS_OPERATOR2) - -#define ZBX_EVAL_BEFORE_OPERAND (ZBX_EVAL_CLASS_OPERATOR | ZBX_EVAL_CLASS_SEPARATOR) -#define ZBX_EVAL_BEFORE_OPERATOR (ZBX_EVAL_CLASS_OPERAND) - -#define ZBX_EVAL_OP_SET_PRECEDENCE(x) ((x) << 22) -#define ZBX_EVAL_OP_PRIORITY ZBX_EVAL_OP_SET_PRECEDENCE(0xf) - -#define ZBX_EVAL_TOKEN_OP_ADD (1 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(4)) -#define ZBX_EVAL_TOKEN_OP_SUB (2 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(4)) -#define ZBX_EVAL_TOKEN_OP_MUL (3 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(3)) -#define ZBX_EVAL_TOKEN_OP_DIV (4 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(3)) -#define ZBX_EVAL_TOKEN_OP_MINUS (5 | ZBX_EVAL_CLASS_OPERATOR1 | ZBX_EVAL_OP_SET_PRECEDENCE(2)) -#define ZBX_EVAL_TOKEN_OP_EQ (6 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(7)) -#define ZBX_EVAL_TOKEN_OP_LT (7 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(6)) -#define ZBX_EVAL_TOKEN_OP_GT (8 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(6)) -#define ZBX_EVAL_TOKEN_OP_LE (9 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(6)) -#define ZBX_EVAL_TOKEN_OP_GE (10 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(6)) -#define ZBX_EVAL_TOKEN_OP_NE (11 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(7)) -#define ZBX_EVAL_TOKEN_OP_AND (12 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(11)) -#define ZBX_EVAL_TOKEN_OP_OR (13 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(12)) -#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_TIME (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) - -/* expression parsing rules */ - -#define ZBX_EVAL_PARSE_MACRO __UINT64_C(0x0001) -#define ZBX_EVAL_PARSE_USERMACRO __UINT64_C(0x0002) -#define ZBX_EVAL_PARSE_LLDMACRO __UINT64_C(0x0004) -#define ZBX_EVAL_PARSE_FUNCTIONID __UINT64_C(0x0008) -#define ZBX_EVAL_PARSE_ITEM_QUERY __UINT64_C(0x0010) -#define ZBX_EVAL_PARSE_FUNCTION __UINT64_C(0x0020) -#define ZBX_EVAL_PARSE_CONST_INDEX __UINT64_C(0x0040) - -#define ZBX_EVAL_PARSE_TRIGGER_EXPRESSSION (ZBX_EVAL_PARSE_MACRO | ZBX_EVAL_PARSE_USERMACRO | \ - 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) - -/* expression composition rules */ - -#define ZBX_EVAL_QUOTE_MACRO __UINT64_C(0x00010000) -#define ZBX_EVAL_QUOTE_USERMACRO __UINT64_C(0x00020000) -#define ZBX_EVAL_QUOTE_LLDMACRO __UINT64_C(0x00040000) - -#define ZBX_EVAL_COMPOSE_TRIGGER_EXPRESSION (ZBX_EVAL_QUOTE_MACRO | ZBX_EVAL_QUOTE_USERMACRO) -#define ZBX_EVAL_COMPOSE_LLD_EXPRESSION ZBX_EVAL_QUOTE_LLDMACRO - -/* expression evaluation rules */ - -#define ZBX_EVAL_PROCESS_ERROR __UINT64_C(0x000100000000) - -/* composite rules */ - -#define ZBX_EVAL_TRIGGER_EXPRESSION (ZBX_EVAL_PARSE_TRIGGER_EXPRESSSION | \ - ZBX_EVAL_COMPOSE_TRIGGER_EXPRESSION | \ - ZBX_EVAL_PROCESS_ERROR) - -typedef zbx_uint32_t zbx_token_type_t; - -/****************************************************************************** - * * - * Typedef: zbx_eval_function_cb_t * - * * - * Purpose: define callback function to calculate custom functions * - * * - * Parameters: name - [IN] the function name (not zero terminated) * - * len - [IN] the function name length * - * args_num - [IN] the number of function arguments * - * args - [IN] an array of the function arguments. * - * value - [OUT] the function return value * - * error - [OUT] the error message if function failed * - * * - * Return value: SUCCEED - the function was executed successfully * - * FAIL - otherwise * - * * - ******************************************************************************/ -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); - -typedef struct -{ - zbx_token_type_t type; - zbx_uint32_t opt; - zbx_strloc_t loc; - zbx_variant_t value; -} -zbx_eval_token_t; - -ZBX_VECTOR_DECL(eval_token, zbx_eval_token_t) - -typedef struct -{ - const char *expression; - zbx_token_type_t last_token_type; - int const_index; - int functionid_index; - zbx_uint64_t rules; - 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_context_t; - -typedef char *(*zbx_macro_resolve_func_t)(const char *str, size_t length, zbx_uint64_t *hostids, - int hostids_num); - -int zbx_eval_parse_expression(zbx_eval_context_t *ctx, const char *expression, zbx_uint64_t rules, char **error); -void zbx_eval_clear(zbx_eval_context_t *ctx); -size_t zbx_eval_serialize(const zbx_eval_context_t *ctx, zbx_mem_malloc_func_t malloc_func, unsigned char **data); -void zbx_eval_deserialize(zbx_eval_context_t *ctx, const char *expression, zbx_uint64_t rules, - 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); -void zbx_eval_get_functionids(const zbx_eval_context_t *ctx, zbx_vector_uint64_t *functionids); -void zbx_eval_expand_user_macros(const zbx_eval_context_t *ctx, zbx_uint64_t *hostids, int hostids_num, - zbx_macro_resolve_func_t resolver_cb); -void zbx_eval_set_exception(zbx_eval_context_t *ctx, char *message); #endif diff --git a/include/zbxvariant.h b/include/zbxvariant.h new file mode 100644 index 00000000000..bd1d15e2ad9 --- /dev/null +++ b/include/zbxvariant.h @@ -0,0 +1,85 @@ +/* +** Zabbix +** Copyright (C) 2001-2020 Zabbix SIA +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +**/ + +#ifndef ZABBIX_ZBXVARIANT_H +#define ZABBIX_ZBXVARIANT_H + +#include "common.h" +#include "zbxalgo.h" + +typedef union +{ + zbx_uint64_t ui64; + double dbl; + + /* null terminated string */ + char *str; + + /* length prefixed (4 bytes) binary data */ + void *bin; + + zbx_vector_dbl_t *dbl_vector; + + /* null terminated error message */ + char *err; +} +zbx_variant_data_t; + +struct zbx_variant +{ + unsigned char type; + zbx_variant_data_t data; +}; + +#define ZBX_VARIANT_NONE 0 +#define ZBX_VARIANT_STR 1 +#define ZBX_VARIANT_DBL 2 +#define ZBX_VARIANT_UI64 3 +#define ZBX_VARIANT_BIN 4 +#define ZBX_VARIANT_DBL_VECTOR 5 +#define ZBX_VARIANT_ERR 6 + +void zbx_variant_clear(zbx_variant_t *value); +void zbx_variant_set_none(zbx_variant_t *value); +void zbx_variant_set_str(zbx_variant_t *value, char *text); +void zbx_variant_set_dbl(zbx_variant_t *value, double value_dbl); +void zbx_variant_set_ui64(zbx_variant_t *value, zbx_uint64_t value_ui64); +void zbx_variant_set_bin(zbx_variant_t *value, void *value_bin); +void zbx_variant_set_error(zbx_variant_t *value, char *error); +void zbx_variant_set_dbl_vector(zbx_variant_t *value, zbx_vector_dbl_t *dbl_vector); + +void zbx_variant_copy(zbx_variant_t *value, const zbx_variant_t *source); +int zbx_variant_set_numeric(zbx_variant_t *value, const char *text); + +int zbx_variant_convert(zbx_variant_t *value, int type); +const char *zbx_get_variant_type_desc(unsigned char type); +const char *zbx_variant_value_desc(const zbx_variant_t *value); +const char *zbx_variant_type_desc(const zbx_variant_t *value); + +int zbx_variant_compare(const zbx_variant_t *value1, const zbx_variant_t *value2); + +void *zbx_variant_data_bin_copy(const void *bin); +void *zbx_variant_data_bin_create(const void *data, zbx_uint32_t size); +zbx_uint32_t zbx_variant_data_bin_get(const void *bin, void **data); + +int zbx_variant_to_value_type(zbx_variant_t *value, unsigned char value_type, int dbl_precision, char **errmsg); + +ZBX_VECTOR_DECL(var, zbx_variant_t) + +#endif diff --git a/src/libs/Makefile.am b/src/libs/Makefile.am index da4bf1cf79a..58b13e190b3 100644 --- a/src/libs/Makefile.am +++ b/src/libs/Makefile.am @@ -34,7 +34,8 @@ DIST_SUBDIRS = \ zbxvault \ zbxdiag \ zbxtrends \ - zbxavailability + zbxavailability \ + zbxeval if SERVER SERVER_SUBDIRS = \ @@ -57,7 +58,8 @@ SERVER_SUBDIRS = \ zbxvault \ zbxdiag \ zbxtrends \ - zbxavailability + zbxavailability \ + zbxeval else if PROXY PROXY_SUBDIRS = \ @@ -79,7 +81,8 @@ PROXY_SUBDIRS = \ zbxvault \ zbxdiag \ zbxtrends \ - zbxavailability + zbxavailability \ + zbxeval endif endif diff --git a/src/libs/zbxalgo/serialize.c b/src/libs/zbxalgo/serialize.c new file mode 100644 index 00000000000..e31818f1d8c --- /dev/null +++ b/src/libs/zbxalgo/serialize.c @@ -0,0 +1,102 @@ +/* +** Zabbix +** Copyright (C) 2001-2021 Zabbix SIA +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +**/ + +#include "common.h" +#include "zbxalgo.h" + +/****************************************************************************** + * * + * Function: zbx_serialize_uint31_compact * + * * + * Purpose: serialize 31 bit unsigned integer into utf-8 like byte stream * + * * + * Parameters: ptr - [OUT] the output buffer * + * value - [IN] the value to serialize * + * * + * Return value: The number of bytes written to the buffer. * + * * + * Comments: This serialization method should be used with variables usually * + * having small value while still supporting larger values. * + * * + ******************************************************************************/ +zbx_uint32_t zbx_serialize_uint31_compact(unsigned char *ptr, zbx_uint32_t value) +{ + if (0x7f >= value) + { + ptr[0] = (unsigned char)value; + return 1; + } + else + { + unsigned char buf[6]; + int pos = sizeof(buf) - 1; + zbx_uint32_t len; + + while (value > (zbx_uint32_t)(0x3f >> (sizeof(buf) - pos))) + { + buf[pos] = 0x80 | (value & 0x3f); + value >>= 6; + pos--; + } + + buf[pos] = value | (0xfe << (pos + 1)); + + len = sizeof(buf) - pos; + memcpy(ptr, buf + pos, len); + return len; + } +} + +/****************************************************************************** + * * + * Function: zbx_deserialize_uint31_compact * + * * + * Purpose: deserialize 31 bit unsigned integer from utf-8 like byte stream * + * * + * Parameters: ptr - [IN] the byte strem * + * value - [OUT] the deserialized value * + * * + * Return value: The number of bytes read from byte strean. * + * * + ******************************************************************************/ +zbx_uint32_t zbx_deserialize_uint31_compact(const unsigned char *ptr, zbx_uint32_t *value) +{ + if (0 == (*ptr & 0x80)) + { + *value = *ptr; + return 1; + } + else + { + int pos = 2, i; + + while (0 != (*ptr & (0x80 >> pos))) + pos++; + + *value = *ptr & (0xff >> (pos + 1)); + + for (i = 1; i < pos; i++) + { + *value <<= 6; + *value |= (*(++ptr)) & 0x3f; + } + + return pos; + } +} diff --git a/src/libs/zbxdbcache/dbconfig.c b/src/libs/zbxdbcache/dbconfig.c index b39240b2405..9b90a3e822e 100644 --- a/src/libs/zbxdbcache/dbconfig.c +++ b/src/libs/zbxdbcache/dbconfig.c @@ -34,6 +34,7 @@ #include "../zbxcrypto/tls_tcp_active.h" #include "../zbxalgo/vectorimpl.h" #include "base64.h" +#include "zbxeval.h" #define ZBX_DBCONFIG_IMPL #include "dbconfig.h" @@ -7783,6 +7784,9 @@ static void DCget_trigger(DC_TRIGGER *dst_trigger, const ZBX_DC_TRIGGER *src_tri dst_trigger->expression_bin = dup_serialized_expression(src_trigger->expression_bin); dst_trigger->recovery_expression_bin = dup_serialized_expression(src_trigger->recovery_expression_bin); + dst_trigger->eval_ctx = NULL; + dst_trigger->eval_ctx_r = NULL; + zbx_vector_ptr_create(&dst_trigger->tags); if (0 != src_trigger->tags.values_num) diff --git a/src/libs/zbxdbcache/dbsync.c b/src/libs/zbxdbcache/dbsync.c index 7910d59ca78..f3cde1454fd 100644 --- a/src/libs/zbxdbcache/dbsync.c +++ b/src/libs/zbxdbcache/dbsync.c @@ -24,6 +24,7 @@ #include "mutexs.h" #include "zbxserialize.h" #include "base64.h" +#include "zbxeval.h" #define ZBX_DBCONFIG_IMPL #include "dbconfig.h" diff --git a/src/libs/zbxeval/Makefile.am b/src/libs/zbxeval/Makefile.am new file mode 100644 index 00000000000..a788c852c12 --- /dev/null +++ b/src/libs/zbxeval/Makefile.am @@ -0,0 +1,9 @@ +## Process this file with automake to produce Makefile.in + +noinst_LIBRARIES = libzbxeval.a + +libzbxeval_a_SOURCES = \ + parse.c \ + execute.c \ + misc.c + diff --git a/src/libs/zbxserver/eval_execute.c b/src/libs/zbxeval/execute.c index 649578de985..649578de985 100644 --- a/src/libs/zbxserver/eval_execute.c +++ b/src/libs/zbxeval/execute.c diff --git a/src/libs/zbxeval/misc.c b/src/libs/zbxeval/misc.c new file mode 100644 index 00000000000..d2fb08e2d5d --- /dev/null +++ b/src/libs/zbxeval/misc.c @@ -0,0 +1,132 @@ +/* +** Zabbix +** Copyright (C) 2001-2020 Zabbix SIA +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +**/ + +#include "common.h" +#include "log.h" + +#include "zbxalgo.h" +#include "../zbxalgo/vectorimpl.h" +#include "zbxvariant.h" +#include "zbxserialize.h" +#include "zbxserver.h" + +/****************************************************************************** + * * + * Function: zbx_eval_get_functionids * + * * + * Purpose: extract functionids from the parsed expression * + * * + * Parameters: ctx - [IN] the evaluation context * + * functionids - [OUT] the extracted functionids * + * * + ******************************************************************************/ +void zbx_eval_get_functionids(const zbx_eval_context_t *ctx, zbx_vector_uint64_t *functionids) +{ + int i; + + for (i = 0; i < ctx->stack.values_num; i++) + { + zbx_eval_token_t *token = &ctx->stack.values[i]; + + if (ZBX_EVAL_TOKEN_FUNCTIONID == token->type) + { + zbx_uint64_t functionid; + + if (SUCCEED == is_uint64_n(ctx->expression + token->loc.l + 1, token->loc.r - token->loc.l - 1, + &functionid)) + { + zbx_vector_uint64_append(functionids, functionid); + } + } + } +} + +/****************************************************************************** + * * + * Function: zbx_eval_expand_user_macros * + * * + * Purpose: expand user macros in parsed expression * + * * + * Parameters: ctx - [IN] the evaluation context * + * hostids - [IN] the linked hostids * + * hostids_num - [IN] the number of linked hostids * + * resolver_cb - [IN] the resolver callback * + * * + ******************************************************************************/ +void zbx_eval_expand_user_macros(const zbx_eval_context_t *ctx, zbx_uint64_t *hostids, int hostids_num, + zbx_macro_resolve_func_t resolver_cb) +{ + int i; + + for (i = 0; i < ctx->stack.values_num; i++) + { + zbx_eval_token_t *token = &ctx->stack.values[i]; + char *value, *tmp; + const char *ptr; + + switch (token->type) + { + case ZBX_EVAL_TOKEN_VAR_USERMACRO: + value = resolver_cb(ctx->expression + token->loc.l, token->loc.r - token->loc.l + 1, + hostids, hostids_num); + break; + case ZBX_EVAL_TOKEN_VAR_STR: + if (NULL == (ptr = strstr(ctx->expression + token->loc.l, "{$")) || + ptr >= ctx->expression + token->loc.r) + { + + continue; + } + tmp = zbx_strloc_unquote_dyn(ctx->expression, &token->loc); + value = resolver_cb(tmp, strlen(tmp), hostids, hostids_num); + zbx_free(tmp); + break; + default: + continue; + } + + zbx_variant_set_str(&token->value, value); + } +} + +/****************************************************************************** + * * + * Function: zbx_eval_set_exception * + * * + * Purpose: set eval context to exception that will be returned when executed * + * * + * Parameters: ctx - [IN] the evaluation context * + * message - [IN] the exception message (the memory is owned by * + * context) * + * * + ******************************************************************************/ +void zbx_eval_set_exception(zbx_eval_context_t *ctx, char *message) +{ + zbx_eval_token_t *token; + + memset(ctx, 0, sizeof(zbx_eval_context_t)); + zbx_vector_eval_token_create(&ctx->stack); + zbx_vector_eval_token_reserve(&ctx->stack, 2); + + token = ctx->stack.values; + memset(token, 0, 2 * sizeof(zbx_eval_token_t)); + token->type = ZBX_EVAL_TOKEN_VAR_STR; + zbx_variant_set_str(&token->value, message); + (++token)->type = ZBX_EVAL_TOKEN_EXCEPTION; +} diff --git a/src/libs/zbxserver/eval.c b/src/libs/zbxeval/parse.c index d3a22c85902..d3a22c85902 100644 --- a/src/libs/zbxserver/eval.c +++ b/src/libs/zbxeval/parse.c diff --git a/src/libs/zbxserver/Makefile.am b/src/libs/zbxserver/Makefile.am index debfef3b80e..c6c5253be7c 100644 --- a/src/libs/zbxserver/Makefile.am +++ b/src/libs/zbxserver/Makefile.am @@ -9,10 +9,7 @@ libzbxserver_a_SOURCES = \ macrofunc.c \ macrofunc.h \ zabbix_stats.c \ - zabbix_stats.h \ - eval.c \ - eval_execute.c \ - eval_misc.c + zabbix_stats.h libzbxserver_server_a_SOURCES = \ zabbix_stats.h \ diff --git a/src/zabbix_proxy/Makefile.am b/src/zabbix_proxy/Makefile.am index ae631ebbd9c..0d2eb35e0db 100644 --- a/src/zabbix_proxy/Makefile.am +++ b/src/zabbix_proxy/Makefile.am @@ -51,6 +51,7 @@ zabbix_proxy_LDADD = \ $(top_builddir)/src/libs/zbxdbcache/libzbxdbcache.a \ $(top_builddir)/src/libs/zbxserver/libzbxserver.a \ $(top_builddir)/src/libs/zbxserver/libzbxserver_proxy.a \ + $(top_builddir)/src/libs/zbxeval/libzbxeval.a \ $(top_builddir)/src/libs/zbxhistory/libzbxhistory.a \ $(top_builddir)/src/libs/zbxmemory/libzbxmemory.a \ $(top_builddir)/src/libs/zbxregexp/libzbxregexp.a \ diff --git a/src/zabbix_server/Makefile.am b/src/zabbix_server/Makefile.am index 010778462d0..0833c1b32c4 100644 --- a/src/zabbix_server/Makefile.am +++ b/src/zabbix_server/Makefile.am @@ -76,6 +76,7 @@ zabbix_server_LDADD = \ $(top_builddir)/src/libs/zbxlog/libzbxlog.a \ $(top_builddir)/src/libs/zbxdbcache/libzbxdbcache.a \ $(top_builddir)/src/libs/zbxserver/libzbxserver.a \ + $(top_builddir)/src/libs/zbxeval/libzbxeval.a \ $(top_builddir)/src/libs/zbxhistory/libzbxhistory.a \ $(top_builddir)/src/libs/zbxmemory/libzbxmemory.a \ $(top_builddir)/src/libs/zbxregexp/libzbxregexp.a \ diff --git a/tests/conf_tests.m4 b/tests/conf_tests.m4 index 211f5f1274e..72954dc3efe 100644 --- a/tests/conf_tests.m4 +++ b/tests/conf_tests.m4 @@ -27,6 +27,7 @@ AC_DEFUN([CONF_TESTS],[ tests/libs/zbxdbcache/Makefile tests/libs/zbxdbhigh/Makefile tests/libs/zbxhistory/Makefile + tests/libs/zbxeval/Makefile tests/libs/zbxjson/Makefile tests/libs/zbxsysinfo/Makefile tests/libs/zbxsysinfo/linux/Makefile diff --git a/tests/libs/Makefile.am b/tests/libs/Makefile.am index dac31952174..3493efe46dc 100644 --- a/tests/libs/Makefile.am +++ b/tests/libs/Makefile.am @@ -13,4 +13,5 @@ SUBDIRS = \ zbxcomms \ zbxregexp \ zbxserver \ - zbxtrends + zbxtrends \ + zbxeval diff --git a/tests/libs/zbxdbcache/Makefile.am b/tests/libs/zbxdbcache/Makefile.am index bb6690c133f..d01078762c0 100644 --- a/tests/libs/zbxdbcache/Makefile.am +++ b/tests/libs/zbxdbcache/Makefile.am @@ -45,6 +45,7 @@ CACHE_LIBS = \ $(top_srcdir)/src/libs/zbxtrends/libzbxtrends.a \ $(top_srcdir)/src/zabbix_server/libzbxserver.a \ $(top_srcdir)/src/libs/zbxserver/libzbxserver.a \ + $(top_srcdir)/src/libs/zbxeval/libzbxeval.a \ $(top_srcdir)/src/libs/zbxsysinfo/libzbxserversysinfo.a \ $(top_srcdir)/src/libs/zbxsysinfo/common/libcommonsysinfo.a \ $(top_srcdir)/src/libs/zbxsysinfo/simple/libsimplesysinfo.a \ diff --git a/tests/libs/zbxdbhigh/Makefile.am b/tests/libs/zbxdbhigh/Makefile.am index 99645864610..f5eb49f58b7 100644 --- a/tests/libs/zbxdbhigh/Makefile.am +++ b/tests/libs/zbxdbhigh/Makefile.am @@ -79,6 +79,7 @@ SERVER_COMMON_LIB = \ $(top_srcdir)/src/libs/zbxsysinfo/common/libcommonsysinfo.a \ $(top_srcdir)/src/libs/zbxsysinfo/simple/libsimplesysinfo.a \ $(top_srcdir)/src/libs/zbxdbcache/libzbxdbcache.a \ + $(top_srcdir)/src/libs/zbxeval/libzbxeval.a \ $(top_srcdir)/src/zabbix_server/availability/libavailability.a \ $(top_srcdir)/src/libs/zbxavailability/libzbxavailability.a \ $(top_srcdir)/src/libs/zbxipcservice/libzbxipcservice.a \ diff --git a/tests/libs/zbxeval/Makefile.am b/tests/libs/zbxeval/Makefile.am new file mode 100755 index 00000000000..3369948da23 --- /dev/null +++ b/tests/libs/zbxeval/Makefile.am @@ -0,0 +1,157 @@ +if SERVER +SERVER_tests = \ + zbx_eval_parse_expression \ + zbx_eval_serialize \ + zbx_eval_compose_expression \ + zbx_eval_execute \ + zbx_eval_execute_ext +endif + +noinst_PROGRAMS = $(SERVER_tests) + +if SERVER +COMMON_SRC_FILES = \ + ../../zbxmocktest.h + +COMMON_LIB_FILES = \ + $(top_srcdir)/src/zabbix_server/alerter/libzbxalerter.a \ + $(top_srcdir)/src/zabbix_server/dbsyncer/libzbxdbsyncer.a \ + $(top_srcdir)/src/zabbix_server/dbconfig/libzbxdbconfig.a \ + $(top_srcdir)/src/zabbix_server/discoverer/libzbxdiscoverer.a \ + $(top_srcdir)/src/zabbix_server/pinger/libzbxpinger.a \ + $(top_srcdir)/src/zabbix_server/poller/libzbxpoller.a \ + $(top_srcdir)/src/zabbix_server/housekeeper/libzbxhousekeeper.a \ + $(top_srcdir)/src/zabbix_server/timer/libzbxtimer.a \ + $(top_srcdir)/src/zabbix_server/trapper/libzbxtrapper.a \ + $(top_srcdir)/src/zabbix_server/snmptrapper/libzbxsnmptrapper.a \ + $(top_srcdir)/src/zabbix_server/httppoller/libzbxhttppoller.a \ + $(top_srcdir)/src/zabbix_server/escalator/libzbxescalator.a \ + $(top_srcdir)/src/zabbix_server/proxypoller/libzbxproxypoller.a \ + $(top_srcdir)/src/zabbix_server/selfmon/libzbxselfmon.a \ + $(top_srcdir)/src/zabbix_server/vmware/libzbxvmware.a \ + $(top_srcdir)/src/zabbix_server/taskmanager/libzbxtaskmanager.a \ + $(top_srcdir)/src/zabbix_server/ipmi/libipmi.a \ + $(top_srcdir)/src/zabbix_server/odbc/libzbxodbc.a \ + $(top_srcdir)/src/zabbix_server/scripts/libzbxscripts.a \ + $(top_srcdir)/src/zabbix_server/preprocessor/libpreprocessor.a \ + $(top_srcdir)/src/libs/zbxserver/libzbxserver.a \ + $(top_srcdir)/src/libs/zbxdbcache/libzbxdbcache.a \ + $(top_srcdir)/src/libs/zbxeval/libzbxeval.a \ + $(top_srcdir)/src/libs/zbxtrends/libzbxtrends.a \ + $(top_srcdir)/src/libs/zbxsysinfo/libzbxserversysinfo.a \ + $(top_srcdir)/src/libs/zbxsysinfo/common/libcommonsysinfo.a \ + $(top_srcdir)/src/libs/zbxsysinfo/simple/libsimplesysinfo.a \ + $(top_srcdir)/src/libs/zbxmemory/libzbxmemory.a \ + $(top_srcdir)/src/libs/zbxself/libzbxself.a \ + $(top_srcdir)/src/libs/zbxalgo/libzbxalgo.a \ + $(top_srcdir)/src/libs/zbxsys/libzbxsys.a \ + $(top_srcdir)/src/libs/zbxconf/libzbxconf.a \ + $(top_srcdir)/src/libs/zbxmedia/libzbxmedia.a \ + $(top_srcdir)/src/libs/zbxserver/libzbxserver.a \ + $(top_srcdir)/src/zabbix_server/availability/libavailability.a \ + $(top_srcdir)/src/libs/zbxavailability/libzbxavailability.a \ + $(top_srcdir)/src/libs/zbxipcservice/libzbxipcservice.a \ + $(top_srcdir)/src/libs/zbxcommon/libzbxcommon.a \ + $(top_srcdir)/src/libs/zbxnix/libzbxnix.a \ + $(top_srcdir)/src/libs/zbxcrypto/libzbxcrypto.a \ + $(top_srcdir)/src/libs/zbxcomms/libzbxcomms.a \ + $(top_srcdir)/src/libs/zbxcompress/libzbxcompress.a \ + $(top_srcdir)/src/libs/zbxcommon/libzbxcommon.a \ + $(top_srcdir)/src/libs/zbxsys/libzbxsys.a \ + $(top_srcdir)/src/libs/zbxcrypto/libzbxcrypto.a \ + $(top_srcdir)/src/libs/zbxcommshigh/libzbxcommshigh.a \ + $(top_srcdir)/src/libs/zbxjson/libzbxjson.a \ + $(top_srcdir)/src/libs/zbxregexp/libzbxregexp.a \ + $(top_srcdir)/src/libs/zbxhttp/libzbxhttp.a \ + $(top_srcdir)/src/libs/zbxipcservice/libzbxipcservice.a \ + $(top_srcdir)/src/libs/zbxexec/libzbxexec.a \ + $(top_srcdir)/src/libs/zbxicmpping/libzbxicmpping.a \ + $(top_srcdir)/src/libs/zbxdbupgrade/libzbxdbupgrade.a \ + $(top_srcdir)/src/libs/zbxdbhigh/libzbxdbhigh.a \ + $(top_srcdir)/src/libs/zbxdb/libzbxdb.a \ + $(top_srcdir)/src/libs/zbxmodules/libzbxmodules.a \ + $(top_srcdir)/src/libs/zbxtasks/libzbxtasks.a \ + $(top_srcdir)/src/libs/zbxlog/libzbxlog.a \ + $(top_srcdir)/src/libs/zbxsys/libzbxsys.a \ + $(top_srcdir)/src/libs/zbxconf/libzbxconf.a \ + $(top_srcdir)/src/libs/zbxhistory/libzbxhistory.a \ + $(top_srcdir)/src/zabbix_server/libzbxserver.a \ + $(top_srcdir)/tests/libzbxmocktest.a \ + $(top_srcdir)/tests/libzbxmockdata.a \ + $(top_srcdir)/src/libs/zbxalgo/libzbxalgo.a \ + $(top_srcdir)/src/libs/zbxdbhigh/libzbxdbhigh.a \ + $(top_srcdir)/src/libs/zbxvault/libzbxvault.a \ + $(top_srcdir)/src/libs/zbxhttp/libzbxhttp.a + +COMMON_COMPILER_FLAGS = -I@top_srcdir@/tests + +zbx_eval_parse_expression_SOURCES = \ + zbx_eval_parse_expression.c \ + mock_eval.c mock_eval.h + +zbx_eval_parse_expression_LDADD = \ + $(COMMON_LIB_FILES) + +zbx_eval_parse_expression_LDADD += @SERVER_LIBS@ + +zbx_eval_parse_expression_LDFLAGS = @SERVER_LDFLAGS@ + +zbx_eval_parse_expression_CFLAGS = $(COMMON_COMPILER_FLAGS) + + +zbx_eval_serialize_SOURCES = \ + zbx_eval_serialize.c + +zbx_eval_serialize_LDADD = \ + $(COMMON_LIB_FILES) + +zbx_eval_serialize_LDADD += @SERVER_LIBS@ + +zbx_eval_serialize_LDFLAGS = @SERVER_LDFLAGS@ + +zbx_eval_serialize_CFLAGS = $(COMMON_COMPILER_FLAGS) + + +zbx_eval_compose_expression_SOURCES = \ + zbx_eval_compose_expression.c \ + mock_eval.c mock_eval.h + +zbx_eval_compose_expression_LDADD = \ + $(COMMON_LIB_FILES) + +zbx_eval_compose_expression_LDADD += @SERVER_LIBS@ + +zbx_eval_compose_expression_LDFLAGS = @SERVER_LDFLAGS@ + +zbx_eval_compose_expression_CFLAGS = $(COMMON_COMPILER_FLAGS) + + +zbx_eval_execute_SOURCES = \ + zbx_eval_execute.c \ + mock_eval.c mock_eval.h + +zbx_eval_execute_LDADD = \ + $(COMMON_LIB_FILES) + +zbx_eval_execute_LDADD += @SERVER_LIBS@ + +zbx_eval_execute_LDFLAGS = @SERVER_LDFLAGS@ + +zbx_eval_execute_CFLAGS = $(COMMON_COMPILER_FLAGS) + + +zbx_eval_execute_ext_SOURCES = \ + zbx_eval_execute_ext.c \ + mock_eval.c mock_eval.h + +zbx_eval_execute_ext_LDADD = \ + $(COMMON_LIB_FILES) + +zbx_eval_execute_ext_LDADD += @SERVER_LIBS@ + +zbx_eval_execute_ext_LDFLAGS = @SERVER_LDFLAGS@ + +zbx_eval_execute_ext_CFLAGS = $(COMMON_COMPILER_FLAGS) + +endif + diff --git a/tests/libs/zbxserver/mock_eval.c b/tests/libs/zbxeval/mock_eval.c index 7372bc482f9..7372bc482f9 100644 --- a/tests/libs/zbxserver/mock_eval.c +++ b/tests/libs/zbxeval/mock_eval.c diff --git a/tests/libs/zbxserver/mock_eval.h b/tests/libs/zbxeval/mock_eval.h index d857191e8dd..d857191e8dd 100644 --- a/tests/libs/zbxserver/mock_eval.h +++ b/tests/libs/zbxeval/mock_eval.h diff --git a/tests/libs/zbxserver/zbx_eval_compose_expression.c b/tests/libs/zbxeval/zbx_eval_compose_expression.c index 93304098a8f..352d0e2fc6c 100644 --- a/tests/libs/zbxserver/zbx_eval_compose_expression.c +++ b/tests/libs/zbxeval/zbx_eval_compose_expression.c @@ -23,7 +23,7 @@ #include "zbxmockutil.h" #include "common.h" -#include "zbxserver.h" +#include "zbxeval.h" #include "mock_eval.h" static void replace_values(zbx_eval_context_t *ctx, const char *path) diff --git a/tests/libs/zbxserver/zbx_eval_compose_expression.yaml b/tests/libs/zbxeval/zbx_eval_compose_expression.yaml index c2f021d5e97..c2f021d5e97 100644 --- a/tests/libs/zbxserver/zbx_eval_compose_expression.yaml +++ b/tests/libs/zbxeval/zbx_eval_compose_expression.yaml diff --git a/tests/libs/zbxserver/zbx_eval_execute.c b/tests/libs/zbxeval/zbx_eval_execute.c index cbadac31aba..07ca3b84b2b 100644 --- a/tests/libs/zbxserver/zbx_eval_execute.c +++ b/tests/libs/zbxeval/zbx_eval_execute.c @@ -23,7 +23,7 @@ #include "zbxmockutil.h" #include "common.h" -#include "zbxserver.h" +#include "zbxeval.h" #include "log.h" #include "mock_eval.h" diff --git a/tests/libs/zbxserver/zbx_eval_execute.yaml b/tests/libs/zbxeval/zbx_eval_execute.yaml index f87362f0fa9..f87362f0fa9 100644 --- a/tests/libs/zbxserver/zbx_eval_execute.yaml +++ b/tests/libs/zbxeval/zbx_eval_execute.yaml diff --git a/tests/libs/zbxserver/zbx_eval_execute_ext.c b/tests/libs/zbxeval/zbx_eval_execute_ext.c index 3258726834f..87ebf06f29d 100644 --- a/tests/libs/zbxserver/zbx_eval_execute_ext.c +++ b/tests/libs/zbxeval/zbx_eval_execute_ext.c @@ -23,7 +23,7 @@ #include "zbxmockutil.h" #include "common.h" -#include "zbxserver.h" +#include "zbxeval.h" #include "mock_eval.h" typedef struct diff --git a/tests/libs/zbxserver/zbx_eval_execute_ext.yaml b/tests/libs/zbxeval/zbx_eval_execute_ext.yaml index 25420daefb2..25420daefb2 100644 --- a/tests/libs/zbxserver/zbx_eval_execute_ext.yaml +++ b/tests/libs/zbxeval/zbx_eval_execute_ext.yaml diff --git a/tests/libs/zbxserver/zbx_eval_parse_expression.c b/tests/libs/zbxeval/zbx_eval_parse_expression.c index ccccb5af419..01ee6756d8a 100644 --- a/tests/libs/zbxserver/zbx_eval_parse_expression.c +++ b/tests/libs/zbxeval/zbx_eval_parse_expression.c @@ -23,7 +23,7 @@ #include "zbxmockutil.h" #include "common.h" -#include "zbxserver.h" +#include "zbxeval.h" #include "mock_eval.h" static const char *mock_token_type2str(zbx_uint32_t type) diff --git a/tests/libs/zbxserver/zbx_eval_parse_expression.yaml b/tests/libs/zbxeval/zbx_eval_parse_expression.yaml index c8216130bd1..c8216130bd1 100644 --- a/tests/libs/zbxserver/zbx_eval_parse_expression.yaml +++ b/tests/libs/zbxeval/zbx_eval_parse_expression.yaml diff --git a/tests/libs/zbxserver/zbx_eval_serialize.c b/tests/libs/zbxeval/zbx_eval_serialize.c index db347eaf067..fc440d7f52f 100644 --- a/tests/libs/zbxserver/zbx_eval_serialize.c +++ b/tests/libs/zbxeval/zbx_eval_serialize.c @@ -23,7 +23,7 @@ #include "zbxmockutil.h" #include "common.h" -#include "zbxserver.h" +#include "zbxeval.h" static void mock_read_token(zbx_eval_token_t *token, zbx_mock_handle_t htoken) { diff --git a/tests/libs/zbxserver/zbx_eval_serialize.yaml b/tests/libs/zbxeval/zbx_eval_serialize.yaml index 490b779a5e3..490b779a5e3 100644 --- a/tests/libs/zbxserver/zbx_eval_serialize.yaml +++ b/tests/libs/zbxeval/zbx_eval_serialize.yaml diff --git a/tests/libs/zbxserver/Makefile.am b/tests/libs/zbxserver/Makefile.am index 639149c5bf7..7c93724c262 100755 --- a/tests/libs/zbxserver/Makefile.am +++ b/tests/libs/zbxserver/Makefile.am @@ -3,12 +3,7 @@ SERVER_tests = \ get_trigger_expression_constant \ evaluate_function \ substitute_lld_macros \ - macro_fmttime \ - zbx_eval_parse_expression \ - zbx_eval_serialize \ - zbx_eval_compose_expression \ - zbx_eval_execute \ - zbx_eval_execute_ext + macro_fmttime endif noinst_PROGRAMS = $(SERVER_tests) @@ -51,6 +46,7 @@ COMMON_LIB_FILES = \ $(top_srcdir)/src/libs/zbxconf/libzbxconf.a \ $(top_srcdir)/src/libs/zbxmedia/libzbxmedia.a \ $(top_srcdir)/src/libs/zbxserver/libzbxserver.a \ + $(top_srcdir)/src/libs/zbxeval/libzbxeval.a \ $(top_srcdir)/src/zabbix_server/availability/libavailability.a \ $(top_srcdir)/src/libs/zbxavailability/libzbxavailability.a \ $(top_srcdir)/src/libs/zbxipcservice/libzbxipcservice.a \ @@ -166,74 +162,5 @@ evaluate_function_CFLAGS = $(COMMON_COMPILER_FLAGS) \ -I@top_srcdir@/src/libs/zbxdbcache \ -I@top_srcdir@/src/libs/zbxhistory - -zbx_eval_parse_expression_SOURCES = \ - zbx_eval_parse_expression.c \ - mock_eval.c mock_eval.h - -zbx_eval_parse_expression_LDADD = \ - $(COMMON_LIB_FILES) - -zbx_eval_parse_expression_LDADD += @SERVER_LIBS@ - -zbx_eval_parse_expression_LDFLAGS = @SERVER_LDFLAGS@ - -zbx_eval_parse_expression_CFLAGS = $(COMMON_COMPILER_FLAGS) - - -zbx_eval_serialize_SOURCES = \ - zbx_eval_serialize.c - -zbx_eval_serialize_LDADD = \ - $(COMMON_LIB_FILES) - -zbx_eval_serialize_LDADD += @SERVER_LIBS@ - -zbx_eval_serialize_LDFLAGS = @SERVER_LDFLAGS@ - -zbx_eval_serialize_CFLAGS = $(COMMON_COMPILER_FLAGS) - - -zbx_eval_compose_expression_SOURCES = \ - zbx_eval_compose_expression.c \ - mock_eval.c mock_eval.h - -zbx_eval_compose_expression_LDADD = \ - $(COMMON_LIB_FILES) - -zbx_eval_compose_expression_LDADD += @SERVER_LIBS@ - -zbx_eval_compose_expression_LDFLAGS = @SERVER_LDFLAGS@ - -zbx_eval_compose_expression_CFLAGS = $(COMMON_COMPILER_FLAGS) - - -zbx_eval_execute_SOURCES = \ - zbx_eval_execute.c \ - mock_eval.c mock_eval.h - -zbx_eval_execute_LDADD = \ - $(COMMON_LIB_FILES) - -zbx_eval_execute_LDADD += @SERVER_LIBS@ - -zbx_eval_execute_LDFLAGS = @SERVER_LDFLAGS@ - -zbx_eval_execute_CFLAGS = $(COMMON_COMPILER_FLAGS) - - -zbx_eval_execute_ext_SOURCES = \ - zbx_eval_execute_ext.c \ - mock_eval.c mock_eval.h - -zbx_eval_execute_ext_LDADD = \ - $(COMMON_LIB_FILES) - -zbx_eval_execute_ext_LDADD += @SERVER_LIBS@ - -zbx_eval_execute_ext_LDFLAGS = @SERVER_LDFLAGS@ - -zbx_eval_execute_ext_CFLAGS = $(COMMON_COMPILER_FLAGS) - endif |