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-01-23 19:08:46 +0300
committerAndris Zeila <andris.zeila@zabbix.com>2021-01-23 19:08:46 +0300
commit477f6cf0ec943b422d571b256d4fb45160bb7744 (patch)
tree6999e9dddc33485efd73ecda7a09f9465e7577f1
parent5afa58b768619e2a636aa3b5ca6473a1621aeb2f (diff)
.......PS. [ZBXNEXT-6451] moved expression parsing code to separate library to avoid cyclic dependencies
-rw-r--r--.gitignore10
-rw-r--r--configure.ac1
-rw-r--r--include/dbcache.h4
-rw-r--r--include/zbxeval.h176
-rw-r--r--include/zbxserver.h148
-rw-r--r--include/zbxvariant.h85
-rw-r--r--src/libs/Makefile.am9
-rw-r--r--src/libs/zbxalgo/serialize.c102
-rw-r--r--src/libs/zbxdbcache/dbconfig.c4
-rw-r--r--src/libs/zbxdbcache/dbsync.c1
-rw-r--r--src/libs/zbxeval/Makefile.am9
-rw-r--r--src/libs/zbxeval/execute.c (renamed from src/libs/zbxserver/eval_execute.c)0
-rw-r--r--src/libs/zbxeval/misc.c132
-rw-r--r--src/libs/zbxeval/parse.c (renamed from src/libs/zbxserver/eval.c)0
-rw-r--r--src/libs/zbxserver/Makefile.am5
-rw-r--r--src/zabbix_proxy/Makefile.am1
-rw-r--r--src/zabbix_server/Makefile.am1
-rw-r--r--tests/conf_tests.m41
-rw-r--r--tests/libs/Makefile.am3
-rw-r--r--tests/libs/zbxdbcache/Makefile.am1
-rw-r--r--tests/libs/zbxdbhigh/Makefile.am1
-rwxr-xr-xtests/libs/zbxeval/Makefile.am157
-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-xtests/libs/zbxserver/Makefile.am77
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