/* ** 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. **/ #include "get_host_from_event.h" #include "zbxnum.h" #include "log.h" #include "zbx_host_constants.h" #ifdef HAVE_OPENIPMI # define ZBX_IPMI_FIELDS_NUM 4 /* number of selected IPMI-related fields in function */ /* get_host_from_event() */ #else # define ZBX_IPMI_FIELDS_NUM 0 #endif int get_host_from_event(const zbx_db_event *event, DC_HOST *host, char *error, size_t max_error_len) { DB_RESULT result; DB_ROW row; char sql[512]; /* do not forget to adjust size if SQLs change */ size_t offset; int ret = SUCCEED; zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __func__); offset = zbx_snprintf(sql, sizeof(sql), "select distinct h.hostid,h.proxy_hostid,h.host,h.tls_connect"); #ifdef HAVE_OPENIPMI offset += zbx_snprintf(sql + offset, sizeof(sql) - offset, /* do not forget to update ZBX_IPMI_FIELDS_NUM if number of selected IPMI fields changes */ ",h.ipmi_authtype,h.ipmi_privilege,h.ipmi_username,h.ipmi_password"); #endif #if defined(HAVE_GNUTLS) || defined(HAVE_OPENSSL) offset += zbx_snprintf(sql + offset, sizeof(sql) - offset, ",h.tls_issuer,h.tls_subject,h.tls_psk_identity,h.tls_psk"); #endif switch (event->source) { case EVENT_SOURCE_TRIGGERS: zbx_snprintf(sql + offset, sizeof(sql) - offset, " from functions f,items i,hosts h" " where f.itemid=i.itemid" " and i.hostid=h.hostid" " and h.status=%d" " and f.triggerid=" ZBX_FS_UI64, HOST_STATUS_MONITORED, event->objectid); break; case EVENT_SOURCE_DISCOVERY: offset += zbx_snprintf(sql + offset, sizeof(sql) - offset, " from hosts h,interface i,dservices ds" " where h.hostid=i.hostid" " and i.ip=ds.ip" " and i.useip=1" " and h.status=%d", HOST_STATUS_MONITORED); switch (event->object) { case EVENT_OBJECT_DHOST: zbx_snprintf(sql + offset, sizeof(sql) - offset, " and ds.dhostid=" ZBX_FS_UI64, event->objectid); break; case EVENT_OBJECT_DSERVICE: zbx_snprintf(sql + offset, sizeof(sql) - offset, " and ds.dserviceid=" ZBX_FS_UI64, event->objectid); break; } break; case EVENT_SOURCE_AUTOREGISTRATION: zbx_snprintf(sql + offset, sizeof(sql) - offset, " from autoreg_host a,hosts h" " where " ZBX_SQL_NULLCMP("a.proxy_hostid", "h.proxy_hostid") " and a.host=h.host" " and h.status=%d" " and h.flags<>%d" " and a.autoreg_hostid=" ZBX_FS_UI64, HOST_STATUS_MONITORED, ZBX_FLAG_DISCOVERY_PROTOTYPE, event->objectid); break; default: zbx_snprintf(error, max_error_len, "Unsupported event source [%d]", event->source); return FAIL; } host->hostid = 0; result = zbx_db_select("%s", sql); while (NULL != (row = zbx_db_fetch(result))) { if (0 != host->hostid) { switch (event->source) { case EVENT_SOURCE_TRIGGERS: zbx_strlcpy(error, "Too many hosts in a trigger expression", max_error_len); break; case EVENT_SOURCE_DISCOVERY: zbx_strlcpy(error, "Too many hosts with same IP addresses", max_error_len); break; } ret = FAIL; break; } ZBX_STR2UINT64(host->hostid, row[0]); ZBX_DBROW2UINT64(host->proxy_hostid, row[1]); zbx_strscpy(host->host, row[2]); ZBX_STR2UCHAR(host->tls_connect, row[3]); #ifdef HAVE_OPENIPMI host->ipmi_authtype = (signed char)atoi(row[4]); host->ipmi_privilege = (unsigned char)atoi(row[5]); zbx_strscpy(host->ipmi_username, row[6]); zbx_strscpy(host->ipmi_password, row[7]); #endif #if defined(HAVE_GNUTLS) || defined(HAVE_OPENSSL) zbx_strscpy(host->tls_issuer, row[4 + ZBX_IPMI_FIELDS_NUM]); zbx_strscpy(host->tls_subject, row[5 + ZBX_IPMI_FIELDS_NUM]); zbx_strscpy(host->tls_psk_identity, row[6 + ZBX_IPMI_FIELDS_NUM]); zbx_strscpy(host->tls_psk, row[7 + ZBX_IPMI_FIELDS_NUM]); #endif } zbx_db_free_result(result); if (FAIL == ret) { host->hostid = 0; *host->host = '\0'; } else if (0 == host->hostid) { *host->host = '\0'; zbx_strlcpy(error, "Cannot find a corresponding host", max_error_len); ret = FAIL; } zabbix_log(LOG_LEVEL_DEBUG, "End of %s():%s", __func__, zbx_result_string(ret)); return ret; } #undef ZBX_IPMI_FIELDS_NUM