Пример #1
0
int	comms_parse_response(char *xml, char *host, size_t host_len, char *key, size_t key_len,
		char *data, size_t data_len, char *lastlogsize, size_t lastlogsize_len,
		char *timestamp, size_t timestamp_len, char *source, size_t source_len,
		char *severity, size_t severity_len)
{
	int	i, ret = SUCCEED;
	char	*data_b64 = NULL;

	assert(NULL != host && 0 != host_len);
	assert(NULL != key && 0 != key_len);
	assert(NULL != data && 0 != data_len);
	assert(NULL != lastlogsize && 0 != lastlogsize_len);
	assert(NULL != timestamp && 0 != timestamp_len);
	assert(NULL != source && 0 != source_len);
	assert(NULL != severity && 0 != severity_len);

	if (SUCCEED == xml_get_data_dyn(xml, "host", &data_b64))
	{
		str_base64_decode(data_b64, host, host_len - 1, &i);
		host[i] = '\0';
		xml_free_data_dyn(&data_b64);
	}
	else
	{
		*host = '\0';
		ret = FAIL;
	}

	if (SUCCEED == xml_get_data_dyn(xml, "key", &data_b64))
	{
		str_base64_decode(data_b64, key, key_len - 1, &i);
		key[i] = '\0';
		xml_free_data_dyn(&data_b64);
	}
	else
	{
		*key = '\0';
		ret = FAIL;
	}

	if (SUCCEED == xml_get_data_dyn(xml, "data", &data_b64))
	{
		str_base64_decode(data_b64, data, data_len - 1, &i);
		data[i] = '\0';
		xml_free_data_dyn(&data_b64);
	}
	else
	{
		*data = '\0';
		ret = FAIL;
	}

	if (SUCCEED == xml_get_data_dyn(xml, "lastlogsize", &data_b64))
	{
		str_base64_decode(data_b64, lastlogsize, lastlogsize_len - 1, &i);
		lastlogsize[i] = '\0';
		xml_free_data_dyn(&data_b64);
	}
	else
		*lastlogsize = '\0';

	if (SUCCEED == xml_get_data_dyn(xml, "timestamp", &data_b64))
	{
		str_base64_decode(data_b64, timestamp, timestamp_len - 1, &i);
		timestamp[i] = '\0';
		xml_free_data_dyn(&data_b64);
	}
	else
		*timestamp = '\0';

	if (SUCCEED == xml_get_data_dyn(xml, "source", &data_b64))
	{
		str_base64_decode(data_b64, source, source_len - 1, &i);
		source[i] = '\0';
		xml_free_data_dyn(&data_b64);
	}
	else
		*source = '\0';

	if (SUCCEED == xml_get_data_dyn(xml, "severity", &data_b64))
	{
		str_base64_decode(data_b64, severity, severity_len - 1, &i);
		severity[i] = '\0';
		xml_free_data_dyn(&data_b64);
	}
	else
		*severity = '\0';

	return ret;
}
Пример #2
0
Файл: comms.c Проект: Shmuma/z
int	comms_parse_response(char *xml,char *host,char *key, char *data, char* error, char *lastlogsize, char *timestamp,
	       char *source, char *severity, int maxlen)
{
	int ret = SUCCEED;
	int i;

	char host_b64[MAX_STRING_LEN];
	char key_b64[MAX_STRING_LEN];
	char data_b64[MAX_STRING_LEN];
	char error_b64[MAX_STRING_LEN];
	char lastlogsize_b64[MAX_STRING_LEN];
	char timestamp_b64[MAX_STRING_LEN];
	char source_b64[ZBX_MAX_B64_LEN];
	char severity_b64[MAX_STRING_LEN];

	assert(key);
	assert(host);
	assert(data);
	assert(error);
	assert(lastlogsize);
	assert(timestamp);
	assert(source);
	assert(severity);

	memset(host_b64,0,sizeof(host_b64));
	memset(key_b64,0,sizeof(key_b64));
	memset(data_b64,0,sizeof(data_b64));
	memset(error_b64,0,sizeof(data_b64));
	memset(lastlogsize_b64,0,sizeof(lastlogsize_b64));
	memset(timestamp_b64,0,sizeof(timestamp_b64));
	memset(source_b64,0,sizeof(source_b64));
	memset(severity_b64,0,sizeof(severity_b64));

	xml_get_data(xml, "host", host_b64, sizeof(host_b64)-1);
	xml_get_data(xml, "key", key_b64, sizeof(key_b64)-1);
	xml_get_data(xml, "data", data_b64, sizeof(data_b64)-1);
	xml_get_data(xml, "error", error_b64, sizeof(error_b64)-1);
	xml_get_data(xml, "lastlogsize", lastlogsize_b64, sizeof(lastlogsize_b64)-1);
	xml_get_data(xml, "timestamp", timestamp_b64, sizeof(timestamp_b64)-1);
	xml_get_data(xml, "source", source_b64, sizeof(source_b64)-1);
	xml_get_data(xml, "severity", severity_b64, sizeof(severity_b64)-1);

	memset(key,0,maxlen);
	memset(host,0,maxlen);
	memset(data,0,maxlen);
	memset(error,0,maxlen);
	memset(lastlogsize,0,maxlen);
	memset(timestamp,0,maxlen);
	memset(source,0,maxlen);
	memset(severity,0,maxlen);

	str_base64_decode(host_b64, host, &i);
	str_base64_decode(key_b64, key, &i);
	str_base64_decode(data_b64, data, &i);
	str_base64_decode(error_b64, error, &i);
	str_base64_decode(lastlogsize_b64, lastlogsize, &i);
	str_base64_decode(timestamp_b64, timestamp, &i);
	str_base64_decode(source_b64, source, &i);
	str_base64_decode(severity_b64, severity, &i);

	return ret;
}
Пример #3
0
Файл: comms.c Проект: Shmuma/z
/*
  performs iterative parse of multi-response buffer

  Sample usage code:

  void* token = NULL;
  while (comms_parse_response (..., &token) == SUCCEED)
      process_data;
 */
