You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

246 lines
8.4 KiB

/*
** Zabbix
** Copyright (C) 2001-2023 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_EXPR_H
#define ZABBIX_EXPR_H
#include "zbxcommon.h"
int zbx_is_hostname_char(unsigned char c);
int zbx_is_key_char(unsigned char c);
int zbx_is_function_char(unsigned char c);
int zbx_is_macro_char(unsigned char c);
int zbx_is_discovery_macro(const char *name);
int zbx_parse_key(const char **exp);
int zbx_parse_host_key(char *exp, char **host, char **key);
void zbx_make_hostname(char *host);
int zbx_check_hostname(const char *hostname, char **error);
int zbx_function_validate(const char *expr, size_t *par_l, size_t *par_r, char *error, int max_error_len);
int zbx_function_validate_parameters(const char *expr, size_t *length);
int zbx_user_macro_parse(const char *macro, int *macro_r, int *context_l, int *context_r,
unsigned char *context_op);
int zbx_user_macro_parse_dyn(const char *macro, char **name, char **context, int *length,
unsigned char *context_op);
char *zbx_user_macro_unquote_context_dyn(const char *context, int len);
char *zbx_user_macro_quote_context_dyn(const char *context, int force_quote, char **error);
int zbx_function_find(const char *expr, size_t *func_pos, size_t *par_l, size_t *par_r, char *error,
int max_error_len);
void zbx_function_param_parse(const char *expr, size_t *param_pos, size_t *length, size_t *sep_pos);
char *zbx_function_param_unquote_dyn(const char *param, size_t len, int *quoted);
int zbx_function_param_quote(char **param, int forced);
char *zbx_function_get_param_dyn(const char *params, int Nparam);
typedef enum
{
ZBX_FUNCTION_TYPE_UNKNOWN,
ZBX_FUNCTION_TYPE_HISTORY,
ZBX_FUNCTION_TYPE_TIMER,
ZBX_FUNCTION_TYPE_TRENDS
}
zbx_function_type_t;
zbx_function_type_t zbx_get_function_type(const char *func);
int zbx_is_double_suffix(const char *str, unsigned char flags);
double zbx_str2double(const char *str);
int zbx_suffixed_number_parse(const char *number, int *len);
int zbx_strmatch_condition(const char *value, const char *pattern, unsigned char op);
int zbx_uint64match_condition(zbx_uint64_t value, zbx_uint64_t pattern, unsigned char op);
/* token START */
/* tokens used in expressions */
#define ZBX_TOKEN_OBJECTID 0x00001
#define ZBX_TOKEN_MACRO 0x00002
#define ZBX_TOKEN_LLD_MACRO 0x00004
#define ZBX_TOKEN_USER_MACRO 0x00008
#define ZBX_TOKEN_FUNC_MACRO 0x00010
#define ZBX_TOKEN_SIMPLE_MACRO 0x00020
#define ZBX_TOKEN_REFERENCE 0x00040
#define ZBX_TOKEN_LLD_FUNC_MACRO 0x00080
#define ZBX_TOKEN_EXPRESSION_MACRO 0x00100
/* additional token flags */
#define ZBX_TOKEN_JSON 0x0010000
#define ZBX_TOKEN_REGEXP 0x0040000
#define ZBX_TOKEN_XPATH 0x0080000
#define ZBX_TOKEN_REGEXP_OUTPUT 0x0100000
#define ZBX_TOKEN_PROMETHEUS 0x0200000
#define ZBX_TOKEN_JSONPATH 0x0400000
#define ZBX_TOKEN_STR_REPLACE 0x0800000
#define ZBX_TOKEN_STRING 0x1000000
/* location of a substring */
typedef struct
{
/* left position */
size_t l;
/* right position */
size_t r;
}
zbx_strloc_t;
/* data used by macros, lld macros and objectid tokens */
typedef struct
{
zbx_strloc_t name;
}
zbx_token_macro_t;
/* data used by macros, lld macros and objectid tokens */
typedef struct
{
zbx_strloc_t expression;
}
zbx_token_expression_macro_t;
/* data used by user macros */
typedef struct
{
/* macro name */
zbx_strloc_t name;
/* macro context, for macros without context the context.l and context.r fields are set to 0 */
zbx_strloc_t context;
}
zbx_token_user_macro_t;
/* data used by macro functions */
typedef struct
{
/* the macro including the opening and closing brackets {}, for example: {ITEM.VALUE} */
zbx_strloc_t macro;
/* function + parameters, for example: regsub("([0-9]+)", \1) */
zbx_strloc_t func;
/* parameters, for example: ("([0-9]+)", \1) */
zbx_strloc_t func_param;
}
zbx_token_func_macro_t;
/* data used by simple (host:key) macros */
typedef struct
{
/* host name, supporting simple macros as a host name, for example Zabbix server or {HOST.HOST} */
zbx_strloc_t host;
/* key + parameters, supporting {ITEM.KEYn} macro, for example system.uname or {ITEM.KEY1} */
zbx_strloc_t key;
/* function + parameters, for example avg(5m) */
zbx_strloc_t func;
/* parameters, for example (5m) */
zbx_strloc_t func_param;
}
zbx_token_simple_macro_t;
/* data used by references */
typedef struct
{
/* index of constant being referenced (1 for $1, 2 for $2, ..., 9 for $9) */
int index;
}
zbx_token_reference_t;
/* the token type specific data */
typedef union
{
zbx_token_macro_t objectid;
zbx_token_macro_t macro;
zbx_token_macro_t lld_macro;
zbx_token_expression_macro_t expression_macro;
zbx_token_user_macro_t user_macro;
zbx_token_func_macro_t func_macro;
zbx_token_func_macro_t lld_func_macro;
zbx_token_simple_macro_t simple_macro;
zbx_token_reference_t reference;
}
zbx_token_data_t;
/* {} token data */
typedef struct
{
/* token type, see ZBX_TOKEN_ defines */
int type;
/* the token location in expression including opening and closing brackets {} */
zbx_strloc_t loc;
/* the token type specific data */
zbx_token_data_t data;
}
zbx_token_t;
#define ZBX_TOKEN_SEARCH_BASIC 0x00
#define ZBX_TOKEN_SEARCH_REFERENCES 0x01
#define ZBX_TOKEN_SEARCH_EXPRESSION_MACRO 0x02
#define ZBX_TOKEN_SEARCH_FUNCTIONID 0x04
#define ZBX_TOKEN_SEARCH_SIMPLE_MACRO 0x08 /* used by the upgrade patches only */
typedef int zbx_token_search_t;
int zbx_token_find(const char *expression, int pos, zbx_token_t *token, zbx_token_search_t token_search);
int zbx_token_parse_user_macro(const char *expression, const char *macro, zbx_token_t *token);
int zbx_token_parse_macro(const char *expression, const char *macro, zbx_token_t *token);
int zbx_token_parse_objectid(const char *expression, const char *macro, zbx_token_t *token);
int zbx_token_parse_lld_macro(const char *expression, const char *macro, zbx_token_t *token);
int zbx_token_parse_nested_macro(const char *expression, const char *macro, zbx_token_search_t token_search,
zbx_token_t *token);
/* token END */
/* report scheduling */
#define ZBX_REPORT_CYCLE_DAILY 0
#define ZBX_REPORT_CYCLE_WEEKLY 1
#define ZBX_REPORT_CYCLE_MONTHLY 2
#define ZBX_REPORT_CYCLE_YEARLY 3
int zbx_get_agent_item_nextcheck(zbx_uint64_t itemid, const char *delay, int now,
int *nextcheck, int *scheduling, char **error);
/* interval START */
typedef struct zbx_custom_interval zbx_custom_interval_t;
int zbx_interval_preproc(const char *interval_str, int *simple_interval, zbx_custom_interval_t **custom_intervals,
char **error);
int zbx_validate_interval(const char *str, char **error);
int zbx_custom_interval_is_scheduling(const zbx_custom_interval_t *custom_intervals);
void zbx_custom_interval_free(zbx_custom_interval_t *custom_intervals);
int zbx_calculate_item_nextcheck(zbx_uint64_t seed, int item_type, int simple_interval,
const zbx_custom_interval_t *custom_intervals, time_t now);
int zbx_calculate_item_nextcheck_unreachable(int simple_interval, const zbx_custom_interval_t *custom_intervals,
time_t disable_until);
int zbx_check_time_period(const char *period, time_t time, const char *tz, int *res);
int zbx_get_report_nextcheck(int now, unsigned char cycle, unsigned char weekdays, int start_time,
const char *tz);
/* interval END */
/* condition operators */
#define ZBX_CONDITION_OPERATOR_EQUAL 0
#define ZBX_CONDITION_OPERATOR_NOT_EQUAL 1
#define ZBX_CONDITION_OPERATOR_LIKE 2
#define ZBX_CONDITION_OPERATOR_NOT_LIKE 3
#define ZBX_CONDITION_OPERATOR_IN 4
#define ZBX_CONDITION_OPERATOR_MORE_EQUAL 5
#define ZBX_CONDITION_OPERATOR_LESS_EQUAL 6
#define ZBX_CONDITION_OPERATOR_NOT_IN 7
#define ZBX_CONDITION_OPERATOR_REGEXP 8
#define ZBX_CONDITION_OPERATOR_NOT_REGEXP 9
#define ZBX_CONDITION_OPERATOR_YES 10
#define ZBX_CONDITION_OPERATOR_NO 11
#define ZBX_CONDITION_OPERATOR_EXIST 12
#define ZBX_CONDITION_OPERATOR_NOT_EXIST 13
#endif /* ZABBIX_EXPR_H */