/****************************************************************************** * * * Function: node_process_command * * * * Purpose: process command received from a master node or php * * * * Return value: SUCCEED - processed successfully * * FAIL - an error occurred * * * ******************************************************************************/ int node_process_command(zbx_sock_t *sock, const char *data, struct zbx_json_parse *jp) { char *result = NULL, *send = NULL, tmp[64]; int nodeid = -1, next_nodeid, ret = FAIL; zbx_uint64_t scriptid, hostid; struct zbx_json j; zabbix_log(LOG_LEVEL_DEBUG, "In node_process_command()"); zbx_json_init(&j, ZBX_JSON_STAT_BUF_LEN); if (SUCCEED != zbx_json_value_by_name(jp, ZBX_PROTO_TAG_NODEID, tmp, sizeof(tmp)) || FAIL == is_uint31(tmp, &nodeid)) { result = zbx_dsprintf(result, "Failed to parse command request tag: %s.", ZBX_PROTO_TAG_NODEID); goto finish; } if (SUCCEED != zbx_json_value_by_name(jp, ZBX_PROTO_TAG_SCRIPTID, tmp, sizeof(tmp)) || FAIL == is_uint64(tmp, &scriptid)) { result = zbx_dsprintf(result, "Failed to parse command request tag: %s.", ZBX_PROTO_TAG_SCRIPTID); goto finish; } if (SUCCEED != zbx_json_value_by_name(jp, ZBX_PROTO_TAG_HOSTID, tmp, sizeof(tmp)) || FAIL == is_uint64(tmp, &hostid)) { result = zbx_dsprintf(result, "Failed to parse command request tag: %s.", ZBX_PROTO_TAG_HOSTID); goto finish; } if (nodeid == CONFIG_NODEID) { if (SUCCEED == (ret = execute_script(scriptid, hostid, &result))) { zbx_json_addstring(&j, ZBX_PROTO_TAG_RESPONSE, ZBX_PROTO_VALUE_SUCCESS, ZBX_JSON_TYPE_STRING); zbx_json_addstring(&j, ZBX_PROTO_TAG_DATA, result, ZBX_JSON_TYPE_STRING); send = j.buffer; } } else if (SUCCEED == get_next_point_to_node(CONFIG_NODEID, nodeid, &next_nodeid)) { zabbix_log(LOG_LEVEL_WARNING, "NODE %d: Sending command for Node %d to Node %d", CONFIG_NODEID, nodeid, next_nodeid); if (SUCCEED == (ret = send_script(next_nodeid, data, &result))) send = result; } else result = zbx_dsprintf(result, "NODE %d: Unknown Node ID [%d].", CONFIG_NODEID, nodeid); finish: if (FAIL == ret) { zbx_json_addstring(&j, ZBX_PROTO_TAG_RESPONSE, ZBX_PROTO_VALUE_FAILED, ZBX_JSON_TYPE_STRING); zbx_json_addstring(&j, ZBX_PROTO_TAG_INFO, (NULL != result ? result : "Unknown error."), ZBX_JSON_TYPE_STRING); send = j.buffer; } alarm(CONFIG_TIMEOUT); if (SUCCEED != zbx_tcp_send_raw(sock, send)) { zabbix_log(LOG_LEVEL_WARNING, "NODE %d: Error sending result of command to node %d", CONFIG_NODEID, nodeid); } else { zabbix_log(LOG_LEVEL_DEBUG, "NODE %d: Sending back command '%s' result '%s'", CONFIG_NODEID, data, send); } alarm(0); zbx_json_free(&j); zbx_free(result); return ret; }
/****************************************************************************** * * * Function: node_process_command * * * * Purpose: process command received from a master node or php * * * * Parameters: * * * * Return value: SUCCEED - processed successfully * * FAIL - an error occurred * * * * Author: Alexander Vladishev * * * * Comments: * * * ******************************************************************************/ int node_process_command(zbx_sock_t *sock, const char *data, struct zbx_json_parse *jp) { char *result = NULL, *send, tmp[64]; const char *response; int nodeid, next_nodeid, ret = FAIL; zbx_uint64_t scriptid, hostid; struct zbx_json j; zabbix_log(LOG_LEVEL_DEBUG, "In node_process_command()"); if (SUCCEED != zbx_json_value_by_name(jp, ZBX_PROTO_TAG_NODEID, tmp, sizeof(tmp))) return FAIL; nodeid = atoi(tmp); if (SUCCEED != zbx_json_value_by_name(jp, ZBX_PROTO_TAG_SCRIPTID, tmp, sizeof(tmp))) return FAIL; ZBX_STR2UINT64(scriptid, tmp); if (SUCCEED != zbx_json_value_by_name(jp, ZBX_PROTO_TAG_HOSTID, tmp, sizeof(tmp))) return FAIL; ZBX_STR2UINT64(hostid, tmp); zbx_json_init(&j, 256); if (nodeid == CONFIG_NODEID) { ret = execute_script(scriptid, hostid, &result); response = (FAIL == ret) ? ZBX_PROTO_VALUE_FAILED : ZBX_PROTO_VALUE_SUCCESS; zbx_json_addstring(&j, ZBX_PROTO_TAG_RESPONSE, response, ZBX_JSON_TYPE_STRING); zbx_json_addstring(&j, ZBX_PROTO_TAG_VALUE, result, ZBX_JSON_TYPE_STRING); send = j.buffer; } else if (SUCCEED == get_next_point_to_node(CONFIG_NODEID, nodeid, &next_nodeid)) { zabbix_log(LOG_LEVEL_WARNING, "NODE %d: Sending command for Node %d to Node %d", CONFIG_NODEID, nodeid, next_nodeid); if (FAIL == (ret = send_script(next_nodeid, data, &result))) { zbx_json_addstring(&j, ZBX_PROTO_TAG_RESPONSE, ZBX_PROTO_VALUE_FAILED, ZBX_JSON_TYPE_STRING); zbx_json_addstring(&j, ZBX_PROTO_TAG_VALUE, result, ZBX_JSON_TYPE_STRING); send = j.buffer; } else send = result; } else { result = zbx_dsprintf(result, "NODE %d: Unknown Node ID [%d]", CONFIG_NODEID, nodeid); zbx_json_addstring(&j, ZBX_PROTO_TAG_RESPONSE, ZBX_PROTO_VALUE_FAILED, ZBX_JSON_TYPE_STRING); zbx_json_addstring(&j, ZBX_PROTO_TAG_VALUE, result, ZBX_JSON_TYPE_STRING); send = j.buffer; } alarm(CONFIG_TIMEOUT); if (zbx_tcp_send_raw(sock, send) != SUCCEED) { zabbix_log(LOG_LEVEL_WARNING, "NODE %d: Error sending result of command to node %d", CONFIG_NODEID, nodeid); } alarm(0); zbx_json_free(&j); zbx_free(result); return SUCCEED; }