Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/zabbix/zabbix.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/service_protocol.h2
-rw-r--r--src/libs/zbxservice/service_protocol.c19
-rw-r--r--src/zabbix_server/escalator/escalator.c8
-rw-r--r--src/zabbix_server/service/service_manager.c50
4 files changed, 54 insertions, 25 deletions
diff --git a/include/service_protocol.h b/include/service_protocol.h
index b7950d88e31..2a134a40af7 100644
--- a/include/service_protocol.h
+++ b/include/service_protocol.h
@@ -49,7 +49,7 @@ void zbx_service_serialize_rootcause(unsigned char **data, size_t *data_alloc, s
void zbx_service_deserialize_rootcause(const unsigned char *data, zbx_uint32_t size,
zbx_vector_service_t *services);
void zbx_service_serialize_parent_service(unsigned char **data, size_t *data_alloc, size_t *data_offset,
- zbx_uint64_t serviceid, zbx_vector_ptr_t *tags);
+ zbx_uint64_t serviceid, zbx_vector_tags_t *tags);
void zbx_service_deserialize_parent_services(const unsigned char *data, zbx_uint32_t size,
zbx_vector_ptr_t *parent_services);
diff --git a/src/libs/zbxservice/service_protocol.c b/src/libs/zbxservice/service_protocol.c
index e515ab1211e..9b856346b67 100644
--- a/src/libs/zbxservice/service_protocol.c
+++ b/src/libs/zbxservice/service_protocol.c
@@ -313,7 +313,7 @@ void zbx_service_deserialize_rootcause(const unsigned char *data, zbx_uint32_t s
}
void zbx_service_serialize_parent_service(unsigned char **data, size_t *data_alloc, size_t *data_offset,
- zbx_uint64_t serviceid, zbx_vector_ptr_t *tags)
+ zbx_uint64_t serviceid, zbx_vector_tags_t *tags)
{
zbx_uint32_t data_len = 0, *len = NULL;
zbx_uint32_t i, tags_num;
@@ -323,18 +323,18 @@ void zbx_service_serialize_parent_service(unsigned char **data, size_t *data_all
zbx_serialize_prepare_value(data_len, serviceid);
- tags_num = tags->values_num;
+ tags_num = (zbx_uint32_t)tags->values_num;
zbx_serialize_prepare_value(data_len, tags_num);
+ len = (zbx_uint32_t *)zbx_malloc(NULL, sizeof(zbx_uint32_t) * 2 * (size_t)tags->values_num);
+
if (0 != tags->values_num)
{
- len = (zbx_uint32_t *)zbx_malloc(NULL, sizeof(zbx_uint32_t) * 2 * (size_t)tags->values_num);
-
for (i = 0; i < tags->values_num; i++)
{
- tag = (zbx_tag_t*)(tags->values + i);
+ tag = tags->values[i];
zbx_serialize_prepare_str_len(data_len, tag->tag, len[i * 2]);
- zbx_serialize_prepare_str_len(data_len, tag->value, len[i * 2 + 1]);
+ zbx_serialize_prepare_str_len(data_len, ZBX_NULL2EMPTY_STR(tag->value), len[i * 2 + 1]);
}
}
@@ -357,11 +357,10 @@ void zbx_service_serialize_parent_service(unsigned char **data, size_t *data_all
for (i = 0; i < tags->values_num; i++)
{
- tag = (zbx_tag_t*)tags->values[i];
- zbx_serialize_str(ptr, tag->tag, len);
+ tag = tags->values[i];
- if (tag->value != NULL)
- zbx_serialize_str(ptr, tag->value, len);
+ ptr += zbx_serialize_str(ptr, tag->tag, len[i * 2]);
+ ptr += zbx_serialize_str(ptr, ZBX_NULL2EMPTY_STR(tag->value), len[i * 2 + 1]);
}
}
diff --git a/src/zabbix_server/escalator/escalator.c b/src/zabbix_server/escalator/escalator.c
index fc6570e165d..ce86d6a5c89 100644
--- a/src/zabbix_server/escalator/escalator.c
+++ b/src/zabbix_server/escalator/escalator.c
@@ -484,17 +484,17 @@ static int get_service_permission(zbx_uint64_t userid, char **user_timezone, zbx
zbx_service_deserialize_parent_services(response.data, response.size, &parent_services);
zbx_ipc_message_clean(&response);
- for (i = 0; i < 1; i++)
+ for (i = 0; i < parent_services.values_num; i++)
{
int j;
- zbx_parent_service_t *ps = (zbx_parent_service_t*)parent_services.values[i];
+ zbx_parent_service_t *ps = (zbx_parent_service_t*)(parent_services.values[i]);
- if (PERM_DENY == (perm = get_service_access_rights(user.roleid, parent_services.values[i])))
+ if (PERM_DENY == (perm = get_service_access_rights(user.roleid, ps->serviceid)))
goto out;
for (j = 0; i < ps->tags.values_num; i++)
{
- zbx_tag_t *tag = ps->tags.values[i];
+ zbx_tag_t *tag = ps->tags.values[i];
DB_ROW row;
DB_RESULT result;
char *tag_read, *tag_write, *value_read, *value_write;
diff --git a/src/zabbix_server/service/service_manager.c b/src/zabbix_server/service/service_manager.c
index 72999a6869b..92e4edabb44 100644
--- a/src/zabbix_server/service/service_manager.c
+++ b/src/zabbix_server/service/service_manager.c
@@ -396,6 +396,7 @@ static void add_service_problem_tag_index(zbx_hashset_t *service_problem_tags_in
value_eq_local.value = service_problem_tag->value;
if (NULL == (value_eq = zbx_hashset_search(&tag_services->values, &value_eq_local)))
{
+
value_eq_local.value = zbx_strdup(NULL, service_problem_tag->value);
zbx_vector_ptr_create(&value_eq_local.service_problem_tags);
value_eq = zbx_hashset_insert(&tag_services->values, &value_eq_local, sizeof(value_eq_local));
@@ -2337,31 +2338,60 @@ static void process_rootcause(const zbx_ipc_message_t *message, zbx_service_mana
zbx_vector_uint64_destroy(&serviceids);
}
+static void get_parent_service_tags(unsigned char **data, size_t *data_alloc, size_t *data_offset,
+ zbx_service_t *service, zbx_vector_tags_t *tags)
+{
+ int i;
+
+ if (NULL == service)
+ return;
+
+ for (i = 0; i < service->parents.values_num; i++)
+ {
+ int j;
+ zbx_service_t *parent;
+
+ parent = (zbx_service_t *)(service->parents.values[i]);
+
+ for (j = 0; j < parent->tags.values_num; j++)
+ {
+ zbx_service_tag_t *stag = parent->tags.values[j];
+ zbx_tag_t *tag = (zbx_tag_t*)malloc(sizeof(zbx_tag_t));
+ tag->tag = zbx_strdup(NULL, stag->name);
+ tag->value = zbx_strdup(NULL, stag->value);
+ zbx_vector_tags_append(tags, tag);
+ }
+
+ get_parent_service_tags(data, data_alloc, data_offset, (zbx_service_t*)parent->parents.values[j], tags);
+
+ zbx_service_serialize_parent_service(data, data_alloc, data_offset, parent->serviceid, tags);
+ }
+}
+
static void process_parentlist(const zbx_ipc_message_t *message, zbx_service_manager_t *service_manager,
zbx_ipc_client_t *client)
{
- int i;
unsigned char *data = NULL;
- size_t data_alloc = 0, data_offset = 0;
- zbx_uint64_t child_serviceid = 0;
+ size_t data_alloc = 0, data_offset = 0;
+ zbx_uint64_t child_serviceid = 0;
+ zbx_service_t *service, service_local, *parent_service = NULL;
+ zbx_vector_tags_t tags;
zbx_deserialize_uint64(message->data, &child_serviceid);
- zbx_service_t *service, service_local = {.serviceid = child_serviceid};
+ service_local.serviceid = child_serviceid;
if (NULL == (service = zbx_hashset_search(&service_manager->services, &service_local)))
return;
- for (i = 0; i < service->parents.values_num; i++)
- {
- zbx_service_t *parent = (zbx_service_t *)service->parents.values[i];
-
- zbx_service_serialize_parent_service(&data, &data_alloc, &data_offset, parent->serviceid, &parent->tags);
- }
+ zbx_vector_tags_create(&tags);
+ get_parent_service_tags(&data, &data_alloc, &data_offset, service, &tags);
zbx_ipc_client_send(client, ZBX_IPC_SERVICE_SERVICE_PARENT_LIST, data, data_offset);
zbx_free(data);
+ zbx_vector_tags_clear(&tags);
+ zbx_vector_tags_destroy(&tags);
}
static void service_manager_init(zbx_service_manager_t *service_manager)