#include "scripts.h"
#include "zbxserver.h"
#include "../poller/checks_agent.h"
#include "../ipmi/ipmi.h"
#include "../poller/checks_ssh.h"
#include "../poller/checks_telnet.h"
#include "zbxexec.h"
#include "zbxdbhigh.h"
#include "log.h"
#include "zbxtasks.h"
#include "zbxembed.h"
#include "zbxnum.h"
#include "zbxsysinfo.h"
extern int CONFIG_TRAPPER_TIMEOUT;
extern int CONFIG_FORKS[ZBX_PROCESS_TYPE_COUNT];
static int zbx_execute_script_on_agent(const DC_HOST *host, const char *command, char **result,
int config_timeout, char *error, size_t max_error_len)
{
int ret;
AGENT_RESULT agent_result;
char *param = NULL, *port = NULL;
DC_ITEM item;
zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __func__);
*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_AGENT)))
{
zbx_snprintf(error, max_error_len, "Zabbix agent interface is not defined for host [%s]", host->host);
goto fail;
}
port = zbx_strdup(port, item.interface.port_orig);
zbx_substitute_simple_macros(NULL, NULL, NULL, NULL, &host->hostid, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
&port, MACRO_TYPE_COMMON, NULL, 0);
if (SUCCEED != (ret = zbx_is_ushort(port, &item.interface.port)))
{
zbx_snprintf(error, max_error_len, "Invalid port number [%s]", item.interface.port_orig);
goto fail;
}
param = zbx_strdup(param, command);
if (SUCCEED != (ret = zbx_quote_key_param(¶m, 0)))
{
zbx_snprintf(error, max_error_len, "Invalid param [%s]", param);
goto fail;
}
item.key = zbx_dsprintf(item.key, "system.run[%s%s]", param, NULL == result ? ",nowait" : "");
item.value_type = ITEM_VALUE_TYPE_TEXT;
zbx_init_agent_result(&agent_result);
zbx_alarm_on(config_timeout);
if (SUCCEED != (ret = get_value_agent(&item, &agent_result)))
{
if (ZBX_ISSET_MSG(&agent_result))
zbx_strlcpy(error, agent_result.msg, max_error_len);
ret = FAIL;
}
else if (NULL != result && ZBX_ISSET_TEXT(&agent_result))
*result = zbx_strdup(*result, agent_result.text);
zbx_alarm_off();