X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrdcached.c;h=11c1c6a7f85c3e96c2380602094c81f09e4bb97f;hb=3b473acc5d4d27e5cf5101a4b8cc8a21c2bb7262;hp=aab8c11ebdb77dcf0c5939a32599ce7cad5bb5b6;hpb=3bd6fcdfd20002eee1f1803460728449c0c98f86;p=collectd.git diff --git a/src/rrdcached.c b/src/rrdcached.c index aab8c11e..11c1c6a7 100644 --- a/src/rrdcached.c +++ b/src/rrdcached.c @@ -25,20 +25,12 @@ #include "utils_rrdcreate.h" #undef HAVE_CONFIG_H +#include #include /* * 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; @@ -57,18 +49,28 @@ static rrdcreate_config_t rrdcreate_config = /* 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; @@ -159,55 +161,91 @@ static int value_list_to_filename (char *buffer, int buffer_len, 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 */ @@ -325,7 +363,7 @@ static int rc_init (void) 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; @@ -403,6 +441,41 @@ static int rc_write (const data_set_t *ds, const value_list_t *vl, 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 (); @@ -411,10 +484,8 @@ static int rc_shutdown (void) 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 */