From 2ccc87e7318c8412757a13a786078d8afe20e973 Mon Sep 17 00:00:00 2001 From: Stef Walter Date: Mon, 19 Jan 2009 18:27:00 +0000 Subject: Add support for creating multiple CFs in rrdbot-create. [Stoned Elipot] --- ChangeLog | 3 ++ configure.in | 4 +-- doc/rrdbot.conf.5 | 5 +-- tools/rrdbot-create.c | 93 +++++++++++++++++++++++++++++++++++++++------------ 4 files changed, 80 insertions(+), 25 deletions(-) diff --git a/ChangeLog b/ChangeLog index d7e4ea6..980181f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +0.9.4 [2009-01-19] + - Add support for creating multiple CFs in rrdbot-create. [Stoned Elipot] + 0.9.3 [2009-01-16] - Add support for printing out MIB name in rrdbot-get diff --git a/configure.in b/configure.in index fef519a..59744e2 100644 --- a/configure.in +++ b/configure.in @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. -AC_INIT(rrdbot, 0.9.2, stef@memberwebs.com) -AM_INIT_AUTOMAKE(rrdbot, 0.9.2) +AC_INIT(rrdbot, 0.9.4, stef@memberwebs.com) +AM_INIT_AUTOMAKE(rrdbot, 0.9.4) LDFLAGS="$LDFLAGS -L/usr/local/lib" CFLAGS="$CFLAGS -I/usr/local/include" diff --git a/doc/rrdbot.conf.5 b/doc/rrdbot.conf.5 index 0a31ce4..f4fceec 100644 --- a/doc/rrdbot.conf.5 +++ b/doc/rrdbot.conf.5 @@ -160,8 +160,9 @@ The example below describes three archives of "2 per minute for 1 week", rrdbot-create 8 ] .It Ar cf -This is the consolidation function to use to consolidate RRD values when -archiving them. This applies to all fields in the RRD. The valid settings are: +The consolidation functions to use to consolidate RRD values when +archiving them. This applies to all fields in the RRD. There can be multiple +functions specified, separated by commas. The valid functions are: .Bl -tag -width Fl .It Ar AVERAGE Average out the values when archiving them. diff --git a/tools/rrdbot-create.c b/tools/rrdbot-create.c index 23989bb..f79434f 100644 --- a/tools/rrdbot-create.c +++ b/tools/rrdbot-create.c @@ -74,6 +74,10 @@ #define VAL_MIN "MIN" #define VAL_MAX "MAX" #define VAL_LAST "LAST" +#define FLAG_AVERAGE 0x01 +#define FLAG_MIN 0x02 +#define FLAG_MAX 0x04 +#define FLAG_LAST 0x08 #define VAL_SECOND "second" #define VAL_SECONDS "seconds" @@ -137,7 +141,7 @@ typedef struct _create_ctx const char* confname; const char* rrdname; uint interval; - const char *cf; + int cfs; int create; int skip; @@ -211,7 +215,7 @@ context_reset(create_ctx* ctx) } ctx->confname = NULL; - ctx->cf = VAL_AVERAGE; + ctx->cfs = FLAG_AVERAGE; ctx->interval = 0; ctx->create = 0; @@ -316,8 +320,9 @@ create_file(create_ctx* ctx, const char* rrd) field_arg* field; int nargs = 0; uint rows, steps; - int argc, r; + int argc, r, cfs; const char** argv; + char *val_cf; if(!ctx->interval) { @@ -347,14 +352,32 @@ create_file(create_ctx* ctx, const char* rrd) continue; } rows = rra->total / (ctx->interval * steps); - - arg = (create_arg*)xcalloc(sizeof(create_arg)); - snprintf(arg->buf, sizeof(arg->buf), "RRA:%s:0.6:%d:%d", - ctx->cf, steps, rows); - arg->buf[sizeof(arg->buf) - 1] = 0; - arg->next = args; - args = arg; - nargs++; + cfs = ctx->cfs; + while (cfs) { + arg = (create_arg*)xcalloc(sizeof(create_arg)); + if (cfs & FLAG_AVERAGE) { + val_cf = VAL_AVERAGE; + cfs &= ~FLAG_AVERAGE; + } + else if (cfs & FLAG_MIN) { + val_cf = VAL_MIN; + cfs &= ~FLAG_MIN; + } + else if (cfs & FLAG_MAX) { + val_cf = VAL_MAX; + cfs &= ~FLAG_MAX; + } + else { + val_cf = VAL_LAST; + cfs &= ~FLAG_LAST; + } + snprintf(arg->buf, sizeof(arg->buf), "RRA:%s:0.6:%d:%d", + val_cf, steps, rows); + arg->buf[sizeof(arg->buf) - 1] = 0; + arg->next = args; + args = arg; + nargs++; + } } if(!nargs) @@ -513,6 +536,37 @@ unit_to_seconds(char* unit) return 0; } +static int +add_cfs(create_ctx* ctx, char* value) +{ + char* t; + int cfs = 0; + + while(value && *value) + { + /* Skip any delimiters, and parse next */ + value = value + strspn(value, " \t,"); + t = strchr(value, ','); + if(t) + *(t++) = 0; + strtrim(value); + if (strcmp(value, VAL_AVERAGE) == 0) + cfs |= FLAG_AVERAGE; + else if (strcmp(value, VAL_MIN) == 0) + cfs |= FLAG_MIN; + else if (strcmp(value, VAL_MAX) == 0) + cfs |= FLAG_MAX; + else if (strcmp(value, VAL_LAST) == 0) + cfs |= FLAG_LAST; + else { + warnx("%s: invalid 'cf' value: %s", ctx->confname, value); + return -1; + } + value = t; + } + return cfs; +} + static int add_rras(create_ctx* ctx, char* value) { @@ -679,18 +733,15 @@ cfg_value(const char* filename, const char* header, const char* name, if(strcmp(name, CONFIG_CF) == 0) { strupr(value); - if(strcmp(value, VAL_AVERAGE) == 0 || - strcmp(value, VAL_MIN) == 0 || - strcmp(value, VAL_MAX) == 0 || - strcmp(value, VAL_LAST) == 0) - { - ctx->cf = value; - } - else - { - warnx("%s: invalid 'cf' value: %s", ctx->confname, value); + int cfs = add_cfs(ctx, value); + if(cfs < 0) + { ctx->skip = 1; } + else + { + ctx->cfs = cfs; + } ctx->create = 0; return 0; -- cgit v1.2.3