X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fvirt.c;h=2a7162ec52bce7a0801d67bea25f20cd4584a99e;hb=b12fdf9baa747e059518078bf6073b5dc8bde957;hp=92c120ffe8ad9a709089ab6a96c6f65009a5feec;hpb=2a15a3ff1f98ab250c383c3cb9fb38628e3fdf41;p=collectd.git diff --git a/src/virt.c b/src/virt.c index 92c120ff..2a7162ec 100644 --- a/src/virt.c +++ b/src/virt.c @@ -1155,6 +1155,11 @@ static int lv_init_ignorelists() { /* Validates config option that may take multiple strings arguments. * Returns 0 on success, -1 otherwise */ static int check_config_multiple_string_entry(const oconfig_item_t *ci) { + if (ci == NULL) { + ERROR(PLUGIN_NAME " plugin: ci oconfig_item can't be NULL"); + return -1; + } + if (ci->values_num < 1) { ERROR(PLUGIN_NAME " plugin: the '%s' option requires at least one string argument", @@ -1312,8 +1317,10 @@ static int lv_config(oconfig_item_t *ci) { continue; } else if (strcasecmp(c->key, "HostnameFormat") == 0) { /* this option can take multiple strings arguments in one config line*/ - if (check_config_multiple_string_entry(c) != 0) + if (check_config_multiple_string_entry(c) != 0) { + ERROR(PLUGIN_NAME " plugin: Could not get 'HostnameFormat' parameter"); return -1; + } const int params_num = c->values_num; for (int i = 0; i < params_num; ++i) { @@ -1339,8 +1346,11 @@ static int lv_config(oconfig_item_t *ci) { continue; } else if (strcasecmp(c->key, "PluginInstanceFormat") == 0) { /* this option can handle list of string parameters in one line*/ - if (check_config_multiple_string_entry(c) != 0) + if (check_config_multiple_string_entry(c) != 0) { + ERROR(PLUGIN_NAME + " plugin: Could not get 'PluginInstanceFormat' parameter"); return -1; + } const int params_num = c->values_num; for (int i = 0; i < params_num; ++i) { @@ -2609,6 +2619,7 @@ static void lv_add_network_interfaces(struct lv_read_state *state, for (int j = 0; j < xml_interfaces->nodeNr; ++j) { char *path = NULL; char *address = NULL; + const int itf_number = j + 1; xmlNodePtr xml_interface = xml_interfaces->nodeTab[j]; if (!xml_interface) @@ -2630,11 +2641,31 @@ static void lv_add_network_interfaces(struct lv_read_state *state, } } - if ((ignore_device_match(il_interface_devices, domname, path) == 0 && - ignore_device_match(il_interface_devices, domname, address) == 0)) { - add_interface_device(state, dom, path, address, j + 1); + bool device_ignored = false; + switch (interface_format) { + case if_name: + if (ignore_device_match(il_interface_devices, domname, path) != 0) + device_ignored = true; + break; + case if_address: + if (ignore_device_match(il_interface_devices, domname, address) != 0) + device_ignored = true; + break; + case if_number: { + char number_string[4]; + snprintf(number_string, sizeof(number_string), "%d", itf_number); + if (ignore_device_match(il_interface_devices, domname, number_string) != + 0) + device_ignored = true; + } break; + default: + ERROR(PLUGIN_NAME " plugin: Unknown interface_format option: %d", + interface_format); } + if (!device_ignored) + add_interface_device(state, dom, path, address, itf_number); + if (path) xmlFree(path); if (address) @@ -2643,6 +2674,24 @@ static void lv_add_network_interfaces(struct lv_read_state *state, xmlXPathFreeObject(xpath_obj); } +static bool is_domain_ignored(virDomainPtr dom) { + const char *domname = virDomainGetName(dom); + + if (domname == NULL) { + VIRT_ERROR(conn, "virDomainGetName failed, ignoring domain"); + return true; + } + + if (ignorelist_match(il_domains, domname) != 0) { + DEBUG(PLUGIN_NAME + " plugin: ignoring domain '%s' because of ignorelist option", + domname); + return true; + } + + return false; +} + static int refresh_lists(struct lv_read_instance *inst) { struct lv_read_state *state = &inst->read_state; int n; @@ -2692,8 +2741,9 @@ static int refresh_lists(struct lv_read_instance *inst) { #ifdef HAVE_LIST_ALL_DOMAINS for (int i = 0; i < m; ++i) - if (add_domain(state, domains_inactive[i], 0) < 0) { - ERROR(PLUGIN_NAME " plugin: malloc failed."); + if (is_domain_ignored(domains_inactive[i]) || + add_domain(state, domains_inactive[i], 0) < 0) { + /* domain ignored or failed during adding to domains list*/ virDomainFree(domains_inactive[i]); domains_inactive[i] = NULL; continue; @@ -2714,8 +2764,10 @@ static int refresh_lists(struct lv_read_instance *inst) { } #endif - if (add_domain(state, dom, 1) < 0) { + if (is_domain_ignored(dom) || add_domain(state, dom, 1) < 0) { /* + * domain ignored or failed during adding to domains list + * * When domain is already tracked, then there is * no problem with memory handling (will be freed * with the rest of domains cached data) @@ -2723,7 +2775,6 @@ static int refresh_lists(struct lv_read_instance *inst) { * before adding domain to track) we have to take * care it ourselves and call virDomainFree */ - ERROR(PLUGIN_NAME " plugin: malloc failed."); virDomainFree(dom); continue; } @@ -2747,9 +2798,6 @@ static int refresh_lists(struct lv_read_instance *inst) { continue; } - if (ignorelist_match(il_domains, domname) != 0) - continue; - /* Get a list of devices for this domain. */ xmlDocPtr xml_doc = NULL; xmlXPathContextPtr xpath_ctx = NULL; @@ -2826,12 +2874,13 @@ static void free_domains(struct lv_read_state *state) { static int add_domain(struct lv_read_state *state, virDomainPtr dom, bool active) { - int new_size = sizeof(state->domains[0]) * (state->nr_domains + 1); domain_t *new_ptr = realloc(state->domains, new_size); - if (new_ptr == NULL) + if (new_ptr == NULL) { + ERROR(PLUGIN_NAME " plugin: realloc failed in add_domain()"); return -1; + } state->domains = new_ptr; state->domains[state->nr_domains].ptr = dom;