X-Git-Url: https://git.octo.it/?a=blobdiff_plain;ds=sidebyside;f=src%2Fapache.c;h=3cda565074eb0376014946386856b8fba0f05ed8;hb=63c8e3eaa6260e4bf52dfe7b1927ed69447c3b93;hp=0bf52d3158ace12554ae436c1a2bde3ce1c4946b;hpb=cb7fed8bf0af2646dfcb32844933398c28e39be5;p=collectd.git diff --git a/src/apache.c b/src/apache.c index 0bf52d31..3cda5650 100644 --- a/src/apache.c +++ b/src/apache.c @@ -1,6 +1,7 @@ /** * collectd - src/apache.c - * Copyright (C) 2006 Florian octo Forster + * Copyright (C) 2006-2008 Florian octo Forster + * Copyright (C) 2007 Florent EppO Monbillard * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -17,92 +18,68 @@ * * Authors: * Florian octo Forster + * Florent EppO Monbillard + * - connections/lighttpd extension **/ #include "collectd.h" #include "common.h" #include "plugin.h" #include "configfile.h" -#include "utils_debug.h" - -#if HAVE_LIBCURL && HAVE_CURL_CURL_H -# define APACHE_HAVE_READ 1 -# include -#else -# define APACHE_HAVE_READ 0 -#endif - -/* Limit to 2^27 bytes/s. That's what a gigabit-ethernet link can handle, in - * theory. */ -static data_source_t apache_bytes_dsrc[1] = -{ - {"count", DS_TYPE_COUNTER, 0, 134217728.0}, -}; - -static data_set_t apache_bytes_ds = -{ - "apache_bytes", 1, apache_bytes_dsrc -}; - -/* Limit to 2^20 requests/s */ -static data_source_t apache_requests_dsrc[1] = -{ - {"count", DS_TYPE_COUNTER, 0, 134217728.0}, -}; - -static data_set_t apache_requests_ds = -{ - "apache_requests", 1, apache_requests_dsrc -}; - -static data_source_t apache_scoreboard_dsrc[1] = -{ - {"count", DS_TYPE_GAUGE, 0, 65535.0}, -}; -static data_set_t apache_scoreboard_ds = -{ - "apache_scoreboard", 1, apache_scoreboard_dsrc -}; +#include -#if APACHE_HAVE_READ -static char *url = NULL; -static char *user = NULL; -static char *pass = NULL; -static char *cacert = NULL; +static char *url = NULL; +static char *user = NULL; +static char *pass = NULL; +static char *verify_peer = NULL; +static char *verify_host = NULL; +static char *cacert = NULL; static CURL *curl = NULL; -#define ABUFFER_SIZE 16384 -static char apache_buffer[ABUFFER_SIZE]; -static int apache_buffer_len = 0; -static char apache_curl_error[CURL_ERROR_SIZE]; +static char *apache_buffer = NULL; +static size_t apache_buffer_size = 0; +static size_t apache_buffer_fill = 0; +static char apache_curl_error[CURL_ERROR_SIZE]; static const char *config_keys[] = { "URL", "User", "Password", - "CACert", - NULL + "VerifyPeer", + "VerifyHost", + "CACert" }; -static int config_keys_num = 4; +static int config_keys_num = STATIC_ARRAY_SIZE (config_keys); -static size_t apache_curl_callback (void *buf, size_t size, size_t nmemb, void *stream) +static size_t apache_curl_callback (void *buf, size_t size, size_t nmemb, + void *stream) { size_t len = size * nmemb; - if ((apache_buffer_len + len) >= ABUFFER_SIZE) - { - len = (ABUFFER_SIZE - 1) - apache_buffer_len; - } - if (len <= 0) return (len); - memcpy (apache_buffer + apache_buffer_len, (char *) buf, len); - apache_buffer_len += len; - apache_buffer[apache_buffer_len] = '\0'; + if ((apache_buffer_fill + len) >= apache_buffer_size) + { + char *temp; + + temp = (char *) realloc (apache_buffer, + apache_buffer_fill + len + 1); + if (temp == NULL) + { + ERROR ("apache plugin: realloc failed."); + return (0); + } + apache_buffer = temp; + apache_buffer_size = apache_buffer_fill + len + 1; + } + + memcpy (apache_buffer + apache_buffer_fill, (char *) buf, len); + apache_buffer_fill += len; + apache_buffer[apache_buffer_fill] = 0; return (len); } @@ -129,6 +106,10 @@ static int config (const char *key, const char *value) return (config_set (&user, value)); else if (strcasecmp (key, "password") == 0) return (config_set (&pass, value)); + else if (strcasecmp (key, "verifypeer") == 0) + return (config_set (&verify_peer, value)); + else if (strcasecmp (key, "verifyhost") == 0) + return (config_set (&verify_host, value)); else if (strcasecmp (key, "cacert") == 0) return (config_set (&cacert, value)); else @@ -139,6 +120,13 @@ static int init (void) { static char credentials[1024]; + if (url == NULL) + { + WARNING ("apache plugin: init: No URL configured, returning " + "an error."); + return (-1); + } + if (curl != NULL) { curl_easy_cleanup (curl); @@ -146,7 +134,7 @@ static int init (void) if ((curl = curl_easy_init ()) == NULL) { - syslog (LOG_ERR, "apache: `curl_easy_init' failed."); + ERROR ("apache plugin: init: `curl_easy_init' failed."); return (-1); } @@ -156,18 +144,40 @@ static int init (void) if (user != NULL) { - if (snprintf (credentials, 1024, "%s:%s", user, pass == NULL ? "" : pass) >= 1024) + int status; + + status = snprintf (credentials, sizeof (credentials), "%s:%s", + user, (pass == NULL) ? "" : pass); + if (status >= sizeof (credentials)) { - syslog (LOG_ERR, "apache: Credentials would have been truncated."); + ERROR ("apache plugin: init: Returning an error " + "because the credentials have been " + "truncated."); return (-1); } + credentials[sizeof (credentials) - 1] = '\0'; curl_easy_setopt (curl, CURLOPT_USERPWD, credentials); } - if (url != NULL) + curl_easy_setopt (curl, CURLOPT_URL, url); + + if ((verify_peer == NULL) || (strcmp (verify_peer, "true") == 0)) { - curl_easy_setopt (curl, CURLOPT_URL, url); + curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 1); + } + else + { + curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 0); + } + + if ((verify_host == NULL) || (strcmp (verify_host, "true") == 0)) + { + curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 2); + } + else + { + curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 0); } if (cacert != NULL) @@ -179,45 +189,51 @@ static int init (void) } /* int init */ static void submit_counter (const char *type, const char *type_instance, - unsigned long long value) + counter_t value) { value_t values[1]; value_list_t vl = VALUE_LIST_INIT; - DBG ("type = %s; type_instance = %s; value = %llu;", - type, type_instance, value); - values[0].counter = value; vl.values = values; vl.values_len = 1; vl.time = time (NULL); - strcpy (vl.host, hostname); + strcpy (vl.host, hostname_g); strcpy (vl.plugin, "apache"); strcpy (vl.plugin_instance, ""); - strncpy (vl.type_instance, type_instance, sizeof (vl.type_instance)); + + if (type_instance != NULL) + { + strncpy (vl.type_instance, type_instance, + sizeof (vl.type_instance)); + vl.type_instance[sizeof (vl.type_instance) - 1] = '\0'; + } plugin_dispatch_values (type, &vl); } /* void submit_counter */ static void submit_gauge (const char *type, const char *type_instance, - double value) + gauge_t value) { value_t values[1]; value_list_t vl = VALUE_LIST_INIT; - DBG ("type = %s; type_instance = %s; value = %lf;", - type, type_instance, value); - values[0].gauge = value; vl.values = values; vl.values_len = 1; vl.time = time (NULL); - strcpy (vl.host, hostname); + strcpy (vl.host, hostname_g); strcpy (vl.plugin, "apache"); strcpy (vl.plugin_instance, ""); - strncpy (vl.type_instance, type_instance, sizeof (vl.type_instance)); + + if (type_instance != NULL) + { + strncpy (vl.type_instance, type_instance, + sizeof (vl.type_instance)); + vl.type_instance[sizeof (vl.type_instance) - 1] = '\0'; + } plugin_dispatch_values (type, &vl); } /* void submit_counter */ @@ -278,6 +294,7 @@ static int apache_read (void) int i; char *ptr; + char *saveptr; char *lines[16]; int lines_num = 0; @@ -289,16 +306,17 @@ static int apache_read (void) if (url == NULL) return (-1); - apache_buffer_len = 0; + apache_buffer_fill = 0; if (curl_easy_perform (curl) != 0) { - syslog (LOG_ERR, "apache: curl_easy_perform failed: %s", + ERROR ("apache: curl_easy_perform failed: %s", apache_curl_error); return (-1); } ptr = apache_buffer; - while ((lines[lines_num] = strtok (ptr, "\n\r")) != NULL) + saveptr = NULL; + while ((lines[lines_num] = strtok_r (ptr, "\n\r", &saveptr)) != NULL) { ptr = NULL; lines_num++; @@ -326,25 +344,20 @@ static int apache_read (void) { if (strcmp (fields[0], "Scoreboard:") == 0) submit_scoreboard (fields[1]); + else if (strcmp (fields[0], "BusyServers:") == 0) + submit_gauge ("apache_connections", NULL, atol (fields[1])); } } - apache_buffer_len = 0; + apache_buffer_fill = 0; return (0); } /* int apache_read */ -#endif /* APACHE_HAVE_READ */ void module_register (void) { - plugin_register_data_set (&apache_bytes_ds); - plugin_register_data_set (&apache_requests_ds); - plugin_register_data_set (&apache_scoreboard_ds); - -#if APACHE_HAVE_READ plugin_register_config ("apache", config, config_keys, config_keys_num); plugin_register_init ("apache", init); plugin_register_read ("apache", apache_read); -#endif -} +} /* void module_register */