X-Git-Url: https://git.octo.it/?p=collectd.git;a=blobdiff_plain;f=src%2Fcurl.c;h=3e7c5a5dde7a0efeaad94b8933a79e109dcfb2c3;hp=c6e2ae9c1f521350db159dc2922dafcb6fb54f41;hb=633c3966f770e4d46651a2fe219a18d8a9907a9f;hpb=38e2d0eff79464e4b9686e135a184411d9307db7 diff --git a/src/curl.c b/src/curl.c index c6e2ae9c..3e7c5a5d 100644 --- a/src/curl.c +++ b/src/curl.c @@ -17,7 +17,7 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Authors: - * Florian octo Forster + * Florian octo Forster * Aman Gupta **/ @@ -26,6 +26,7 @@ #include "plugin.h" #include "configfile.h" #include "utils_match.h" +#include "utils_time.h" #include @@ -57,12 +58,14 @@ struct web_page_s /* {{{ */ char *user; char *pass; char *credentials; - int verify_peer; - int verify_host; + _Bool digest; + _Bool verify_peer; + _Bool verify_host; char *cacert; struct curl_slist *headers; char *post_body; - int response_time; + _Bool response_time; + _Bool response_code; CURL *curl; char curl_errbuf[CURL_ERROR_SIZE]; @@ -89,7 +92,7 @@ static size_t cc_curl_callback (void *buf, /* {{{ */ { web_page_t *wp; size_t len; - + len = size * nmemb; if (len <= 0) return (len); @@ -160,23 +163,6 @@ static void cc_web_page_free (web_page_t *wp) /* {{{ */ sfree (wp); } /* }}} void cc_web_page_free */ -static int cc_config_add_string (const char *name, char **dest, /* {{{ */ - oconfig_item_t *ci) -{ - if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) - { - WARNING ("curl plugin: `%s' needs exactly one string argument.", name); - return (-1); - } - - sfree (*dest); - *dest = strdup (ci->values[0].value.string); - if (*dest == NULL) - return (-1); - - return (0); -} /* }}} int cc_config_add_string */ - static int cc_config_append_string (const char *name, struct curl_slist **dest, /* {{{ */ oconfig_item_t *ci) { @@ -193,21 +179,6 @@ static int cc_config_append_string (const char *name, struct curl_slist **dest, return (0); } /* }}} int cc_config_append_string */ - -static int cc_config_set_boolean (const char *name, int *dest, /* {{{ */ - oconfig_item_t *ci) -{ - if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_BOOLEAN)) - { - WARNING ("curl plugin: `%s' needs exactly one boolean argument.", name); - return (-1); - } - - *dest = ci->values[0].value.boolean ? 1 : 0; - - return (0); -} /* }}} int cc_config_set_boolean */ - static int cc_config_add_match_dstype (int *dstype_ret, /* {{{ */ oconfig_item_t *ci) { @@ -312,15 +283,15 @@ static int cc_config_add_match (web_page_t *page, /* {{{ */ oconfig_item_t *child = ci->children + i; if (strcasecmp ("Regex", child->key) == 0) - status = cc_config_add_string ("Regex", &match->regex, child); + status = cf_util_get_string (child, &match->regex); else if (strcasecmp ("ExcludeRegex", child->key) == 0) - status = cc_config_add_string ("ExcludeRegex", &match->exclude_regex, child); + status = cf_util_get_string (child, &match->exclude_regex); else if (strcasecmp ("DSType", child->key) == 0) status = cc_config_add_match_dstype (&match->dstype, child); else if (strcasecmp ("Type", child->key) == 0) - status = cc_config_add_string ("Type", &match->type, child); + status = cf_util_get_string (child, &match->type); else if (strcasecmp ("Instance", child->key) == 0) - status = cc_config_add_string ("Instance", &match->instance, child); + status = cf_util_get_string (child, &match->instance); else { WARNING ("curl plugin: Option `%s' not allowed here.", child->key); @@ -394,8 +365,7 @@ static int cc_page_init_curl (web_page_t *wp) /* {{{ */ curl_easy_setopt (wp->curl, CURLOPT_NOSIGNAL, 1L); curl_easy_setopt (wp->curl, CURLOPT_WRITEFUNCTION, cc_curl_callback); curl_easy_setopt (wp->curl, CURLOPT_WRITEDATA, wp); - curl_easy_setopt (wp->curl, CURLOPT_USERAGENT, - PACKAGE_NAME"/"PACKAGE_VERSION); + curl_easy_setopt (wp->curl, CURLOPT_USERAGENT, COLLECTD_USERAGENT); curl_easy_setopt (wp->curl, CURLOPT_ERRORBUFFER, wp->curl_errbuf); curl_easy_setopt (wp->curl, CURLOPT_URL, wp->url); curl_easy_setopt (wp->curl, CURLOPT_FOLLOWLOCATION, 1L); @@ -419,6 +389,13 @@ static int cc_page_init_curl (web_page_t *wp) /* {{{ */ ssnprintf (wp->credentials, credentials_size, "%s:%s", wp->user, (wp->pass == NULL) ? "" : wp->pass); curl_easy_setopt (wp->curl, CURLOPT_USERPWD, wp->credentials); + + if (wp->digest) + { + curl_easy_setopt (wp->curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); + curl_easy_setopt (wp->curl, CURLOPT_USERNAME, wp->user); + curl_easy_setopt (wp->curl, CURLOPT_PASSWORD, wp->pass); + } } curl_easy_setopt (wp->curl, CURLOPT_SSL_VERIFYPEER, (long) wp->verify_peer); @@ -456,9 +433,11 @@ static int cc_config_add_page (oconfig_item_t *ci) /* {{{ */ 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->instance = strdup (ci->values[0].value.string); if (page->instance == NULL) @@ -475,26 +454,30 @@ static int cc_config_add_page (oconfig_item_t *ci) /* {{{ */ oconfig_item_t *child = ci->children + i; if (strcasecmp ("URL", child->key) == 0) - status = cc_config_add_string ("URL", &page->url, child); + status = cf_util_get_string (child, &page->url); else if (strcasecmp ("User", child->key) == 0) - status = cc_config_add_string ("User", &page->user, child); + status = cf_util_get_string (child, &page->user); else if (strcasecmp ("Password", child->key) == 0) - status = cc_config_add_string ("Password", &page->pass, child); + status = cf_util_get_string (child, &page->pass); + else if (strcasecmp ("Digest", child->key) == 0) + status = cf_util_get_boolean (child, &page->digest); else if (strcasecmp ("VerifyPeer", child->key) == 0) - status = cc_config_set_boolean ("VerifyPeer", &page->verify_peer, child); + status = cf_util_get_boolean (child, &page->verify_peer); else if (strcasecmp ("VerifyHost", child->key) == 0) - status = cc_config_set_boolean ("VerifyHost", &page->verify_host, child); + status = cf_util_get_boolean (child, &page->verify_host); else if (strcasecmp ("MeasureResponseTime", child->key) == 0) - status = cc_config_set_boolean (child->key, &page->response_time, child); + status = cf_util_get_boolean (child, &page->response_time); + else if (strcasecmp ("MeasureResponseCode", child->key) == 0) + status = cf_util_get_boolean (child, &page->response_code); else if (strcasecmp ("CACert", child->key) == 0) - status = cc_config_add_string ("CACert", &page->cacert, child); + status = cf_util_get_string (child, &page->cacert); else if (strcasecmp ("Match", child->key) == 0) /* Be liberal with failing matches => don't set `status'. */ cc_config_add_match (page, child); else if (strcasecmp ("Header", child->key) == 0) status = cc_config_append_string ("Header", &page->headers, child); else if (strcasecmp ("Post", child->key) == 0) - status = cc_config_add_string ("Post", &page->post_body, child); + status = cf_util_get_string (child, &page->post_body); else { WARNING ("curl plugin: Option `%s' not allowed here.", child->key); @@ -514,11 +497,12 @@ static int cc_config_add_page (oconfig_item_t *ci) /* {{{ */ status = -1; } - if (page->matches == NULL && !page->response_time) + if (page->matches == NULL && !page->response_time && !page->response_code) { assert (page->instance != NULL); WARNING ("curl plugin: No (valid) `Match' block " - "or MeasureResponseTime within `Page' block `%s'.", page->instance); + "or MeasureResponseTime or MeasureResponseCode within " + "`Page' block `%s'.", page->instance); status = -1; } @@ -612,17 +596,36 @@ static void cc_submit (const web_page_t *wp, const web_match_t *wm, /* {{{ */ sstrncpy (vl.plugin, "curl", sizeof (vl.plugin)); sstrncpy (vl.plugin_instance, wp->instance, sizeof (vl.plugin_instance)); sstrncpy (vl.type, wm->type, sizeof (vl.type)); - sstrncpy (vl.type_instance, wm->instance, sizeof (vl.type_instance)); + if (wm->instance != NULL) + sstrncpy (vl.type_instance, wm->instance, sizeof (vl.type_instance)); plugin_dispatch_values (&vl); } /* }}} void cc_submit */ -static void cc_submit_response_time (const web_page_t *wp, double seconds) /* {{{ */ +static void cc_submit_response_code (const web_page_t *wp, long code) /* {{{ */ { value_t values[1]; value_list_t vl = VALUE_LIST_INIT; - values[0].gauge = seconds; + values[0].gauge = code; + + vl.values = values; + vl.values_len = 1; + sstrncpy (vl.host, hostname_g, sizeof (vl.host)); + sstrncpy (vl.plugin, "curl", sizeof (vl.plugin)); + sstrncpy (vl.plugin_instance, wp->instance, sizeof (vl.plugin_instance)); + sstrncpy (vl.type, "response_code", sizeof (vl.type)); + + plugin_dispatch_values (&vl); +} /* }}} void cc_submit_response_code */ + +static void cc_submit_response_time (const web_page_t *wp, /* {{{ */ + cdtime_t response_time) +{ + value_t values[1]; + value_list_t vl = VALUE_LIST_INIT; + + values[0].gauge = CDTIME_T_TO_DOUBLE (response_time); vl.values = values; vl.values_len = 1; @@ -638,10 +641,10 @@ static int cc_read_page (web_page_t *wp) /* {{{ */ { web_match_t *wm; int status; - struct timeval start, end; + cdtime_t start = 0; if (wp->response_time) - gettimeofday (&start, NULL); + start = cdtime (); wp->buffer_fill = 0; status = curl_easy_perform (wp->curl); @@ -653,12 +656,18 @@ static int cc_read_page (web_page_t *wp) /* {{{ */ } if (wp->response_time) + cc_submit_response_time (wp, cdtime() - start); + + if(wp->response_code) { - double secs = 0; - gettimeofday (&end, NULL); - secs += end.tv_sec - start.tv_sec; - secs += (end.tv_usec - start.tv_usec) / 1000000.0; - cc_submit_response_time (wp, secs); + long response_code = 0; + status = curl_easy_getinfo(wp->curl, CURLINFO_RESPONSE_CODE, &response_code); + if(status != CURLE_OK) { + ERROR ("curl plugin: Fetching response code failed with staus %i: %s", + status, wp->curl_errbuf); + } else { + cc_submit_response_code(wp, response_code); + } } for (wm = wp->matches; wm != NULL; wm = wm->next)