static int zbx_execute_ipmi_command(DC_HOST *host, const char *command, char *error, size_t max_error_len) { const char *__function_name = "zbx_execute_ipmi_command"; int val, ret; char *port = NULL; DC_ITEM item; zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __function_name); *error = '\0'; memset(&item, 0, sizeof(item)); memcpy(&item.host, host, sizeof(item.host)); if (SUCCEED != (ret = DCconfig_get_interface_by_type(&item.interface, host->hostid, INTERFACE_TYPE_IPMI))) { zbx_snprintf(error, max_error_len, "IPMI interface is not defined for host [%s]", host->host); goto fail; } port = zbx_strdup(port, item.interface.port_orig); substitute_simple_macros(NULL, NULL, NULL, NULL, &host->hostid, NULL, NULL, &port, MACRO_TYPE_COMMON, NULL, 0); if (SUCCEED != (ret = is_ushort(port, &item.interface.port))) { zbx_snprintf(error, max_error_len, "invalid port number [%s]", item.interface.port_orig); goto fail; } if (SUCCEED == (ret = parse_ipmi_command(command, item.ipmi_sensor, &val, error, max_error_len))) { if (SUCCEED != (ret = set_ipmi_control_value(&item, val, error, max_error_len))) ret = FAIL; } fail: zbx_free(port); zabbix_log(LOG_LEVEL_DEBUG, "End of %s():%s", __function_name, zbx_result_string(ret)); return ret; }
static void run_remote_command(char* host_name, char* command) { int ret = 9; AGENT_RESULT agent_result; DC_ITEM item; DB_RESULT result; DB_ROW row; char *p, *host_esc, *param; #ifdef HAVE_OPENIPMI int val; char error[MAX_STRING_LEN]; #endif assert(host_name); assert(command); zabbix_log(LOG_LEVEL_DEBUG, "In run_remote_command(hostname:%s,command:%s)", host_name, command); host_esc = DBdyn_escape_string(host_name); result = DBselect( "select hostid,host,useip,ip,dns,port,useipmi,ipmi_ip,ipmi_port,ipmi_authtype," "ipmi_privilege,ipmi_username,ipmi_password" " from hosts" " where status in (%d)" " and host='%s'" DB_NODE, HOST_STATUS_MONITORED, host_esc, DBnode_local("hostid")); zbx_free(host_esc); if (NULL != (row = DBfetch(result))) { memset(&item, 0, sizeof(item)); ZBX_STR2UINT64(item.host.hostid, row[0]); zbx_strlcpy(item.host.host, row[1], sizeof(item.host.host)); item.host.useip = (unsigned char)atoi(row[2]); zbx_strlcpy(item.host.ip, row[3], sizeof(item.host.ip)); zbx_strlcpy(item.host.dns, row[4], sizeof(item.host.dns)); item.host.port = (unsigned short)atoi(row[5]); p = command; while (*p == ' ' && *p != '\0') p++; #ifdef HAVE_OPENIPMI if (0 == strncmp(p, "IPMI", 4)) { if (1 == atoi(row[6])) { zbx_strlcpy(item.host.ipmi_ip_orig, row[7], sizeof(item.host.ipmi_ip)); item.host.ipmi_port = (unsigned short)atoi(row[8]); item.host.ipmi_authtype = atoi(row[9]); item.host.ipmi_privilege = atoi(row[10]); zbx_strlcpy(item.host.ipmi_username, row[11], sizeof(item.host.ipmi_username)); zbx_strlcpy(item.host.ipmi_password, row[12], sizeof(item.host.ipmi_password)); } if (SUCCEED == (ret = parse_ipmi_command(p, item.ipmi_sensor, &val))) { item.key = item.ipmi_sensor; ret = set_ipmi_control_value(&item, val, error, sizeof(error)); } } else { #endif param = zbx_dyn_escape_string(p, "\""); item.key = zbx_dsprintf(NULL, "system.run[\"%s\",\"nowait\"]", param); zbx_free(param); init_result(&agent_result); alarm(CONFIG_TIMEOUT); ret = get_value_agent(&item, &agent_result); alarm(0); free_result(&agent_result); zbx_free(item.key); #ifdef HAVE_OPENIPMI } #endif } DBfree_result(result); zabbix_log(LOG_LEVEL_DEBUG, "End run_remote_command(result:%d)", ret); }
/****************************************************************************** * * * Function: execute_script * * * * Purpose: executing command * * * * Parameters: * * * * Return value: SUCCEED - processed successfully * * FAIL - an error occurred * * * * Author: Alexander Vladishev * * * * Comments: * * * ******************************************************************************/ static int execute_script(zbx_uint64_t scriptid, zbx_uint64_t hostid, char **result) { char *p, *command, error[MAX_STRING_LEN]; int ret = FAIL; DC_HOST host; #ifdef HAVE_OPENIPMI DB_RESULT db_result; DB_ROW db_row; DC_ITEM item; int val; #endif zabbix_log(LOG_LEVEL_DEBUG, "In execute_script() scriptid:" ZBX_FS_UI64 " hostid:" ZBX_FS_UI64, scriptid, hostid); if (FAIL == DCget_host_by_hostid(&host, hostid)) { *result = zbx_dsprintf(*result, "NODE %d: Unknown Host ID [" ZBX_FS_UI64 "]", CONFIG_NODEID, hostid); return ret; } if (NULL == (command = get_command_by_scriptid(scriptid))) { *result = zbx_dsprintf(*result, "NODE %d: Unknown Script ID [" ZBX_FS_UI64 "]", CONFIG_NODEID, scriptid); return ret; } substitute_simple_macros(NULL, NULL, &host, NULL, NULL, &command, MACRO_TYPE_SCRIPT, NULL, 0); zabbix_log(LOG_LEVEL_WARNING, "NODE %d: Executing command: '%s'", CONFIG_NODEID, command); p = command; while (*p == ' ' && *p != '\0') p++; #ifdef HAVE_OPENIPMI if (0 == strncmp(p, "IPMI", 4)) { db_result = DBselect( "select hostid,host,useip,ip,dns,port,useipmi,ipmi_ip,ipmi_port,ipmi_authtype," "ipmi_privilege,ipmi_username,ipmi_password" " from hosts" " where hostid=" ZBX_FS_UI64 DB_NODE, hostid, DBnode_local("hostid")); if (NULL != (db_row = DBfetch(db_result))) { memset(&item, 0, sizeof(item)); ZBX_STR2UINT64(item.host.hostid, db_row[0]); zbx_strlcpy(item.host.host, db_row[1], sizeof(item.host.host)); item.host.useip = (unsigned char)atoi(db_row[2]); zbx_strlcpy(item.host.ip, db_row[3], sizeof(item.host.ip)); zbx_strlcpy(item.host.dns, db_row[4], sizeof(item.host.dns)); item.host.port = (unsigned short)atoi(db_row[5]); if (1 == atoi(db_row[6])) { zbx_strlcpy(item.host.ipmi_ip_orig, db_row[7], sizeof(item.host.ipmi_ip)); item.host.ipmi_port = (unsigned short)atoi(db_row[8]); item.host.ipmi_authtype = atoi(db_row[9]); item.host.ipmi_privilege = atoi(db_row[10]); zbx_strlcpy(item.host.ipmi_username, db_row[11], sizeof(item.host.ipmi_username)); zbx_strlcpy(item.host.ipmi_password, db_row[12], sizeof(item.host.ipmi_password)); } if (SUCCEED == (ret = parse_ipmi_command(p, item.ipmi_sensor, &val))) { if (SUCCEED == (ret = set_ipmi_control_value(&item, val, error, sizeof(error)))) { *result = zbx_dsprintf(*result, "NODE %d: IPMI command successfully executed", CONFIG_NODEID); } else { *result = zbx_dsprintf(*result, "NODE %d: Cannot execute IPMI command: %s", CONFIG_NODEID, error); } } else { *result = zbx_dsprintf(*result, "NODE %d: Cannot parse IPMI command", CONFIG_NODEID); } } else { *result = zbx_dsprintf(*result, "NODE %d: Unknown Host ID [" ZBX_FS_UI64 "]", CONFIG_NODEID, hostid); } DBfree_result(db_result); } else { #endif /* HAVE_OPENIPMI */ if (SUCCEED != (ret = zbx_execute(p, result, error, sizeof(error), CONFIG_TRAPPER_TIMEOUT))) *result = zbx_dsprintf(*result, "NODE %d: Cannot execute command: %s", CONFIG_NODEID, error); #ifdef HAVE_OPENIPMI } #endif zbx_free(command); return ret; }