/****************************************************************************** * * * Function: lld_validate_trigger_field * * * ******************************************************************************/ static void lld_validate_trigger_field(zbx_lld_trigger_t *trigger, char **field, char **field_orig, zbx_uint64_t flag, size_t field_len, char **error) { if (0 == (trigger->flags & ZBX_FLAG_LLD_TRIGGER_DISCOVERED)) return; /* only new triggers or triggers with changed data will be validated */ if (0 != trigger->triggerid && 0 == (trigger->flags & flag)) return; if (SUCCEED != zbx_is_utf8(*field)) { zbx_replace_invalid_utf8(*field); *error = zbx_strdcatf(*error, "Cannot %s trigger: value \"%s\" has invalid UTF-8 sequence.\n", (0 != trigger->triggerid ? "update" : "create"), *field); } else if (zbx_strlen_utf8(*field) > field_len) { *error = zbx_strdcatf(*error, "Cannot %s trigger: value \"%s\" is too long.\n", (0 != trigger->triggerid ? "update" : "create"), *field); } else return; if (0 != trigger->triggerid) lld_field_str_rollback(field, field_orig, &trigger->flags, flag); else trigger->flags &= ~ZBX_FLAG_LLD_TRIGGER_DISCOVERED; }
/****************************************************************************** * * * Function: lld_validate_graph_field * * * ******************************************************************************/ static void lld_validate_graph_field(zbx_lld_graph_t *graph, char **field, char **field_orig, zbx_uint64_t flag, size_t field_len, char **error) { if (0 == (graph->flags & ZBX_FLAG_LLD_GRAPH_DISCOVERED)) return; /* only new graphs or graphs with changed data will be validated */ if (0 != graph->graphid && 0 == (graph->flags & flag)) return; if (SUCCEED != zbx_is_utf8(*field)) { zbx_replace_invalid_utf8(*field); *error = zbx_strdcatf(*error, "Cannot %s graph: value \"%s\" has invalid UTF-8 sequence.\n", (0 != graph->graphid ? "update" : "create"), *field); } else if (zbx_strlen_utf8(*field) > field_len) { *error = zbx_strdcatf(*error, "Cannot %s graph: value \"%s\" is too long.\n", (0 != graph->graphid ? "update" : "create"), *field); } else return; if (0 != graph->graphid) lld_field_str_rollback(field, field_orig, &graph->flags, flag); else graph->flags &= ~ZBX_FLAG_LLD_GRAPH_DISCOVERED; }
/****************************************************************************** * * * Function: refresh_active_checks * * * * Purpose: Retrieve from Zabbix server list of active checks * * * * Parameters: host - IP or Hostname of Zabbix server * * port - port of Zabbix server * * * * Return value: returns SUCCEED on successful parsing, * * FAIL on other cases * * * * Author: Eugene Grigorjev, Alexei Vladishev (new json protocol) * * * * Comments: * * * ******************************************************************************/ static int refresh_active_checks(const char *host, unsigned short port) { const char *__function_name = "refresh_active_checks"; zbx_sock_t s; char *buf; int ret; struct zbx_json json; static int last_ret = SUCCEED; zabbix_log(LOG_LEVEL_DEBUG, "In %s() host:'%s' port:%hu", __function_name, host, port); zbx_json_init(&json, ZBX_JSON_STAT_BUF_LEN); zbx_json_addstring(&json, ZBX_PROTO_TAG_REQUEST, ZBX_PROTO_VALUE_GET_ACTIVE_CHECKS, ZBX_JSON_TYPE_STRING); zbx_json_addstring(&json, ZBX_PROTO_TAG_HOST, CONFIG_HOSTNAME, ZBX_JSON_TYPE_STRING); if (NULL != CONFIG_HOST_METADATA) { zbx_json_addstring(&json, ZBX_PROTO_TAG_HOST_METADATA, CONFIG_HOST_METADATA, ZBX_JSON_TYPE_STRING); } else if (NULL != CONFIG_HOST_METADATA_ITEM) { char **value; AGENT_RESULT result; init_result(&result); if (SUCCEED == process(CONFIG_HOST_METADATA_ITEM, PROCESS_LOCAL_COMMAND, &result) && NULL != (value = GET_STR_RESULT(&result)) && NULL != *value) { if (SUCCEED != zbx_is_utf8(*value)) { zabbix_log(LOG_LEVEL_WARNING, "cannot get host metadata using \"%s\" item specified by" " \"HostMetadataItem\" configuration parameter: returned value is not" " an UTF-8 string", CONFIG_HOST_METADATA_ITEM); } else { if (HOST_METADATA_LEN < zbx_strlen_utf8(*value)) { size_t bytes; zabbix_log(LOG_LEVEL_WARNING, "the returned value of \"%s\" item specified by" " \"HostMetadataItem\" configuration parameter is too long," " using first %d characters", CONFIG_HOST_METADATA_ITEM, HOST_METADATA_LEN); bytes = zbx_strlen_utf8_n(*value, HOST_METADATA_LEN); (*value)[bytes] = '\0'; } zbx_json_addstring(&json, ZBX_PROTO_TAG_HOST_METADATA, *value, ZBX_JSON_TYPE_STRING); } } else zabbix_log(LOG_LEVEL_WARNING, "cannot get host metadata using \"%s\" item specified by" " \"HostMetadataItem\" configuration parameter", CONFIG_HOST_METADATA_ITEM); free_result(&result); } if (NULL != CONFIG_LISTEN_IP) { char *p; if (NULL != (p = strchr(CONFIG_LISTEN_IP, ','))) *p = '\0'; zbx_json_addstring(&json, ZBX_PROTO_TAG_IP, CONFIG_LISTEN_IP, ZBX_JSON_TYPE_STRING); if (NULL != p) *p = ','; } if (ZBX_DEFAULT_AGENT_PORT != CONFIG_LISTEN_PORT) zbx_json_adduint64(&json, ZBX_PROTO_TAG_PORT, CONFIG_LISTEN_PORT); if (SUCCEED == (ret = zbx_tcp_connect(&s, CONFIG_SOURCE_IP, host, port, CONFIG_TIMEOUT))) { zabbix_log(LOG_LEVEL_DEBUG, "sending [%s]", json.buffer); if (SUCCEED == (ret = zbx_tcp_send(&s, json.buffer))) { zabbix_log(LOG_LEVEL_DEBUG, "before read"); if (SUCCEED == (ret = SUCCEED_OR_FAIL(zbx_tcp_recv_ext(&s, &buf, ZBX_TCP_READ_UNTIL_CLOSE, 0)))) { zabbix_log(LOG_LEVEL_DEBUG, "got [%s]", buf); if (SUCCEED != last_ret) { zabbix_log(LOG_LEVEL_WARNING, "active check configuration update from [%s:%hu]" " is working again", host, port); } parse_list_of_checks(buf, host, port); } } zbx_tcp_close(&s); } if (SUCCEED != ret && SUCCEED == last_ret) { zabbix_log(LOG_LEVEL_WARNING, "active check configuration update from [%s:%hu] started to fail (%s)", host, port, zbx_tcp_strerror()); } last_ret = ret; zbx_json_free(&json); zabbix_log(LOG_LEVEL_DEBUG, "End of %s():%s", __function_name, zbx_result_string(ret)); return ret; }