/****************************************************************************** * * * Function: execute_script * * * * Purpose: executing command * * * * Return value: SUCCEED - processed successfully * * FAIL - an error occurred * * * ******************************************************************************/ static int execute_script(zbx_uint64_t scriptid, zbx_uint64_t hostid, char **result) { const char *__function_name = "execute_script"; char error[MAX_STRING_LEN]; int ret = FAIL, rc; DC_HOST host; DB_RESULT db_result; DB_ROW db_row; zbx_script_t script; zabbix_log(LOG_LEVEL_DEBUG, "In %s() scriptid:" ZBX_FS_UI64 " hostid:" ZBX_FS_UI64, __function_name, scriptid, hostid); *error = '\0'; if (SUCCEED != (rc = DCget_host_by_hostid(&host, hostid))) { /* let's try to get a host from a database (the host can be disabled) */ db_result = DBselect("select host,name from hosts where hostid=" ZBX_FS_UI64, hostid); if (NULL != (db_row = DBfetch(db_result))) { memset(&host, 0, sizeof(host)); host.hostid = hostid; strscpy(host.host, db_row[0]); strscpy(host.name, db_row[1]); rc = SUCCEED; } DBfree_result(db_result); } if (SUCCEED != rc) { zbx_snprintf(error, sizeof(error), "Unknown Host ID [" ZBX_FS_UI64 "].", hostid); goto fail; } zbx_script_init(&script); script.type = ZBX_SCRIPT_TYPE_GLOBAL_SCRIPT; script.scriptid = scriptid; ret = zbx_execute_script(&host, &script, result, error, sizeof(error)); zbx_script_clean(&script); fail: if (SUCCEED != ret) { if (0 != CONFIG_NODEID) *result = zbx_dsprintf(*result, "NODE %d: %s", CONFIG_NODEID, error); else *result = zbx_strdup(*result, error); } zabbix_log(LOG_LEVEL_DEBUG, "End of %s():%s", __function_name, zbx_result_string(ret)); return ret; }
static void execute_commands(DB_EVENT *event, zbx_uint64_t actionid, zbx_uint64_t operationid, int esc_step) { const char *__function_name = "execute_commands"; DB_RESULT result; DB_ROW row; zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __function_name); result = DBselect( "select distinct h.hostid,h.host,o.type,o.scriptid,o.execute_on,o.port" ",o.authtype,o.username,o.password,o.publickey,o.privatekey,o.command" #ifdef HAVE_OPENIPMI ",h.ipmi_authtype,h.ipmi_privilege,h.ipmi_username,h.ipmi_password" #endif " from opcommand o,opcommand_grp og,hosts_groups hg,hosts h" " where o.operationid=og.operationid" " and og.groupid=hg.groupid" " and hg.hostid=h.hostid" " and o.operationid=" ZBX_FS_UI64 " and h.status=%d" " union " "select distinct h.hostid,h.host,o.type,o.scriptid,o.execute_on,o.port" ",o.authtype,o.username,o.password,o.publickey,o.privatekey,o.command" #ifdef HAVE_OPENIPMI ",h.ipmi_authtype,h.ipmi_privilege,h.ipmi_username,h.ipmi_password" #endif " from opcommand o,opcommand_hst oh,hosts h" " where o.operationid=oh.operationid" " and oh.hostid=h.hostid" " and o.operationid=" ZBX_FS_UI64 " and h.status=%d" " union " "select distinct 0,null,o.type,o.scriptid,o.execute_on,o.port" ",o.authtype,o.username,o.password,o.publickey,o.privatekey,o.command" #ifdef HAVE_OPENIPMI ",0,2,null,null" #endif " from opcommand o,opcommand_hst oh" " where o.operationid=oh.operationid" " and o.operationid=" ZBX_FS_UI64 " and oh.hostid is null", operationid, HOST_STATUS_MONITORED, operationid, HOST_STATUS_MONITORED, operationid); while (NULL != (row = DBfetch(result))) { int rc = SUCCEED; char error[ALERT_ERROR_LEN_MAX]; DC_HOST host; zbx_script_t script; zbx_alert_status_t status; *error = '\0'; memset(&host, 0, sizeof(host)); zbx_script_init(&script); ZBX_STR2UINT64(host.hostid, row[0]); if (0 != host.hostid) { strscpy(host.host, row[1]); #ifdef HAVE_OPENIPMI host.ipmi_authtype = (signed char)atoi(row[12]); host.ipmi_privilege = (unsigned char)atoi(row[13]); strscpy(host.ipmi_username, row[14]); strscpy(host.ipmi_password, row[15]); #endif } else rc = get_dynamic_hostid(event, &host, error, sizeof(error)); script.type = (unsigned char)atoi(row[2]); if (ZBX_SCRIPT_TYPE_GLOBAL_SCRIPT != script.type) { script.command = zbx_strdup(script.command, row[11]); substitute_simple_macros(event, NULL, NULL, NULL, NULL, NULL, &script.command, MACRO_TYPE_MESSAGE, NULL, 0); } if (SUCCEED == rc) { switch (script.type) { case ZBX_SCRIPT_TYPE_CUSTOM_SCRIPT: script.execute_on = (unsigned char)atoi(row[4]); break; case ZBX_SCRIPT_TYPE_SSH: script.authtype = (unsigned char)atoi(row[6]); script.publickey = zbx_strdup(script.publickey, row[9]); script.privatekey = zbx_strdup(script.privatekey, row[10]); /* break; is not missing here */ case ZBX_SCRIPT_TYPE_TELNET: script.port = zbx_strdup(script.port, row[5]); script.username = zbx_strdup(script.username, row[7]); script.password = zbx_strdup(script.password, row[8]); break; case ZBX_SCRIPT_TYPE_GLOBAL_SCRIPT: ZBX_DBROW2UINT64(script.scriptid, row[3]); break; } rc = zbx_execute_script(&host, &script, NULL, error, sizeof(error)); } status = (SUCCEED != rc ? ALERT_STATUS_FAILED : ALERT_STATUS_SENT); add_command_alert(&host, event->eventid, actionid, esc_step, script.command, status, error); zbx_script_clean(&script); } DBfree_result(result); zabbix_log(LOG_LEVEL_DEBUG, "End of %s()", __function_name); }