diff --git a/src/rrdcached.c b/src/rrdcached.c
index 34e860ba6dc72ccff994e7dc999ca79682292c63..3518f2dd0d28fddfad1c616b0347813602a9c6dd 100644 (file)
--- a/src/rrdcached.c
+++ b/src/rrdcached.c
/**
* collectd - src/rrdcached.c
- * Copyright (C) 2008 Florian octo Forster
+ * Copyright (C) 2008-2013 Florian octo Forster
*
* 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
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* Authors:
- * Florian octo Forster <octo at verplant.org>
+ * Florian octo Forster <octo at collectd.org>
**/
#include "collectd.h"
/*
* Private variables
*/
-static const char *config_keys[] =
-{
- "DaemonAddress",
- "DataDir",
- "CreateFiles",
- "CollectStatistics"
-};
-static int config_keys_num = STATIC_ARRAY_SIZE (config_keys);
-
static char *datadir = NULL;
static char *daemon_address = NULL;
static int config_create_files = 1;
/* consolidation_functions_num = */ 0
};
+/*
+ * Prototypes.
+ */
+static int rc_write (const data_set_t *ds, const value_list_t *vl,
+ user_data_t __attribute__((unused)) *user_data);
+static int rc_flush (__attribute__((unused)) cdtime_t timeout,
+ const char *identifier, __attribute__((unused)) user_data_t *ud);
+
static int value_list_to_string (char *buffer, int buffer_len,
const data_set_t *ds, const value_list_t *vl)
{
int offset;
int status;
int i;
+ time_t t;
assert (0 == strcmp (ds->type, vl->type));
memset (buffer, '\0', buffer_len);
- status = ssnprintf (buffer, buffer_len, "%u", (unsigned int) vl->time);
+ t = CDTIME_T_TO_TIME_T (vl->time);
+ status = ssnprintf (buffer, buffer_len, "%lu", (unsigned long) t);
if ((status < 1) || (status >= buffer_len))
return (-1);
offset = status;
return (0);
} /* int value_list_to_filename */
-static int rc_config (const char *key, const char *value)
+static const char *config_get_string (oconfig_item_t *ci)
{
- if (strcasecmp ("DataDir", key) == 0)
+ if ((ci->children_num != 0) || (ci->values_num != 1)
+ || ((ci->values[0].type != OCONFIG_TYPE_STRING)
+ && (ci->values[0].type != OCONFIG_TYPE_BOOLEAN)))
{
- if (datadir != NULL)
- free (datadir);
- datadir = strdup (value);
- if (datadir != NULL)
+ ERROR ("rrdcached plugin: %s expects a single string argument.",
+ ci->key);
+ return (NULL);
+ }
+
+ if (ci->values[0].type == OCONFIG_TYPE_BOOLEAN) {
+ if (ci->values[0].value.boolean)
+ return "true";
+ else
+ return "false";
+ }
+ return (ci->values[0].value.string);
+} /* const char *config_get_string */
+
+static int rc_config (oconfig_item_t *ci)
+{
+ int i;
+
+ for (i = 0; i < ci->children_num; ++i) {
+ const char *key = ci->children[i].key;
+ const char *value = config_get_string (ci->children + i);
+
+ if (value == NULL) /* config_get_strings prints error message */
+ continue;
+
+ if (strcasecmp ("DataDir", key) == 0)
{
- int len = strlen (datadir);
- while ((len > 0) && (datadir[len - 1] == '/'))
+ if (datadir != NULL)
+ free (datadir);
+ datadir = strdup (value);
+ if (datadir != NULL)
{
- len--;
- datadir[len] = '\0';
+ int len = strlen (datadir);
+ while ((len > 0) && (datadir[len - 1] == '/'))
+ {
+ len--;
+ datadir[len] = '\0';
+ }
+ if (len <= 0)
+ {
+ free (datadir);
+ datadir = NULL;
+ }
}
- if (len <= 0)
+ }
+ else if (strcasecmp ("DaemonAddress", key) == 0)
+ {
+ sfree (daemon_address);
+ daemon_address = strdup (value);
+ if (daemon_address == NULL)
{
- free (datadir);
- datadir = NULL;
+ ERROR ("rrdcached plugin: strdup failed.");
+ continue;
}
}
- }
- else if (strcasecmp ("DaemonAddress", key) == 0)
- {
- sfree (daemon_address);
- daemon_address = strdup (value);
- if (daemon_address == NULL)
+ else if (strcasecmp ("CreateFiles", key) == 0)
{
- ERROR ("rrdcached plugin: strdup failed.");
- return (1);
+ if (IS_FALSE (value))
+ config_create_files = 0;
+ else
+ config_create_files = 1;
+ }
+ else if (strcasecmp ("CollectStatistics", key) == 0)
+ {
+ if (IS_FALSE (value))
+ config_collect_stats = 0;
+ else
+ config_collect_stats = 1;
}
- }
- else if (strcasecmp ("CreateFiles", key) == 0)
- {
- if (IS_FALSE (value))
- config_create_files = 0;
- else
- config_create_files = 1;
- }
- else if (strcasecmp ("CollectStatistics", key) == 0)
- {
- if (IS_FALSE (value))
- config_collect_stats = 0;
else
- config_collect_stats = 1;
+ {
+ WARNING ("rrdcached plugin: Ignoring invalid option %s.", key);
+ continue;
+ }
}
- else
- {
- return (-1);
+
+ if (daemon_address != NULL) {
+ plugin_register_write ("rrdcached", rc_write, /* user_data = */ NULL);
+ plugin_register_flush ("rrdcached", rc_flush, /* user_data = */ NULL);
}
return (0);
} /* int rc_config */
sstrncpy (vl.host, daemon_address, sizeof (vl.host));
sstrncpy (vl.plugin, "rrdcached", sizeof (vl.plugin));
+ status = rrdc_connect (daemon_address);
+ if (status != 0)
+ {
+ ERROR ("rrdcached plugin: rrdc_connect (%s) failed with status %i.",
+ daemon_address, status);
+ return (-1);
+ }
+
head = NULL;
status = rrdc_stats_get (&head);
if (status != 0)
static int rc_write (const data_set_t *ds, const value_list_t *vl,
user_data_t __attribute__((unused)) *user_data)
{
- char filename[512];
+ char filename[PATH_MAX];
char values[512];
char *values_array[2];
int status;
return (0);
} /* int rc_write */
+static int rc_flush (__attribute__((unused)) cdtime_t timeout, /* {{{ */
+ const char *identifier,
+ __attribute__((unused)) user_data_t *ud)
+{
+ char filename[PATH_MAX + 1];
+ int status;
+
+ if (identifier == NULL)
+ return (EINVAL);
+
+ if (datadir != NULL)
+ ssnprintf (filename, sizeof (filename), "%s/%s.rrd", datadir, identifier);
+ else
+ ssnprintf (filename, sizeof (filename), "%s.rrd", identifier);
+
+ status = rrdc_connect (daemon_address);
+ if (status != 0)
+ {
+ ERROR ("rrdcached plugin: rrdc_connect (%s) failed with status %i.",
+ daemon_address, status);
+ return (-1);
+ }
+
+ status = rrdc_flush (filename);
+ if (status != 0)
+ {
+ ERROR ("rrdcached plugin: rrdc_flush (%s) failed with status %i.",
+ filename, status);
+ return (-1);
+ }
+ DEBUG ("rrdcached plugin: rrdc_flush (%s): Success.", filename);
+
+ return (0);
+} /* }}} int rc_flush */
+
static int rc_shutdown (void)
{
rrdc_disconnect ();
void module_register (void)
{
- plugin_register_config ("rrdcached", rc_config,
- config_keys, config_keys_num);
+ plugin_register_complex_config ("rrdcached", rc_config);
plugin_register_init ("rrdcached", rc_init);
- plugin_register_write ("rrdcached", rc_write, /* user_data = */ NULL);
plugin_register_shutdown ("rrdcached", rc_shutdown);
} /* void module_register */