static void disable_host(DB_ITEM *item, time_t now, char *error) { assert(item); switch (zbx_process) { case ZBX_PROCESS_SERVER: DBupdate_host_availability(item, HOST_AVAILABLE_FALSE, now, error); update_key_status(item->hostid, HOST_AVAILABLE_FALSE, now); /* 2 */ break; case ZBX_PROCESS_PROXY: DBproxy_update_host_availability(item, HOST_AVAILABLE_FALSE, now); break; } }
static void enable_host(DB_ITEM *item, time_t now) { assert(item); switch (zbx_process) { case ZBX_PROCESS_SERVER: DBupdate_host_availability(item, HOST_AVAILABLE_TRUE, now, NULL); update_key_status(item->hostid, HOST_STATUS_MONITORED, now); /* 0 */ break; case ZBX_PROCESS_PROXY: DBproxy_update_host_availability(item, HOST_AVAILABLE_TRUE, now); break; } }
static void deactivate_host(DC_ITEM *item, int now, const char *error) { char sql[MAX_STRING_LEN], *error_esc, error_msg[MAX_STRING_LEN]; int offset = 0, *errors_from, *disable_until; unsigned char *available; const char *fld_errors_from, *fld_available, *fld_disable_until, *fld_error, *type; switch (item->type) { case ITEM_TYPE_ZABBIX: errors_from = &item->host.errors_from; available = &item->host.available; disable_until = &item->host.disable_until; fld_errors_from = "errors_from"; fld_available = "available"; fld_disable_until = "disable_until"; fld_error = "error"; type = "Zabbix"; break; case ITEM_TYPE_SNMPv1: case ITEM_TYPE_SNMPv2c: case ITEM_TYPE_SNMPv3: errors_from = &item->host.snmp_errors_from; available = &item->host.snmp_available; disable_until = &item->host.snmp_disable_until; fld_errors_from = "snmp_errors_from"; fld_available = "snmp_available"; fld_disable_until = "snmp_disable_until"; fld_error = "snmp_error"; type = "SNMP"; break; case ITEM_TYPE_IPMI: errors_from = &item->host.ipmi_errors_from; available = &item->host.ipmi_available; disable_until = &item->host.ipmi_disable_until; fld_errors_from = "ipmi_errors_from"; fld_available = "ipmi_available"; fld_disable_until = "ipmi_disable_until"; fld_error = "ipmi_error"; type = "IPMI"; break; default: return; } if (SUCCEED != DCconfig_deactivate_host(item, now)) return; DBbegin(); *error_msg = '\0'; offset += zbx_snprintf(sql + offset, sizeof(sql) - offset, "update hosts set "); /* First error */ if (0 == *errors_from) { zbx_snprintf(error_msg, sizeof(error_msg), "%s Host [%s]: first network error, wait for %d seconds", type, item->host.host, CONFIG_UNREACHABLE_DELAY); *errors_from = now; *disable_until = now + CONFIG_UNREACHABLE_DELAY; offset += zbx_snprintf(sql + offset, sizeof(sql) - offset, "%s=%d,", fld_errors_from, *errors_from); } else { if (now - *errors_from <= CONFIG_UNREACHABLE_PERIOD) { /* Still unavailable, but won't change status to UNAVAILABLE yet */ zbx_snprintf(error_msg, sizeof(error_msg), "%s Host [%s]: another network error, wait for %d seconds", type, item->host.host, CONFIG_UNREACHABLE_DELAY); *disable_until = now + CONFIG_UNREACHABLE_DELAY; } else { *disable_until = now + CONFIG_UNAVAILABLE_DELAY; if (HOST_AVAILABLE_FALSE != *available) { zbx_snprintf(error_msg, sizeof(error_msg), "Disabling %s host [%s]", type, item->host.host); *available = HOST_AVAILABLE_FALSE; offset += zbx_snprintf(sql + offset, sizeof(sql) - offset, "%s=%d,", fld_available, *available); if (available == &item->host.available) update_key_status(item->host.hostid, HOST_AVAILABLE_FALSE, now); /* 2 */ update_triggers_status_to_unknown(item->host.hostid, item->type, now, "Agent is unavailable."); } error_esc = DBdyn_escape_string_len(error, HOST_ERROR_LEN); offset += zbx_snprintf(sql + offset, sizeof(sql) - offset, "%s='%s',", fld_error, error_esc); zbx_free(error_esc); } } offset += zbx_snprintf(sql + offset, sizeof(sql) - offset, "%s=%d where hostid=" ZBX_FS_UI64, fld_disable_until, *disable_until, item->host.hostid); DBexecute("%s", sql); DBcommit(); if ('\0' != *error_msg) { zabbix_log(LOG_LEVEL_WARNING, "%s", error_msg); zabbix_syslog("%s", error_msg); } }
static void activate_host(DC_ITEM *item, int now) { char sql[MAX_STRING_LEN], error_msg[MAX_STRING_LEN]; int offset = 0, *errors_from, *disable_until; unsigned char *available; const char *fld_errors_from, *fld_available, *fld_disable_until, *fld_error, *type; switch (item->type) { case ITEM_TYPE_ZABBIX: errors_from = &item->host.errors_from; available = &item->host.available; disable_until = &item->host.disable_until; fld_errors_from = "errors_from"; fld_available = "available"; fld_disable_until = "disable_until"; fld_error = "error"; type = "Zabbix"; break; case ITEM_TYPE_SNMPv1: case ITEM_TYPE_SNMPv2c: case ITEM_TYPE_SNMPv3: errors_from = &item->host.snmp_errors_from; available = &item->host.snmp_available; disable_until = &item->host.snmp_disable_until; fld_errors_from = "snmp_errors_from"; fld_available = "snmp_available"; fld_disable_until = "snmp_disable_until"; fld_error = "snmp_error"; type = "SNMP"; break; case ITEM_TYPE_IPMI: errors_from = &item->host.ipmi_errors_from; available = &item->host.ipmi_available; disable_until = &item->host.ipmi_disable_until; fld_errors_from = "ipmi_errors_from"; fld_available = "ipmi_available"; fld_disable_until = "ipmi_disable_until"; fld_error = "ipmi_error"; type = "IPMI"; break; default: return; } if (0 == *errors_from && HOST_AVAILABLE_TRUE == *available) return; if (SUCCEED != DCconfig_activate_host(item)) return; offset += zbx_snprintf(sql + offset, sizeof(sql) - offset, "update hosts set "); if (HOST_AVAILABLE_TRUE != *available) { zbx_snprintf(error_msg, sizeof(error_msg), "Enabling %s host [%s]", type, item->host.host); zabbix_log(LOG_LEVEL_WARNING, "%s", error_msg); zabbix_syslog("%s", error_msg); *available = HOST_AVAILABLE_TRUE; offset += zbx_snprintf(sql + offset, sizeof(sql) - offset, "%s=%d,", fld_available, *available); if (available == &item->host.available) update_key_status(item->host.hostid, HOST_STATUS_MONITORED, now); /* 0 */ } *errors_from = 0; *disable_until = 0; offset += zbx_snprintf(sql + offset, sizeof(sql) - offset, "%s=%d,%s=%d,%s='' where hostid=" ZBX_FS_UI64, fld_errors_from, *errors_from, fld_disable_until, *disable_until, fld_error, item->host.hostid); DBbegin(); DBexecute("%s", sql); DBcommit(); }