X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fcurl.c;h=9ad3dc8321e88f205da2d55dca945a42e0668e54;hb=c4439c9cb3e2348ad7013644731de27a55eca478;hp=cde383d38a277283e9a59a735957d61285edb5db;hpb=9655d4a6d9fa2c4f02032759b831e93933d68bd9;p=collectd.git diff --git a/src/curl.c b/src/curl.c index cde383d3..9ad3dc83 100644 --- a/src/curl.c +++ b/src/curl.c @@ -23,10 +23,10 @@ #include "collectd.h" -#include "common.h" #include "plugin.h" -#include "utils_curl_stats.h" -#include "utils_match.h" +#include "utils/common/common.h" +#include "utils/curl_stats/curl_stats.h" +#include "utils/match/match.h" #include "utils_time.h" #include @@ -53,20 +53,21 @@ struct web_page_s; typedef struct web_page_s web_page_t; struct web_page_s /* {{{ */ { + char *plugin_name; char *instance; char *url; char *user; char *pass; char *credentials; - _Bool digest; - _Bool verify_peer; - _Bool verify_host; + bool digest; + bool verify_peer; + bool verify_host; char *cacert; struct curl_slist *headers; char *post_body; - _Bool response_time; - _Bool response_code; + bool response_time; + bool response_code; int timeout; curl_stats_t *stats; @@ -77,19 +78,13 @@ struct web_page_s /* {{{ */ size_t buffer_fill; web_match_t *matches; - - web_page_t *next; }; /* }}} */ /* - * Global variables; - */ -/* static CURLM *curl = NULL; */ -static web_page_t *pages_g = NULL; - -/* * Private functions */ +static int cc_read_page(user_data_t *ud); + static size_t cc_curl_callback(void *buf, /* {{{ */ size_t size, size_t nmemb, void *user_data) { web_page_t *wp; @@ -137,8 +132,9 @@ static void cc_web_match_free(web_match_t *wm) /* {{{ */ sfree(wm); } /* }}} void cc_web_match_free */ -static void cc_web_page_free(web_page_t *wp) /* {{{ */ +static void cc_web_page_free(void *arg) /* {{{ */ { + web_page_t *wp = (web_page_t *)arg; if (wp == NULL) return; @@ -146,6 +142,7 @@ static void cc_web_page_free(web_page_t *wp) /* {{{ */ curl_easy_cleanup(wp->curl); wp->curl = NULL; + sfree(wp->plugin_name); sfree(wp->instance); sfree(wp->url); @@ -160,7 +157,6 @@ static void cc_web_page_free(web_page_t *wp) /* {{{ */ sfree(wp->buffer); cc_web_match_free(wp->matches); - cc_web_page_free(wp->next); sfree(wp); } /* }}} void cc_web_page_free */ @@ -368,8 +364,8 @@ static int cc_page_init_curl(web_page_t *wp) /* {{{ */ return -1; } - ssnprintf(wp->credentials, credentials_size, "%s:%s", wp->user, - (wp->pass == NULL) ? "" : wp->pass); + snprintf(wp->credentials, credentials_size, "%s:%s", wp->user, + (wp->pass == NULL) ? "" : wp->pass); curl_easy_setopt(wp->curl, CURLOPT_USERPWD, wp->credentials); #endif @@ -399,6 +395,7 @@ static int cc_page_init_curl(web_page_t *wp) /* {{{ */ static int cc_config_add_page(oconfig_item_t *ci) /* {{{ */ { + cdtime_t interval = 0; web_page_t *page; int status; @@ -412,14 +409,15 @@ static int cc_config_add_page(oconfig_item_t *ci) /* {{{ */ ERROR("curl plugin: calloc failed."); return -1; } + page->plugin_name = NULL; page->url = NULL; page->user = NULL; page->pass = NULL; - page->digest = 0; - page->verify_peer = 1; - page->verify_host = 1; - page->response_time = 0; - page->response_code = 0; + page->digest = false; + page->verify_peer = true; + page->verify_host = true; + page->response_time = false; + page->response_code = false; page->timeout = -1; page->stats = NULL; @@ -435,7 +433,9 @@ static int cc_config_add_page(oconfig_item_t *ci) /* {{{ */ for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; - if (strcasecmp("URL", child->key) == 0) + if (strcasecmp("Plugin", child->key) == 0) + status = cf_util_get_string(child, &page->plugin_name); + else if (strcasecmp("URL", child->key) == 0) status = cf_util_get_string(child, &page->url); else if (strcasecmp("User", child->key) == 0) status = cf_util_get_string(child, &page->user); @@ -460,6 +460,8 @@ static int cc_config_add_page(oconfig_item_t *ci) /* {{{ */ status = cc_config_append_string("Header", &page->headers, child); else if (strcasecmp("Post", child->key) == 0) status = cf_util_get_string(child, &page->post_body); + else if (strcasecmp("Interval", child->key) == 0) + status = cf_util_get_cdtime(child, &interval); else if (strcasecmp("Timeout", child->key) == 0) status = cf_util_get_int(child, &page->timeout); else if (strcasecmp("Statistics", child->key) == 0) { @@ -503,17 +505,15 @@ static int cc_config_add_page(oconfig_item_t *ci) /* {{{ */ return status; } - /* Add the new page to the linked list */ - if (pages_g == NULL) - pages_g = page; - else { - web_page_t *prev; + /* If all went well, register this page for reading */ + char *cb_name = ssnprintf_alloc("curl-%s-%s", page->instance, page->url); - prev = pages_g; - while (prev->next != NULL) - prev = prev->next; - prev->next = page; - } + plugin_register_complex_read(/* group = */ NULL, cb_name, cc_read_page, + interval, + &(user_data_t){ + .data = page, .free_func = cc_web_page_free, + }); + sfree(cb_name); return 0; } /* }}} int cc_config_add_page */ @@ -552,10 +552,6 @@ static int cc_config(oconfig_item_t *ci) /* {{{ */ static int cc_init(void) /* {{{ */ { - if (pages_g == NULL) { - INFO("curl plugin: No pages have been defined."); - return -1; - } curl_global_init(CURL_GLOBAL_SSL); return 0; } /* }}} int cc_init */ @@ -566,7 +562,8 @@ static void cc_submit(const web_page_t *wp, const web_match_t *wm, /* {{{ */ vl.values = &value; vl.values_len = 1; - sstrncpy(vl.plugin, "curl", sizeof(vl.plugin)); + sstrncpy(vl.plugin, (wp->plugin_name != NULL) ? wp->plugin_name : "curl", + sizeof(vl.plugin)); sstrncpy(vl.plugin_instance, wp->instance, sizeof(vl.plugin_instance)); sstrncpy(vl.type, wm->type, sizeof(vl.type)); if (wm->instance != NULL) @@ -581,7 +578,8 @@ static void cc_submit_response_code(const web_page_t *wp, long code) /* {{{ */ vl.values = &(value_t){.gauge = (gauge_t)code}; vl.values_len = 1; - sstrncpy(vl.plugin, "curl", sizeof(vl.plugin)); + sstrncpy(vl.plugin, (wp->plugin_name != NULL) ? wp->plugin_name : "curl", + sizeof(vl.plugin)); sstrncpy(vl.plugin_instance, wp->instance, sizeof(vl.plugin_instance)); sstrncpy(vl.type, "response_code", sizeof(vl.type)); @@ -594,15 +592,24 @@ static void cc_submit_response_time(const web_page_t *wp, /* {{{ */ vl.values = &(value_t){.gauge = response_time}; vl.values_len = 1; - sstrncpy(vl.plugin, "curl", sizeof(vl.plugin)); + sstrncpy(vl.plugin, (wp->plugin_name != NULL) ? wp->plugin_name : "curl", + sizeof(vl.plugin)); sstrncpy(vl.plugin_instance, wp->instance, sizeof(vl.plugin_instance)); sstrncpy(vl.type, "response_time", sizeof(vl.type)); plugin_dispatch_values(&vl); } /* }}} void cc_submit_response_time */ -static int cc_read_page(web_page_t *wp) /* {{{ */ +static int cc_read_page(user_data_t *ud) /* {{{ */ { + + if ((ud == NULL) || (ud->data == NULL)) { + ERROR("curl plugin: cc_read_page: Invalid user data."); + return -1; + } + + web_page_t *wp = (web_page_t *)ud->data; + int status; cdtime_t start = 0; @@ -623,7 +630,7 @@ static int cc_read_page(web_page_t *wp) /* {{{ */ if (wp->response_time) cc_submit_response_time(wp, CDTIME_T_TO_DOUBLE(cdtime() - start)); if (wp->stats != NULL) - curl_stats_dispatch(wp->stats, wp->curl, hostname_g, "curl", wp->instance); + curl_stats_dispatch(wp->stats, wp->curl, NULL, "curl", wp->instance); if (wp->response_code) { long response_code = 0; @@ -659,25 +666,7 @@ static int cc_read_page(web_page_t *wp) /* {{{ */ return 0; } /* }}} int cc_read_page */ -static int cc_read(void) /* {{{ */ -{ - for (web_page_t *wp = pages_g; wp != NULL; wp = wp->next) - cc_read_page(wp); - - return 0; -} /* }}} int cc_read */ - -static int cc_shutdown(void) /* {{{ */ -{ - cc_web_page_free(pages_g); - pages_g = NULL; - - return 0; -} /* }}} int cc_shutdown */ - void module_register(void) { plugin_register_complex_config("curl", cc_config); plugin_register_init("curl", cc_init); - plugin_register_read("curl", cc_read); - plugin_register_shutdown("curl", cc_shutdown); } /* void module_register */