diff options
author | Dmitrijs Goloscapovs <dmitrijs.goloscapovs@zabbix.com> | 2021-08-08 22:56:36 +0300 |
---|---|---|
committer | Dmitrijs Goloscapovs <dmitrijs.goloscapovs@zabbix.com> | 2021-08-08 22:56:36 +0300 |
commit | fee0fb08c1014f39dac91afe61a3d03fbdbb5561 (patch) | |
tree | 8f97625a49dcfa5563b9aa17c134159db40777ff | |
parent | c52fff2a59ce1c7aff68397f1d7e8122562260aa (diff) |
....I...S. [ZBXNEXT-6787] various fixes
-rw-r--r-- | include/service_protocol.h | 2 | ||||
-rw-r--r-- | src/libs/zbxservice/service_protocol.c | 19 | ||||
-rw-r--r-- | src/zabbix_server/escalator/escalator.c | 8 | ||||
-rw-r--r-- | src/zabbix_server/service/service_manager.c | 50 |
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) |