int	comms_parse_multi_response (char *xml,char *host,char *key, char *data, char *lastlogsize, char *timestamp,
		char *source, char *severity, int maxlen, void** token)
{
	char* ptr = (char*)*token;
	int res = SUCCEED;
	int i;

	zabbix_log (LOG_LEVEL_DEBUG, "comms_parse_multi_response: started");

	/* if token is NULL, skip <reqs> tag and obtain hostname and key value */
	if (!ptr)
	{
		char host_b64[MAX_STRING_LEN];
		char key_b64[MAX_STRING_LEN];

		if (strncmp (xml, "<reqs>", 6))
			return FAIL;
		ptr = xml+6;

		memset(host_b64, 0, sizeof(host_b64));
		memset(key_b64,0,sizeof(key_b64));

		xml_get_data(ptr, "host", host_b64, sizeof(host_b64)-1);
		xml_get_data(ptr, "key", key_b64, sizeof(key_b64)-1);

		memset(host, 0, maxlen);
		memset(key,0,maxlen);

		str_base64_decode(host_b64, host, &i);
		str_base64_decode(key_b64, key, &i);

		zabbix_log (LOG_LEVEL_DEBUG, "Host64 = %s, Host=%s", host_b64, host);
		zabbix_log (LOG_LEVEL_DEBUG, "Key64 = %s, Key=%s", key_b64, key);

		ptr = strstr (ptr, "<values>");
		if (ptr)
			ptr += 8;
		else
			return FAIL;
        }

	if (strncmp (ptr, "<value>", 7) == 0)
	{
		/* parse one value */
		char data_b64[MAX_STRING_LEN];

		memset(data_b64,0,sizeof(data_b64));

		xml_get_data(ptr, "data", data_b64, sizeof(data_b64)-1);
		xml_get_data(ptr, "timestamp", timestamp, maxlen-1);

		memset(data,0,maxlen);

		str_base64_decode(data_b64, data, &i);

		zabbix_log (LOG_LEVEL_DEBUG, "Data64 = %s, Data=%s", data_b64, data);

		ptr = strstr (ptr, "</value>");
		if (!ptr)
		{
			zabbix_log (LOG_LEVEL_DEBUG, "Not found </value> tag");
			res = FAIL;
		}
		else
			ptr += 8;
        }
	else
	{
		zabbix_log (LOG_LEVEL_DEBUG, "Not found <value> tag");
		res = FAIL;
	}

	*token = ptr;

	if (res == SUCCEED)
		zabbix_log (LOG_LEVEL_DEBUG, "parsed ok. Data: host=%s, key=%s, val=%s, timestamp=%s", host, key, data, timestamp);
	else
		zabbix_log (LOG_LEVEL_DEBUG, "parse error");

	zabbix_log (LOG_LEVEL_DEBUG, "comms_parse_multi_response: started");
	return res;
}
Пример #4
0
int	comms_parse_response(char *xml, char *host, int host_len, char *key, int key_len, char *data, int data_len,
		char *lastlogsize, int lastlogsize_len, char *timestamp, int timestamp_len,
		char *source, int source_len, char *severity, int severity_len)
{
	int	i, ret = SUCCEED;
	char	*data_b64 = NULL;

	assert(key);
	assert(host);
	assert(data);
	assert(lastlogsize);
	assert(timestamp);
	assert(source);
	assert(severity);

	if (SUCCEED == xml_get_data_dyn(xml, "host", &data_b64))
	{
		str_base64_decode(data_b64, host, host_len - 1, &i);
		host[i] = '\0';
		xml_free_data_dyn(&data_b64);
	}

	if (SUCCEED == xml_get_data_dyn(xml, "key", &data_b64))
	{
		str_base64_decode(data_b64, key, key_len - 1, &i);
		key[i] = '\0';
		xml_free_data_dyn(&data_b64);
	}

	if (SUCCEED == xml_get_data_dyn(xml, "data", &data_b64))
	{
		str_base64_decode(data_b64, data, data_len - 1, &i);
		data[i] = '\0';
		xml_free_data_dyn(&data_b64);
	}

	if (SUCCEED == xml_get_data_dyn(xml, "lastlogsize", &data_b64))
	{
		str_base64_decode(data_b64, lastlogsize, lastlogsize_len - 1, &i);
		lastlogsize[i] = '\0';
		xml_free_data_dyn(&data_b64);
	}

	if (SUCCEED == xml_get_data_dyn(xml, "timestamp", &data_b64))
	{
		str_base64_decode(data_b64, timestamp, timestamp_len - 1, &i);
		timestamp[i] = '\0';
		xml_free_data_dyn(&data_b64);
	}

	if (SUCCEED == xml_get_data_dyn(xml, "source", &data_b64))
	{
		str_base64_decode(data_b64, source, source_len - 1, &i);
		source[i] = '\0';
		xml_free_data_dyn(&data_b64);
	}

	if (SUCCEED == xml_get_data_dyn(xml, "severity", &data_b64))
	{
		str_base64_decode(data_b64, severity, severity_len - 1, &i);
		severity[i] = '\0';
		xml_free_data_dyn(&data_b64);
	}

	return ret;
}