/*****************************************************************************
- * RRDtool 1.2.23 Copyright by Tobi Oetiker, 1997-2007
+ * RRDtool 1.4.2 Copyright by Tobi Oetiker, 1997-2009
*****************************************************************************
* change header parameters of an rrd
*****************************************************************************
*
*****************************************************************************/
+#include <stdlib.h>
+#include <locale.h>
+
#include "rrd_tool.h"
#include "rrd_rpncalc.h"
#include "rrd_hw.h"
enum rra_par_en,
char *arg);
+int set_hwsmootharg(
+ rrd_t *rrd,
+ enum cf_en cf,
+ enum rra_par_en rra_par,
+ char *arg);
+
int rrd_tune(
int argc,
char **argv)
double max;
char dst[DST_SIZE];
rrd_file_t *rrd_file;
+ struct option long_options[] = {
+ {"heartbeat", required_argument, 0, 'h'},
+ {"minimum", required_argument, 0, 'i'},
+ {"maximum", required_argument, 0, 'a'},
+ {"data-source-type", required_argument, 0, 'd'},
+ {"data-source-rename", required_argument, 0, 'r'},
+ /* added parameter tuning options for aberrant behavior detection */
+ {"deltapos", required_argument, 0, 'p'},
+ {"deltaneg", required_argument, 0, 'n'},
+ {"window-length", required_argument, 0, 'w'},
+ {"failure-threshold", required_argument, 0, 'f'},
+ {"alpha", required_argument, 0, 'x'},
+ {"beta", required_argument, 0, 'y'},
+ {"gamma", required_argument, 0, 'z'},
+ {"gamma-deviation", required_argument, 0, 'v'},
+ {"smoothing-window", required_argument, 0, 's'},
+ {"smoothing-window-deviation", required_argument, 0, 'S'},
+ {"aberrant-reset", required_argument, 0, 'b'},
+ {0, 0, 0, 0}
+ };
optind = 0;
opterr = 0; /* initialize getopt */
+ rrd_init(&rrd);
rrd_file = rrd_open(argv[1], &rrd, RRD_READWRITE);
if (rrd_file == NULL) {
rrd_free(&rrd);
}
while (1) {
- static struct option long_options[] = {
- {"heartbeat", required_argument, 0, 'h'},
- {"minimum", required_argument, 0, 'i'},
- {"maximum", required_argument, 0, 'a'},
- {"data-source-type", required_argument, 0, 'd'},
- {"data-source-rename", required_argument, 0, 'r'},
- /* added parameter tuning options for aberrant behavior detection */
- {"deltapos", required_argument, 0, 'p'},
- {"deltaneg", required_argument, 0, 'n'},
- {"window-length", required_argument, 0, 'w'},
- {"failure-threshold", required_argument, 0, 'f'},
- {"alpha", required_argument, 0, 'x'},
- {"beta", required_argument, 0, 'y'},
- {"gamma", required_argument, 0, 'z'},
- {"gamma-deviation", required_argument, 0, 'v'},
- {"aberrant-reset", required_argument, 0, 'b'},
- {0, 0, 0, 0}
- };
int option_index = 0;
int opt;
+ char *old_locale = "";
opt = getopt_long(argc, argv, "h:i:a:d:r:p:n:w:f:x:y:z:v:b:",
long_options, &option_index);
optcnt++;
switch (opt) {
case 'h':
+ old_locale = setlocale(LC_NUMERIC, "C");
if ((matches =
sscanf(optarg, DS_NAM_FMT ":%ld", ds_nam,
&heartbeat)) != 2) {
rrd_set_error("invalid arguments for heartbeat");
rrd_free(&rrd);
rrd_close(rrd_file);
+ setlocale(LC_NUMERIC, old_locale);
return -1;
}
+ setlocale(LC_NUMERIC, old_locale);
if ((ds = ds_match(&rrd, ds_nam)) == -1) {
rrd_free(&rrd);
rrd_close(rrd_file);
break;
case 'i':
+ old_locale = setlocale(LC_NUMERIC, "C");
if ((matches =
sscanf(optarg, DS_NAM_FMT ":%lf", ds_nam, &min)) < 1) {
rrd_set_error("invalid arguments for minimum ds value");
rrd_free(&rrd);
rrd_close(rrd_file);
+ setlocale(LC_NUMERIC, old_locale);
return -1;
}
+ setlocale(LC_NUMERIC, old_locale);
if ((ds = ds_match(&rrd, ds_nam)) == -1) {
rrd_free(&rrd);
rrd_close(rrd_file);
break;
case 'a':
+ old_locale = setlocale(LC_NUMERIC, "C");
if ((matches =
sscanf(optarg, DS_NAM_FMT ":%lf", ds_nam, &max)) < 1) {
rrd_set_error("invalid arguments for maximum ds value");
rrd_free(&rrd);
rrd_close(rrd_file);
+ setlocale(LC_NUMERIC, old_locale);
return -1;
}
+ setlocale(LC_NUMERIC, old_locale);
if ((ds = ds_match(&rrd, ds_nam)) == -1) {
rrd_free(&rrd);
rrd_close(rrd_file);
rrd_close(rrd_file);
return -1;
}
- strncpy(rrd.ds_def[ds].dst, dst, DST_SIZE - 1);
- rrd.ds_def[ds].dst[DST_SIZE - 1] = '\0';
-
- rrd.pdp_prep[ds].last_ds[0] = 'U';
- rrd.pdp_prep[ds].last_ds[1] = 'N';
- rrd.pdp_prep[ds].last_ds[2] = 'K';
- rrd.pdp_prep[ds].last_ds[3] = 'N';
- rrd.pdp_prep[ds].last_ds[4] = '\0';
+ /* only reset when something is changed */
+ if (strncmp(rrd.ds_def[ds].dst, dst, DST_SIZE - 1) != 0) {
+ strncpy(rrd.ds_def[ds].dst, dst, DST_SIZE - 1);
+ rrd.ds_def[ds].dst[DST_SIZE - 1] = '\0';
+ rrd.pdp_prep[ds].last_ds[0] = 'U';
+ rrd.pdp_prep[ds].last_ds[1] = 'N';
+ rrd.pdp_prep[ds].last_ds[2] = 'K';
+ rrd.pdp_prep[ds].last_ds[3] = 'N';
+ rrd.pdp_prep[ds].last_ds[4] = '\0';
+ }
break;
case 'r':
if ((matches =
return -1;
}
break;
+ case 's':
+ strcpy(rrd.stat_head->version, RRD_VERSION); /* smoothing_window causes Version 4 */
+ if (set_hwsmootharg
+ (&rrd, CF_SEASONAL, RRA_seasonal_smoothing_window, optarg)) {
+ rrd_free(&rrd);
+ return -1;
+ }
+ break;
+ case 'S':
+ strcpy(rrd.stat_head->version, RRD_VERSION); /* smoothing_window causes Version 4 */
+ if (set_hwsmootharg
+ (&rrd, CF_DEVSEASONAL, RRA_seasonal_smoothing_window,
+ optarg)) {
+ rrd_free(&rrd);
+ return -1;
+ }
+ break;
case '?':
if (optopt != 0)
rrd_set_error("unknown option '%c'", optopt);
return 0;
}
+int set_hwsmootharg(
+ rrd_t *rrd,
+ enum cf_en cf,
+ enum rra_par_en rra_par,
+ char *arg)
+{
+ double param;
+ unsigned long i;
+ signed short rra_idx = -1;
+
+ /* read the value */
+ param = atof(arg);
+ /* in order to avoid smoothing of SEASONAL or DEVSEASONAL, we need to
+ * the 0.0 value*/
+ if (param < 0.0 || param > 1.0) {
+ rrd_set_error("Holt-Winters parameter must be between 0 and 1");
+ return -1;
+ }
+ /* does the appropriate RRA exist? */
+ for (i = 0; i < rrd->stat_head->rra_cnt; ++i) {
+ if (cf_conv(rrd->rra_def[i].cf_nam) == cf) {
+ rra_idx = i;
+ break;
+ }
+ }
+ if (rra_idx == -1) {
+ rrd_set_error("Holt-Winters RRA does not exist in this RRD");
+ return -1;
+ }
+
+ /* set the value */
+ rrd->rra_def[rra_idx].par[rra_par].u_val = param;
+ return 0;
+}
+
int set_deltaarg(
rrd_t *rrd,
enum rra_par_en rra_par,