/* ** 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_DBHIGH_H #define ZABBIX_DBHIGH_H #include "zbxalgo.h" #include "zbxdb.h" #include "zbxdbschema.h" #include "zbxstr.h" #include "zbxnum.h" #include "zbxversion.h" #include "zbxtime.h" #include "zbxtagfilter.h" #define ZBX_DB_CONNECT_NORMAL 0 #define ZBX_DB_CONNECT_EXIT 1 #define ZBX_DB_CONNECT_ONCE 2 /* type of database */ #define ZBX_DB_UNKNOWN 0 #define ZBX_DB_SERVER 1 #define ZBX_DB_PROXY 2 #define ZBX_INTERFACE_DNS_LEN 255 #define ZBX_INTERFACE_DNS_LEN_MAX (ZBX_INTERFACE_DNS_LEN + 1) #define ZBX_INTERFACE_IP_LEN 64 #define ZBX_INTERFACE_IP_LEN_MAX (ZBX_INTERFACE_IP_LEN + 1) #define ZBX_INTERFACE_ADDR_LEN 255 /* MAX(ZBX_INTERFACE_DNS_LEN,ZBX_INTERFACE_IP_LEN) */ #define ZBX_INTERFACE_ADDR_LEN_MAX (ZBX_INTERFACE_ADDR_LEN + 1) #define ZBX_INTERFACE_PORT_LEN 64 #define ZBX_INTERFACE_PORT_LEN_MAX (ZBX_INTERFACE_PORT_LEN + 1) #define ZBX_INTERFACE_ERROR_LEN 2048 #define ZBX_INTERFACE_ERROR_LEN_MAX (ZBX_INTERFACE_ERROR_LEN + 1) #define ZBX_ITEM_NAME_LEN 255 #define ZBX_ITEM_KEY_LEN 2048 #define ZBX_ITEM_DELAY_LEN 1024 #define ZBX_ITEM_HISTORY_LEN 255 #define ZBX_ITEM_TRENDS_LEN 255 #define ZBX_ITEM_UNITS_LEN 255 #define ZBX_ITEM_SNMP_COMMUNITY_LEN 64 #define ZBX_ITEM_SNMP_COMMUNITY_LEN_MAX (ZBX_ITEM_SNMP_COMMUNITY_LEN + 1) #define ZBX_ITEM_SNMP_OID_LEN 512 #define ZBX_ITEM_SNMP_OID_LEN_MAX (ZBX_ITEM_SNMP_OID_LEN + 1) #define ZBX_ITEM_ERROR_LEN 2048 #define ZBX_ITEM_ERROR_LEN_MAX (ZBX_ITEM_ERROR_LEN + 1) #define ZBX_ITEM_TRAPPER_HOSTS_LEN 255 #define ZBX_ITEM_TRAPPER_HOSTS_LEN_MAX (ZBX_ITEM_TRAPPER_HOSTS_LEN + 1) #define ZBX_ITEM_SNMPV3_SECURITYNAME_LEN 64 #define ZBX_ITEM_SNMPV3_SECURITYNAME_LEN_MAX (ZBX_ITEM_SNMPV3_SECURITYNAME_LEN + 1) #define ZBX_ITEM_SNMPV3_AUTHPASSPHRASE_LEN 64 #define ZBX_ITEM_SNMPV3_AUTHPASSPHRASE_LEN_MAX (ZBX_ITEM_SNMPV3_AUTHPASSPHRASE_LEN + 1) #define ZBX_ITEM_SNMPV3_PRIVPASSPHRASE_LEN 64 #define ZBX_ITEM_SNMPV3_PRIVPASSPHRASE_LEN_MAX (ZBX_ITEM_SNMPV3_PRIVPASSPHRASE_LEN + 1) #define ZBX_ITEM_SNMPV3_CONTEXTNAME_LEN 255 #define ZBX_ITEM_SNMPV3_CONTEXTNAME_LEN_MAX (ZBX_ITEM_SNMPV3_CONTEXTNAME_LEN + 1) #define ZBX_ITEM_LOGTIMEFMT_LEN 64 #define ZBX_ITEM_LOGTIMEFMT_LEN_MAX (ZBX_ITEM_LOGTIMEFMT_LEN + 1) #define ZBX_ITEM_IPMI_SENSOR_LEN 128 #define ZBX_ITEM_IPMI_SENSOR_LEN_MAX (ZBX_ITEM_IPMI_SENSOR_LEN + 1) #define ZBX_ITEM_USERNAME_LEN 255 #define ZBX_ITEM_USERNAME_LEN_MAX (ZBX_ITEM_USERNAME_LEN + 1) #define ZBX_ITEM_PASSWORD_LEN 255 #define ZBX_ITEM_PASSWORD_LEN_MAX (ZBX_ITEM_PASSWORD_LEN + 1) #define ZBX_ITEM_PUBLICKEY_LEN 64 #define ZBX_ITEM_PUBLICKEY_LEN_MAX (ZBX_ITEM_PUBLICKEY_LEN + 1) #define ZBX_ITEM_PRIVATEKEY_LEN 64 #define ZBX_ITEM_PRIVATEKEY_LEN_MAX (ZBX_ITEM_PRIVATEKEY_LEN + 1) #define ZBX_ITEM_JMX_ENDPOINT_LEN 255 #define ZBX_ITEM_JMX_ENDPOINT_LEN_MAX (ZBX_ITEM_JMX_ENDPOINT_LEN + 1) #define ZBX_ITEM_TIMEOUT_LEN 255 #define ZBX_ITEM_TIMEOUT_LEN_MAX (ZBX_ITEM_TIMEOUT_LEN + 1) #define ZBX_ITEM_URL_LEN 2048 #define ZBX_ITEM_URL_LEN_MAX (ZBX_ITEM_URL_LEN + 1) #define ZBX_ITEM_QUERY_FIELDS_LEN 2048 #define ZBX_ITEM_QUERY_FIELDS_LEN_MAX (ZBX_ITEM_QUERY_FIELDS_LEN + 1) #define ZBX_ITEM_STATUS_CODES_LEN 255 #define ZBX_ITEM_STATUS_CODES_LEN_MAX (ZBX_ITEM_STATUS_CODES_LEN + 1) #define ZBX_ITEM_HTTP_PROXY_LEN 255 #define ZBX_ITEM_HTTP_PROXY_LEN_MAX (ZBX_ITEM_HTTP_PROXY_LEN + 1) #define ZBX_ITEM_SSL_KEY_PASSWORD_LEN 64 #define ZBX_ITEM_SSL_KEY_PASSWORD_LEN_MAX (ZBX_ITEM_SSL_KEY_PASSWORD_LEN + 1) #define ZBX_ITEM_SSL_CERT_FILE_LEN 255 #define ZBX_ITEM_SSL_CERT_FILE_LEN_MAX (ZBX_ITEM_SSL_CERT_FILE_LEN + 1) #define ZBX_ITEM_SSL_KEY_FILE_LEN 255 #define ZBX_ITEM_SSL_KEY_FILE_LEN_MAX (ZBX_ITEM_SSL_KEY_FILE_LEN + 1) #define ZBX_ITEM_PREPROC_PARAMS_LEN 65535 #if defined(HAVE_ORACLE) # define ZBX_ITEM_PARAM_LEN 2048 # define ZBX_ITEM_DESCRIPTION_LEN 2048 # define ZBX_ITEM_POSTS_LEN 2048 # define ZBX_ITEM_HEADERS_LEN 2048 #else # define ZBX_ITEM_PARAM_LEN 65535 # define ZBX_ITEM_DESCRIPTION_LEN 65535 # define ZBX_ITEM_POSTS_LEN 65535 # define ZBX_ITEM_HEADERS_LEN 65535 #endif #define ZBX_ITEM_PARAMETER_NAME_LEN 255 #define ZBX_ITEM_PARAMETER_VALUE_LEN 2048 #define ZBX_ITEM_TAG_FIELD_LEN 255 /* common tag/value field lengths for all tags */ #define ZBX_DB_TAG_NAME_LEN 255 #define ZBX_DB_TAG_VALUE_LEN 255 #define ZBX_HISTORY_STR_VALUE_LEN 255 #define ZBX_HISTORY_TEXT_VALUE_LEN 65535 #define ZBX_HISTORY_LOG_VALUE_LEN 65535 /* Binary item type can only be as a dependent item. */ #define ZBX_HISTORY_BIN_VALUE_LEN MAX(ZBX_HISTORY_TEXT_VALUE_LEN, ZBX_HISTORY_LOG_VALUE_LEN) #define ZBX_HISTORY_LOG_SOURCE_LEN 64 #define ZBX_HISTORY_LOG_SOURCE_LEN_MAX (ZBX_HISTORY_LOG_SOURCE_LEN + 1) #define ZBX_GRAPH_NAME_LEN 128 #define ZBX_GRAPH_ITEM_COLOR_LEN 6 #define ZBX_GRAPH_ITEM_COLOR_LEN_MAX (ZBX_GRAPH_ITEM_COLOR_LEN + 1) #define ZBX_DSERVICE_VALUE_LEN 255 #define ZBX_MAX_DISCOVERED_VALUE_SIZE (ZBX_DSERVICE_VALUE_LEN * ZBX_MAX_BYTES_IN_UTF8_CHAR + 1) typedef zbx_uint64_t (*zbx_dc_get_nextid_func_t)(const char *table_name, int num); #ifdef HAVE_ORACLE # define ZBX_PLSQL_BEGIN "begin\n" # define ZBX_PLSQL_END "end;" # define zbx_db_begin_multiple_update(sql, sql_alloc, sql_offset) \ zbx_strcpy_alloc(sql, sql_alloc, sql_offset, ZBX_PLSQL_BEGIN) # define zbx_db_end_multiple_update(sql, sql_alloc, sql_offset) \ zbx_strcpy_alloc(sql, sql_alloc, sql_offset, ZBX_PLSQL_END) # define ZBX_SQL_STRCMP "%s%s%s" # define ZBX_SQL_STRVAL_EQ(str) \ '\0' != *str ? "='" : "", \ '\0' != *str ? str : " is null", \ '\0' != *str ? "'" : "" # define ZBX_SQL_STRVAL_NE(str) \ '\0' != *str ? "<>'" : "", \ '\0' != *str ? str : " is not null", \ '\0' != *str ? "'" : "" #else # define zbx_db_begin_multiple_update(sql, sql_alloc, sql_offset) do {} while (0) # define zbx_db_end_multiple_update(sql, sql_alloc, sql_offset) do {} while (0) # ifdef HAVE_MYSQL # define ZBX_SQL_STRCMP "%s binary '%s'" # else # define ZBX_SQL_STRCMP "%s'%s'" # endif # define ZBX_SQL_STRVAL_EQ(str) "=", str # define ZBX_SQL_STRVAL_NE(str) "<>", str #endif #ifdef HAVE_MYSQL # define ZBX_SQL_CONCAT() "concat(%s,%s)" #else # define ZBX_SQL_CONCAT() "%s||%s" #endif #define ZBX_SQL_NULLCMP(f1, f2) "((" f1 " is null and " f2 " is null) or " f1 "=" f2 ")" #define ZBX_DBROW2UINT64(uint, row) \ do { \ if (SUCCEED == zbx_db_is_null(row)) \ uint = 0; \ else \ zbx_is_uint64(row, &uint); \ } \ while (0) #define ZBX_DB_MAX_ID (zbx_uint64_t)__UINT64_C(0x7fffffffffffffff) #ifdef HAVE_MYSQL # define ZBX_SQL_SORT_ASC(field) field " asc" # define ZBX_SQL_SORT_DESC(field) field " desc" #else # define ZBX_SQL_SORT_ASC(field) field " asc nulls first" # define ZBX_SQL_SORT_DESC(field) field " desc nulls last" #endif typedef struct { zbx_uint64_t druleid; zbx_uint64_t unique_dcheckid; char *iprange; char *name; } zbx_db_drule; typedef struct { zbx_uint64_t dhostid; int status; int lastup; int lastdown; } zbx_db_dhost; typedef struct { zbx_uint64_t triggerid; char *description; char *expression; char *recovery_expression; char *url; char *url_name; char *comments; char *correlation_tag; char *opdata; char *event_name; unsigned char value; unsigned char priority; unsigned char type; unsigned char recovery_mode; unsigned char correlation_mode; /* temporary trigger cache for related data */ void *cache; } zbx_db_trigger; typedef struct { zbx_uint64_t eventid; zbx_db_trigger trigger; zbx_uint64_t objectid; char *name; int source; int object; int clock; int value; int acknowledged; int ns; int severity; unsigned char suppressed; zbx_vector_tags_t tags; #define ZBX_FLAGS_DB_EVENT_UNSET 0x0000 #define ZBX_FLAGS_DB_EVENT_CREATE 0x0001 #define ZBX_FLAGS_DB_EVENT_NO_ACTION 0x0002 #define ZBX_FLAGS_DB_EVENT_RECOVER 0x0004 /* flags to indicate data retrieved from DB, used for cause event macros */ #define ZBX_FLAGS_DB_EVENT_RETRIEVED_CORE 0x0008 #define ZBX_FLAGS_DB_EVENT_RETRIEVED_TAGS 0x0010 #define ZBX_FLAGS_DB_EVENT_RETRIEVED_TRIGGERS 0x0020 zbx_uint64_t flags; } zbx_db_event; ZBX_PTR_VECTOR_DECL(db_event, zbx_db_event *) /* temporary cache of trigger related data */ typedef struct { zbx_uint64_t serviceid; char *name; char *description; zbx_vector_uint64_t eventids; zbx_vector_db_event_t events; zbx_vector_tags_t service_tags; } zbx_db_service; /* media types */ typedef enum { MEDIA_TYPE_EMAIL = 0, MEDIA_TYPE_EXEC, MEDIA_TYPE_SMS, MEDIA_TYPE_WEBHOOK = 4 } zbx_media_type_t; /* alert statuses */ typedef enum { ALERT_STATUS_NOT_SENT = 0, ALERT_STATUS_SENT, ALERT_STATUS_FAILED, ALERT_STATUS_NEW } zbx_alert_status_t; /* escalation statuses */ typedef enum { ESCALATION_STATUS_ACTIVE = 0, ESCALATION_STATUS_RECOVERY, /* only in server code, never in DB, deprecated */ ESCALATION_STATUS_SLEEP, ESCALATION_STATUS_COMPLETED /* only in server code, never in DB */ } zbx_escalation_status_t; /* alert types */ typedef enum { ALERT_TYPE_MESSAGE = 0, ALERT_TYPE_COMMAND } zbx_alert_type_t; typedef enum { ZBX_PROTOTYPE_STATUS_ENABLED, ZBX_PROTOTYPE_STATUS_DISABLED, ZBX_PROTOTYPE_STATUS_COUNT } zbx_prototype_status_t; typedef enum { ZBX_PROTOTYPE_DISCOVER, ZBX_PROTOTYPE_NO_DISCOVER, ZBX_PROTOTYPE_DISCOVER_COUNT } zbx_prototype_discover_t; typedef struct ZBX_DB_MEDIATYPE { zbx_uint64_t mediatypeid; zbx_media_type_t type; char *smtp_server; char *smtp_helo; char *smtp_email; char *exec_path; char *gsm_modem; char *username; char *passwd; char *script; char *attempt_interval; char *timeout; unsigned short smtp_port; unsigned char smtp_security; unsigned char smtp_verify_peer; unsigned char smtp_verify_host; unsigned char smtp_authentication; unsigned char content_type; int maxsessions; int maxattempts; } zbx_db_mediatype; void zbx_db_mediatype_clean(zbx_db_mediatype *mt); void zbx_serialize_mediatype(unsigned char **data, zbx_uint32_t *data_alloc, zbx_uint32_t *data_offset, const zbx_db_mediatype *mt); zbx_uint32_t zbx_deserialize_mediatype(const unsigned char *data, zbx_db_mediatype *mt); typedef struct { zbx_uint64_t alertid; zbx_uint64_t actionid; int clock; zbx_uint64_t mediatypeid; char *sendto; char *subject; char *message; zbx_alert_status_t status; int retries; } zbx_db_alert; typedef struct { zbx_uint64_t housekeeperid; char *tablename; char *field; zbx_uint64_t value; } zbx_db_housekeeper; typedef struct { zbx_uint64_t httptestid; char *name; char *agent; char *http_user; char *http_password; char *http_proxy; char *ssl_cert_file; char *ssl_key_file; char *ssl_key_password; char *delay; int authentication; int retries; int verify_peer; int verify_host; } zbx_db_httptest; typedef struct { zbx_uint64_t httpstepid; zbx_uint64_t httptestid; char *name; char *url; char *posts; char *required; char *status_codes; int no; int timeout; int follow_redirects; int retrieve_mode; int post_type; } zbx_db_httpstep; typedef struct { zbx_uint64_t escalationid; zbx_uint64_t actionid; zbx_uint64_t triggerid; zbx_uint64_t itemid; zbx_uint64_t eventid; zbx_uint64_t r_eventid; zbx_uint64_t acknowledgeid; zbx_uint64_t servicealarmid; zbx_uint64_t serviceid; int nextcheck; int esc_step; zbx_escalation_status_t status; } zbx_db_escalation; typedef struct { zbx_uint64_t actionid; char *name; int esc_period; unsigned char eventsource; unsigned char pause_suppressed; unsigned char pause_symptoms; unsigned char recovery; unsigned char status; unsigned char notify_if_canceled; } zbx_db_action; typedef struct { zbx_uint64_t acknowledgeid; zbx_uint64_t userid; char *message; int clock; int action; int old_severity; int new_severity; int suppress_until; } zbx_db_acknowledge; typedef struct { zbx_uint64_t service_alarmid; int value; int clock; } zbx_service_alarm_t; zbx_config_dbhigh_t *zbx_config_dbhigh_new(void); void zbx_config_dbhigh_free(zbx_config_dbhigh_t *config_dbhigh); void zbx_init_library_dbhigh(const zbx_config_dbhigh_t *config_dbhigh); int zbx_db_init(zbx_dc_get_nextid_func_t cb_nextid, int log_slow_queries, char **error); void zbx_db_deinit(void); void zbx_db_init_autoincrement_options(void); int zbx_db_connect(int flag); void zbx_db_close(void); int zbx_db_validate_config_features(unsigned char program_type, const zbx_config_dbhigh_t *config_dbhigh); #if defined(HAVE_MYSQL) || defined(HAVE_POSTGRESQL) void zbx_db_validate_config(const zbx_config_dbhigh_t *config_dbhigh); #endif #ifdef HAVE_ORACLE void zbx_db_statement_prepare(const char *sql); void zbx_db_table_prepare(const char *tablename, struct zbx_json *json); int zbx_db_check_oracle_colum_type(const char *table_name, const char *column_name, int expected_type); #endif int zbx_db_execute(const char *fmt, ...) __zbx_attr_format_printf(1, 2); int zbx_db_execute_once(const char *fmt, ...) __zbx_attr_format_printf(1, 2); zbx_db_result_t zbx_db_select(const char *fmt, ...) __zbx_attr_format_printf(1, 2); zbx_db_result_t zbx_db_select_n(const char *query, int n); zbx_db_row_t zbx_db_fetch(zbx_db_result_t result); int zbx_db_is_null(const char *field); void zbx_db_begin(void); int zbx_db_commit(void); void zbx_db_rollback(void); int zbx_db_end(int ret); const zbx_db_table_t *zbx_db_get_table(const char *tablename); const zbx_db_field_t *zbx_db_get_field(const zbx_db_table_t *table, const char *fieldname); int zbx_db_validate_field_size(const char *tablename, const char *fieldname, const char *str); #define zbx_db_get_maxid(table) zbx_db_get_maxid_num(table, 1) zbx_uint64_t zbx_db_get_maxid_num(const char *tablename, int num); void zbx_db_extract_version_info(struct zbx_db_version_info_t *version_info); void zbx_db_extract_dbextension_info(struct zbx_db_version_info_t *version_info); void zbx_db_flush_version_requirements(const char *version); #ifdef HAVE_POSTGRESQL int zbx_db_check_tsdb_capabilities(struct zbx_db_version_info_t *db_version_info, int allow_unsupported_ver); char *zbx_db_get_schema_esc(void); #endif /****************************************************************************** * * * Type: ZBX_GRAPH_ITEMS * * * * Purpose: represent graph item data * * * ******************************************************************************/ typedef struct { zbx_uint64_t itemid; /* itemid should come first for correct sorting */ zbx_uint64_t gitemid; char key[ZBX_ITEM_KEY_LEN * ZBX_MAX_BYTES_IN_UTF8_CHAR + 1]; int drawtype; int sortorder; char color[ZBX_GRAPH_ITEM_COLOR_LEN_MAX]; int yaxisside; int calc_fnc; int type; unsigned char flags; } zbx_graph_items; typedef struct { zbx_uint64_t triggerid; unsigned char value; unsigned char state; unsigned char priority; int lastchange; int problem_count; char *error; #define ZBX_FLAGS_TRIGGER_DIFF_UNSET 0x0000 #define ZBX_FLAGS_TRIGGER_DIFF_UPDATE_VALUE 0x0001 #define ZBX_FLAGS_TRIGGER_DIFF_UPDATE_LASTCHANGE 0x0002 #define ZBX_FLAGS_TRIGGER_DIFF_UPDATE_STATE 0x0004 #define ZBX_FLAGS_TRIGGER_DIFF_UPDATE_ERROR 0x0008 #define ZBX_FLAGS_TRIGGER_DIFF_UPDATE \ (ZBX_FLAGS_TRIGGER_DIFF_UPDATE_VALUE | ZBX_FLAGS_TRIGGER_DIFF_UPDATE_LASTCHANGE | \ ZBX_FLAGS_TRIGGER_DIFF_UPDATE_STATE | ZBX_FLAGS_TRIGGER_DIFF_UPDATE_ERROR) #define ZBX_FLAGS_TRIGGER_DIFF_UPDATE_PROBLEM_COUNT 0x1000 #define ZBX_FLAGS_TRIGGER_DIFF_RECALCULATE_PROBLEM_COUNT 0x2000 zbx_uint64_t flags; } zbx_trigger_diff_t; void zbx_db_save_trigger_changes(const zbx_vector_ptr_t *trigger_diff); void zbx_trigger_diff_free(zbx_trigger_diff_t *diff); void zbx_append_trigger_diff(zbx_vector_ptr_t *trigger_diff, zbx_uint64_t triggerid, unsigned char priority, zbx_uint64_t flags, unsigned char value, unsigned char state, int lastchange, const char *error); char *zbx_db_dyn_escape_field(const char *table_name, const char *field_name, const char *src); char *zbx_db_dyn_escape_string(const char *src); char *zbx_db_dyn_escape_string_len(const char *src, size_t length); char *zbx_db_dyn_escape_like_pattern(const char *src); void zbx_db_add_condition_alloc(char **sql, size_t *sql_alloc, size_t *sql_offset, const char *fieldname, const zbx_uint64_t *values, const int num); void zbx_db_add_str_condition_alloc(char **sql, size_t *sql_alloc, size_t *sql_offset, const char *fieldname, const char * const *values, const int num); int zbx_check_user_permissions(const zbx_uint64_t *userid, const zbx_uint64_t *recipient_userid); const char *zbx_host_string(zbx_uint64_t hostid); const char *zbx_host_key_string(zbx_uint64_t itemid); const char *zbx_user_string(zbx_uint64_t userid); typedef struct { zbx_uint64_t connectorid; int tags_evaltype; zbx_vector_match_tags_t connector_tags; } zbx_connector_filter_t; ZBX_PTR_VECTOR_DECL(connector_filter, zbx_connector_filter_t) /* events callbacks */ typedef zbx_db_event *(*zbx_add_event_func_t)(unsigned char source, unsigned char object, zbx_uint64_t objectid, const zbx_timespec_t *timespec, int value, const char *trigger_description, const char *trigger_expression, const char *trigger_recovery_expression, unsigned char trigger_priority, unsigned char trigger_type, const zbx_vector_ptr_t *trigger_tags, unsigned char trigger_correlation_mode, const char *trigger_correlation_tag, unsigned char trigger_value, const char *trigger_opdata, const char *event_name, const char *error); typedef int (*zbx_process_events_func_t)(zbx_vector_ptr_t *trigger_diff, zbx_vector_uint64_t *triggerids_lock); typedef void (*zbx_clean_events_func_t)(void); typedef void (*zbx_reset_event_recovery_func_t)(void); typedef void (*zbx_export_events_func_t)(int events_export_enabled, zbx_vector_connector_filter_t *connector_filters, unsigned char **data, size_t *data_alloc, size_t *data_offset); typedef void (*zbx_events_update_itservices_func_t)(void); typedef struct { zbx_add_event_func_t add_event_cb; zbx_process_events_func_t process_events_cb; zbx_clean_events_func_t clean_events_cb; zbx_reset_event_recovery_func_t reset_event_recovery_cb; zbx_export_events_func_t export_events_cb; zbx_events_update_itservices_func_t events_update_itservices_cb; } zbx_events_funcs_t; /* events callbacks end */ int zbx_db_get_user_names(zbx_uint64_t userid, char **username, char **name, char **surname); int zbx_db_execute_overflowed_sql(char **sql, size_t *sql_alloc, size_t *sql_offset); char *zbx_db_get_unique_hostname_by_sample(const char *host_name_sample, const char *field_name); const char *zbx_db_sql_id_ins(zbx_uint64_t id); const char *zbx_db_sql_id_cmp(zbx_uint64_t id); typedef enum { ZBX_CONN_DEFAULT = 0, ZBX_CONN_IP, ZBX_CONN_DNS, } zbx_conn_flags_t; const char *zbx_db_get_inventory_field(unsigned char inventory_link); int zbx_db_table_exists(const char *table_name); int zbx_db_field_exists(const char *table_name, const char *field_name); #ifndef HAVE_SQLITE3 int zbx_db_trigger_exists(const char *table_name, const char *trigger_name); int zbx_db_index_exists(const char *table_name, const char *index_name); int zbx_db_pk_exists(const char *table_name); #endif int zbx_db_prepare_multiple_query(const char *query, const char *field_name, zbx_vector_uint64_t *ids, char **sql, size_t *sql_alloc, size_t *sql_offset); int zbx_db_execute_multiple_query(const char *query, const char *field_name, zbx_vector_uint64_t *ids); int zbx_db_lock_record(const char *table, zbx_uint64_t id, const char *add_field, zbx_uint64_t add_id); int zbx_db_lock_records(const char *table, const zbx_vector_uint64_t *ids); int zbx_db_lock_ids(const char *table_name, const char *field_name, zbx_vector_uint64_t *ids); #define zbx_db_lock_hostid(id) zbx_db_lock_record("hosts", id, NULL, 0) #define zbx_db_lock_triggerid(id) zbx_db_lock_record("triggers", id, NULL, 0) #define zbx_db_lock_druleid(id) zbx_db_lock_record("drules", id, NULL, 0) #define zbx_db_lock_dcheckid(dcheckid, druleid) zbx_db_lock_record("dchecks", dcheckid, "druleid", druleid) #define zbx_db_lock_graphid(id) zbx_db_lock_record("graphs", id, NULL, 0) #define zbx_db_lock_hostids(ids) zbx_db_lock_records("hosts", ids) #define zbx_db_lock_triggerids(ids) zbx_db_lock_records("triggers", ids) #define zbx_db_lock_itemids(ids) zbx_db_lock_records("items", ids) #define zbx_db_lock_group_prototypeids(ids) zbx_db_lock_records("group_prototype", ids) void zbx_db_select_uint64(const char *sql, zbx_vector_uint64_t *ids); void zbx_db_check_character_set(void); /* bulk insert support */ /* database bulk insert data */ typedef struct { /* the target table */ const zbx_db_table_t *table; /* the fields to insert (pointers to the zbx_db_field_t structures from database schema) */ zbx_vector_ptr_t fields; /* the values rows to insert (pointers to arrays of zbx_db_value_t structures) */ zbx_vector_ptr_t rows; /* index of autoincrement field */ int autoincrement; /* the last id assigned by autoincrement */ zbx_uint64_t lastid; } zbx_db_insert_t; void zbx_db_insert_prepare_dyn(zbx_db_insert_t *self, const zbx_db_table_t *table, const zbx_db_field_t **fields, int fields_num); void zbx_db_insert_prepare(zbx_db_insert_t *self, const char *table, ...); void zbx_db_insert_add_values_dyn(zbx_db_insert_t *self, zbx_db_value_t **values, int values_num); void zbx_db_insert_add_values(zbx_db_insert_t *self, ...); int zbx_db_insert_execute(zbx_db_insert_t *self); void zbx_db_insert_clean(zbx_db_insert_t *self); void zbx_db_insert_autoincrement(zbx_db_insert_t *self, const char *field_name); zbx_uint64_t zbx_db_insert_get_lastid(zbx_db_insert_t *self); int zbx_db_get_database_type(void); typedef struct { zbx_uint64_t eventid; int clock; int ns; int value; int severity; zbx_vector_ptr_t tags; } zbx_event_t; int zbx_db_get_user_by_active_session(const char *sessionid, zbx_user_t *user); int zbx_db_get_user_by_auth_token(const char *formatted_auth_token_hash, zbx_user_t *user); void zbx_user_init(zbx_user_t *user); void zbx_user_free(zbx_user_t *user); typedef struct { zbx_uint64_t itemid; zbx_uint64_t lastlogsize; unsigned char state; int mtime; const char *error; zbx_uint64_t flags; #define ZBX_FLAGS_ITEM_DIFF_UNSET __UINT64_C(0x0000) #define ZBX_FLAGS_ITEM_DIFF_UPDATE_STATE __UINT64_C(0x0001) #define ZBX_FLAGS_ITEM_DIFF_UPDATE_ERROR __UINT64_C(0x0002) #define ZBX_FLAGS_ITEM_DIFF_UPDATE_MTIME __UINT64_C(0x0004) #define ZBX_FLAGS_ITEM_DIFF_UPDATE_LASTLOGSIZE __UINT64_C(0x0008) #define ZBX_FLAGS_ITEM_DIFF_UPDATE_DB \ (ZBX_FLAGS_ITEM_DIFF_UPDATE_STATE | ZBX_FLAGS_ITEM_DIFF_UPDATE_ERROR |\ ZBX_FLAGS_ITEM_DIFF_UPDATE_MTIME | ZBX_FLAGS_ITEM_DIFF_UPDATE_LASTLOGSIZE) } zbx_item_diff_t; typedef struct { zbx_uint64_t hostid; unsigned char compress; char *version_str; int version_int; zbx_proxy_compatibility_t compatibility; time_t lastaccess; time_t last_version_error_time; int proxy_delay; int more_data; zbx_proxy_suppress_t nodata_win; #define ZBX_FLAGS_PROXY_DIFF_UNSET __UINT64_C(0x0000) #define ZBX_FLAGS_PROXY_DIFF_UPDATE_VERSION __UINT64_C(0x0002) #define ZBX_FLAGS_PROXY_DIFF_UPDATE_LASTACCESS __UINT64_C(0x0004) #define ZBX_FLAGS_PROXY_DIFF_UPDATE_LASTERROR __UINT64_C(0x0008) #define ZBX_FLAGS_PROXY_DIFF_UPDATE_PROXYDELAY __UINT64_C(0x0010) #define ZBX_FLAGS_PROXY_DIFF_UPDATE_SUPPRESS_WIN __UINT64_C(0x0020) #define ZBX_FLAGS_PROXY_DIFF_UPDATE_CONFIG __UINT64_C(0x0080) #define ZBX_FLAGS_PROXY_DIFF_UPDATE ( \ ZBX_FLAGS_PROXY_DIFF_UPDATE_VERSION | \ ZBX_FLAGS_PROXY_DIFF_UPDATE_LASTACCESS) zbx_uint64_t flags; } zbx_proxy_diff_t; int zbx_db_lock_maintenanceids(zbx_vector_uint64_t *maintenanceids); void zbx_db_save_item_changes(char **sql, size_t *sql_alloc, size_t *sql_offset, const zbx_vector_ptr_t *item_diff, zbx_uint64_t mask); int zbx_db_check_instanceid(void); /* tags */ typedef struct { zbx_uint64_t tagid; char *tag_orig; char *tag; char *value_orig; char *value; int automatic; int automatic_orig; #define ZBX_FLAG_DB_TAG_UNSET __UINT64_C(0x00000000) #define ZBX_FLAG_DB_TAG_UPDATE_AUTOMATIC __UINT64_C(0x00000001) #define ZBX_FLAG_DB_TAG_UPDATE_VALUE __UINT64_C(0x00000002) #define ZBX_FLAG_DB_TAG_UPDATE_TAG __UINT64_C(0x00000004) #define ZBX_FLAG_DB_TAG_REMOVE __UINT64_C(0x80000000) #define ZBX_FLAG_DB_TAG_UPDATE (ZBX_FLAG_DB_TAG_UPDATE_TAG | ZBX_FLAG_DB_TAG_UPDATE_VALUE| \ ZBX_FLAG_DB_TAG_UPDATE_AUTOMATIC) zbx_uint64_t flags; } zbx_db_tag_t; ZBX_PTR_VECTOR_DECL(db_tag_ptr, zbx_db_tag_t *) #define ZBX_DB_TAG_NORMAL 0 #define ZBX_DB_TAG_AUTOMATIC 1 zbx_db_tag_t *zbx_db_tag_create(const char *tag_tag, const char *tag_value); void zbx_db_tag_free(zbx_db_tag_t *tag); typedef struct _zbx_item_param_t zbx_item_param_t; struct _zbx_item_param_t { zbx_uint64_t item_parameterid; #define ZBX_FLAG_ITEM_PARAM_UPDATE_RESET __UINT64_C(0x000000000000) #define ZBX_FLAG_ITEM_PARAM_UPDATE_NAME __UINT64_C(0x000000000001) #define ZBX_FLAG_ITEM_PARAM_UPDATE_VALUE __UINT64_C(0x000000000002) #define ZBX_FLAG_ITEM_PARAM_UPDATE \ (ZBX_FLAG_ITEM_PARAM_UPDATE_NAME | \ ZBX_FLAG_ITEM_PARAM_UPDATE_VALUE \ ) #define ZBX_FLAG_ITEM_PARAM_DELETE __UINT64_C(0x000000010000) zbx_uint64_t flags; char *name_orig; char *name; char *value_orig; char *value; }; ZBX_PTR_VECTOR_DECL(item_param_ptr, zbx_item_param_t *) zbx_item_param_t *zbx_item_param_create(const char *item_param_name, const char *item_param_value); void zbx_item_param_free(zbx_item_param_t *param); int zbx_merge_tags(zbx_vector_db_tag_ptr_t *dst, zbx_vector_db_tag_ptr_t *src, const char *owner, char **error); int zbx_merge_item_params(zbx_vector_item_param_ptr_t *dst, zbx_vector_item_param_ptr_t *src, char **error); void zbx_add_tags(zbx_vector_db_tag_ptr_t *hosttags, zbx_vector_db_tag_ptr_t *addtags); void zbx_del_tags(zbx_vector_db_tag_ptr_t *hosttags, zbx_vector_db_tag_ptr_t *deltags); typedef enum { ZBX_LLD_OVERRIDE_OP_OBJECT_ITEM = 0, ZBX_LLD_OVERRIDE_OP_OBJECT_TRIGGER, ZBX_LLD_OVERRIDE_OP_OBJECT_GRAPH, ZBX_LLD_OVERRIDE_OP_OBJECT_HOST } zbx_lld_override_op_object_t; typedef struct { zbx_uint64_t override_operationid; zbx_uint64_t overrideid; char *value; char *delay; char *history; char *trends; zbx_vector_db_tag_ptr_t tags; zbx_vector_uint64_t templateids; unsigned char operationtype; unsigned char operator; unsigned char status; unsigned char severity; signed char inventory_mode; unsigned char discover; } zbx_lld_override_operation_t; ZBX_PTR_VECTOR_DECL(lld_override_operation, zbx_lld_override_operation_t*) void zbx_lld_override_operation_free(zbx_lld_override_operation_t *override_operation); void zbx_load_lld_override_operations(const zbx_vector_uint64_t *overrideids, char **sql, size_t *sql_alloc, zbx_vector_lld_override_operation_t *ops); #define ZBX_TIMEZONE_DEFAULT_VALUE "default" int zbx_db_check_version_info(struct zbx_db_version_info_t *info, int allow_unsupported, unsigned char program_type); void zbx_db_version_info_clear(struct zbx_db_version_info_t *version_info); #define ZBX_MAX_HRECORDS 1000 #define ZBX_MAX_HRECORDS_TOTAL 10000 #define ZBX_PROXY_DATA_DONE 0 #define ZBX_PROXY_DATA_MORE 1 void zbx_calc_timestamp(const char *line, int *timestamp, const char *format); char *zbx_get_proxy_protocol_version_str(const struct zbx_json_parse *jp); int zbx_get_proxy_protocol_version_int(const char *version_str); /* condition evaluation types */ #define ZBX_CONDITION_EVAL_TYPE_AND_OR 0 #define ZBX_CONDITION_EVAL_TYPE_AND 1 #define ZBX_CONDITION_EVAL_TYPE_OR 2 #define ZBX_CONDITION_EVAL_TYPE_EXPRESSION 3 /* condition types */ #define ZBX_CONDITION_TYPE_HOST_GROUP 0 #define ZBX_CONDITION_TYPE_HOST 1 #define ZBX_CONDITION_TYPE_TRIGGER 2 #define ZBX_CONDITION_TYPE_TRIGGER_NAME 3 #define ZBX_CONDITION_TYPE_TRIGGER_SEVERITY 4 /* #define ZBX_CONDITION_TYPE_TRIGGER_VALUE 5 deprecated */ #define ZBX_CONDITION_TYPE_TIME_PERIOD 6 #define ZBX_CONDITION_TYPE_DHOST_IP 7 #define ZBX_CONDITION_TYPE_DSERVICE_TYPE 8 #define ZBX_CONDITION_TYPE_DSERVICE_PORT 9 #define ZBX_CONDITION_TYPE_DSTATUS 10 #define ZBX_CONDITION_TYPE_DUPTIME 11 #define ZBX_CONDITION_TYPE_DVALUE 12 #define ZBX_CONDITION_TYPE_HOST_TEMPLATE 13 #define ZBX_CONDITION_TYPE_EVENT_ACKNOWLEDGED 14 /* #define ZBX_CONDITION_TYPE_APPLICATION 15 deprecated */ #define ZBX_CONDITION_TYPE_SUPPRESSED 16 #define ZBX_CONDITION_TYPE_DRULE 18 #define ZBX_CONDITION_TYPE_DCHECK 19 #define ZBX_CONDITION_TYPE_PROXY 20 #define ZBX_CONDITION_TYPE_DOBJECT 21 #define ZBX_CONDITION_TYPE_HOST_NAME 22 #define ZBX_CONDITION_TYPE_EVENT_TYPE 23 #define ZBX_CONDITION_TYPE_HOST_METADATA 24 #define ZBX_CONDITION_TYPE_EVENT_TAG 25 #define ZBX_CONDITION_TYPE_EVENT_TAG_VALUE 26 #define ZBX_CONDITION_TYPE_SERVICE 27 #define ZBX_CONDITION_TYPE_SERVICE_NAME 28 typedef struct { zbx_uint64_t autoreg_hostid; zbx_uint64_t hostid; char *host; char *ip; char *dns; char *host_metadata; int now; unsigned short port; unsigned short flag; unsigned int connection_type; } zbx_autoreg_host_t; #define PROXY_OPERATING_MODE_ACTIVE 0 #define PROXY_OPERATING_MODE_PASSIVE 1 #endif