sensors plugin: Simple fix for temperature sensors.
[collectd.git] / src / apache.c
index 0bf52d3..280c687 100644 (file)
@@ -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
  *
  * Authors:
  *   Florian octo Forster <octo at verplant.org>
+ *   Florent EppO Monbillard <eppo at darox.net>
+ *   - 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 <curl/curl.h>
-#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
-};
+#include <curl/curl.h>
 
-/* 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
-};
-
-#if APACHE_HAVE_READ
 static char *url    = NULL;
 static char *user   = NULL;
 static char *pass   = NULL;
@@ -83,10 +46,9 @@ static const char *config_keys[] =
        "URL",
        "User",
        "Password",
-       "CACert",
-       NULL
+       "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)
 {
@@ -139,6 +101,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 +115,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,19 +125,23 @@ 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);
-       }
+       curl_easy_setopt (curl, CURLOPT_URL, url);
 
        if (cacert != NULL)
        {
@@ -179,45 +152,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 +257,7 @@ static int apache_read (void)
        int i;
 
        char *ptr;
+       char *saveptr;
        char *lines[16];
        int   lines_num = 0;
 
@@ -292,13 +272,14 @@ static int apache_read (void)
        apache_buffer_len = 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,6 +307,8 @@ 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]));
                }
        }
 
@@ -333,18 +316,11 @@ static int apache_read (void)
 
        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 */