diff --git a/src/rrd_tool.c b/src/rrd_tool.c
index 5a56a96d41281a6aa95d09bb71e62615194cb932..e481fa352bfb42bcd2218c272a4089543285087f 100644 (file)
--- a/src/rrd_tool.c
+++ b/src/rrd_tool.c
/*****************************************************************************
/*****************************************************************************
- * RRDtool 1.4.2 Copyright by Tobi Oetiker, 1997-2009
+ * RRDtool 1.4.3 Copyright by Tobi Oetiker, 1997-2010
*****************************************************************************
* rrd_tool.c Startup wrapper
*****************************************************************************/
*****************************************************************************
* rrd_tool.c Startup wrapper
*****************************************************************************/
-#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__) && !defined(HAVE_CONFIG_H)
+#if defined(WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__) && !defined(HAVE_CONFIG_H)
#include "../win32/config.h"
#include <stdlib.h>
#include <sys/stat.h>
#include "../win32/config.h"
#include <stdlib.h>
#include <sys/stat.h>
+#include <io.h>
+#include <fcntl.h>
#else
#ifdef HAVE_CONFIG_H
#include "../rrd_config.h"
#else
#ifdef HAVE_CONFIG_H
#include "../rrd_config.h"
N_("* create - create a new RRD\n\n"
"\trrdtool create filename [--start|-b start time]\n"
"\t\t[--step|-s step]\n"
N_("* create - create a new RRD\n\n"
"\trrdtool create filename [--start|-b start time]\n"
"\t\t[--step|-s step]\n"
+ "\t\t[--no-overwrite|-O]\n"
"\t\t[DS:ds-name:DST:dst arguments]\n"
"\t\t[RRA:CF:cf arguments]\n");
"\t\t[DS:ds-name:DST:dst arguments]\n"
"\t\t[RRA:CF:cf arguments]\n");
N_("* xport - generate XML dump from one or several RRD\n\n"
"\trrdtool xport [-s|--start seconds] [-e|--end seconds]\n"
"\t\t[-m|--maxrows rows]\n" "\t\t[--step seconds]\n"
N_("* xport - generate XML dump from one or several RRD\n\n"
"\trrdtool xport [-s|--start seconds] [-e|--end seconds]\n"
"\t\t[-m|--maxrows rows]\n" "\t\t[--step seconds]\n"
- "\t\t[--enumds]\n" "\t\t[DEF:vname=rrd:ds-name:CF]\n"
+ "\t\t[--enumds] [--json]\n" "\t\t[DEF:vname=rrd:ds-name:CF]\n"
"\t\t[CDEF:vname=rpn-expression]\n"
"\t\t[XPORT:vname:legend]\n");
const char *help_quit =
"\t\t[CDEF:vname=rpn-expression]\n"
"\t\t[XPORT:vname:legend]\n");
const char *help_quit =
according to localeconv(3) */
setlocale(LC_ALL, "");
according to localeconv(3) */
setlocale(LC_ALL, "");
+#if defined(WIN32) && !defined(__CYGWIN__)
+ setmode(fileno(stdout), O_BINARY);
+ setmode(fileno(stdin), O_BINARY);
+#endif
+
+
#if defined(HAVE_LIBINTL_H) && defined(BUILD_LIBINTL)
bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
textdomain(GETTEXT_PACKAGE);
#if defined(HAVE_LIBINTL_H) && defined(BUILD_LIBINTL)
bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
textdomain(GETTEXT_PACKAGE);
*/
if (RemoteMode) {
if (argc > 1 && strcmp("quit", argv[1]) == 0) {
*/
if (RemoteMode) {
if (argc > 1 && strcmp("quit", argv[1]) == 0) {
- if (argc > 2) {
+ if (argc != 2) {
printf("ERROR: invalid parameter count for quit\n");
return (1);
}
printf("ERROR: invalid parameter count for quit\n");
return (1);
}
}
#if defined(HAVE_OPENDIR) && defined(HAVE_READDIR) && defined(HAVE_CHDIR)
if (argc > 1 && strcmp("cd", argv[1]) == 0) {
}
#if defined(HAVE_OPENDIR) && defined(HAVE_READDIR) && defined(HAVE_CHDIR)
if (argc > 1 && strcmp("cd", argv[1]) == 0) {
- if (argc > 3) {
+ if (argc != 3) {
printf("ERROR: invalid parameter count for cd\n");
return (1);
}
printf("ERROR: invalid parameter count for cd\n");
return (1);
}
}
if (argc > 1 && strcmp("pwd", argv[1]) == 0) {
char *cwd; /* To hold current working dir on call to pwd */
}
if (argc > 1 && strcmp("pwd", argv[1]) == 0) {
char *cwd; /* To hold current working dir on call to pwd */
- if (argc > 2) {
+ if (argc != 2) {
printf("ERROR: invalid parameter count for pwd\n");
return (1);
}
printf("ERROR: invalid parameter count for pwd\n");
return (1);
}
return (0);
}
if (argc > 1 && strcmp("mkdir", argv[1]) == 0) {
return (0);
}
if (argc > 1 && strcmp("mkdir", argv[1]) == 0) {
- if (argc > 3) {
+ if (argc != 3) {
printf("ERROR: invalid parameter count for mkdir\n");
return (1);
}
printf("ERROR: invalid parameter count for mkdir\n");
return (1);
}
return (0);
}
if (argc > 1 && strcmp("ls", argv[1]) == 0) {
return (0);
}
if (argc > 1 && strcmp("ls", argv[1]) == 0) {
- if (argc > 2) {
+ if (argc != 2) {
printf("ERROR: invalid parameter count for ls\n");
return (1);
}
printf("ERROR: invalid parameter count for ls\n");
return (1);
}
if (rrd_fetch
(argc - 1, &argv[1], &start, &end, &step, &ds_cnt, &ds_namv,
if (rrd_fetch
(argc - 1, &argv[1], &start, &end, &step, &ds_cnt, &ds_namv,
- &data) != -1) {
+ &data) == 0) {
datai = data;
printf(" ");
for (i = 0; i < ds_cnt; i++)
datai = data;
printf(" ");
for (i = 0; i < ds_cnt; i++)
free(data);
}
} else if (strcmp("xport", argv[1]) == 0) {
free(data);
}
} else if (strcmp("xport", argv[1]) == 0) {
+#ifdef HAVE_RRD_GRAPH
int xxsize;
unsigned long int j = 0;
time_t start, end, ti;
int xxsize;
unsigned long int j = 0;
time_t start, end, ti;
rrd_value_t *data, *ptr;
char **legend_v;
int enumds = 0;
rrd_value_t *data, *ptr;
char **legend_v;
int enumds = 0;
+ int json = 0;
int i;
size_t vtag_s = strlen(COL_DATA_TAG) + 10;
char *vtag = malloc(vtag_s);
int i;
size_t vtag_s = strlen(COL_DATA_TAG) + 10;
char *vtag = malloc(vtag_s);
for (i = 2; i < argc; i++) {
if (strcmp("--enumds", argv[i]) == 0)
enumds = 1;
for (i = 2; i < argc; i++) {
if (strcmp("--enumds", argv[i]) == 0)
enumds = 1;
+ if (strcmp("--json", argv[i]) == 0)
+ json = 1;
}
if (rrd_xport
(argc - 1, &argv[1], &xxsize, &start, &end, &step, &col_cnt,
}
if (rrd_xport
(argc - 1, &argv[1], &xxsize, &start, &end, &step, &col_cnt,
- &legend_v, &data) != -1) {
- char *old_locale = setlocale(LC_NUMERIC, "C");
+ &legend_v, &data) == 0) {
+ char *old_locale = setlocale(LC_NUMERIC,NULL);
+ setlocale(LC_NUMERIC, "C");
row_cnt = (end - start) / step;
ptr = data;
row_cnt = (end - start) / step;
ptr = data;
- printf("<?xml version=\"1.0\" encoding=\"%s\"?>\n\n",
- XML_ENCODING);
- printf("<%s>\n", ROOT_TAG);
- printf(" <%s>\n", META_TAG);
- printf(" <%s>%lu</%s>\n", META_START_TAG,
- (unsigned long) start + step, META_START_TAG);
- printf(" <%s>%lu</%s>\n", META_STEP_TAG, step, META_STEP_TAG);
- printf(" <%s>%lu</%s>\n", META_END_TAG, (unsigned long) end,
- META_END_TAG);
- printf(" <%s>%lu</%s>\n", META_ROWS_TAG, row_cnt,
- META_ROWS_TAG);
- printf(" <%s>%lu</%s>\n", META_COLS_TAG, col_cnt,
- META_COLS_TAG);
- printf(" <%s>\n", LEGEND_TAG);
+ if (json == 0){
+ printf("<?xml version=\"1.0\" encoding=\"%s\"?>\n\n",
+ XML_ENCODING);
+ printf("<%s>\n", ROOT_TAG);
+ printf(" <%s>\n", META_TAG);
+ }
+ else {
+ printf("{ about: 'RRDtool xport JSON output',\n meta: {\n");
+ }
+
+
+#define pXJV(indent,fmt,tag,value) \
+ if (json) { \
+ printf(indent "%s: " fmt ",\n",tag,value); \
+ } else { \
+ printf(indent "<%s>" fmt "</%s>\n",tag,value,tag); \
+ }
+
+ pXJV(" ","%lld",META_START_TAG,(long long int) start + step);
+ pXJV(" ","%lu", META_STEP_TAG, step);
+ pXJV(" ","%lld",META_END_TAG,(long long int) start + step);
+ if (! json){
+ pXJV(" ","%lu", META_ROWS_TAG, row_cnt);
+ pXJV(" ","%lu", META_COLS_TAG, col_cnt);
+ }
+
+ if (json){
+ printf(" %s: [\n", LEGEND_TAG);
+ }
+ else {
+ printf(" <%s>\n", LEGEND_TAG);
+ }
for (j = 0; j < col_cnt; j++) {
char *entry = NULL;
for (j = 0; j < col_cnt; j++) {
char *entry = NULL;
-
entry = legend_v[j];
entry = legend_v[j];
- printf(" <%s>%s</%s>\n", LEGEND_ENTRY_TAG, entry,
+ if (json){
+ printf(" '%s'", entry);
+ if (j < col_cnt -1){
+ printf(",");
+ }
+ printf("\n");
+ }
+ else {
+ printf(" <%s>%s</%s>\n", LEGEND_ENTRY_TAG, entry,
LEGEND_ENTRY_TAG);
LEGEND_ENTRY_TAG);
+ }
free(entry);
}
free(legend_v);
free(entry);
}
free(legend_v);
- printf(" </%s>\n", LEGEND_TAG);
- printf(" </%s>\n", META_TAG);
- printf(" <%s>\n", DATA_TAG);
+ if (json){
+ printf(" ]\n },\n");
+ }
+ else {
+ printf(" </%s>\n", LEGEND_TAG);
+ printf(" </%s>\n", META_TAG);
+ }
+
+ if (json){
+ printf(" %s: [\n",DATA_TAG);
+ } else {
+ printf(" <%s>\n", DATA_TAG);
+ }
for (ti = start + step; ti <= end; ti += step) {
for (ti = start + step; ti <= end; ti += step) {
- printf(" <%s>", DATA_ROW_TAG);
- printf("<%s>%lu</%s>", COL_TIME_TAG, ti, COL_TIME_TAG);
+ if (json){
+ printf(" [ ");
+ }
+ else {
+ printf(" <%s>", DATA_ROW_TAG);
+ printf("<%s>%lld</%s>", COL_TIME_TAG, (long long int)ti, COL_TIME_TAG);
+ }
for (j = 0; j < col_cnt; j++) {
rrd_value_t newval = DNAN;
for (j = 0; j < col_cnt; j++) {
rrd_value_t newval = DNAN;
-
- if (enumds == 1)
-
- snprintf(vtag, vtag_s, "%s%lu", COL_DATA_TAG, j);
- else
- snprintf(vtag, vtag_s, "%s", COL_DATA_TAG);
newval = *ptr;
newval = *ptr;
- if (isnan(newval)) {
- printf("<%s>NaN</%s>", vtag, vtag);
- } else {
- printf("<%s>%0.10e</%s>", vtag, newval, vtag);
- };
+ if (json){
+ if (isnan(newval)){
+ printf("null");
+ } else {
+ printf("%0.10e",newval);
+ }
+ if (j < col_cnt -1){
+ printf(", ");
+ }
+ }
+ else {
+ if (enumds == 1)
+ snprintf(vtag, vtag_s, "%s%lu", COL_DATA_TAG, j);
+ else
+ snprintf(vtag, vtag_s, "%s", COL_DATA_TAG);
+ if (isnan(newval)) {
+ printf("<%s>NaN</%s>", vtag, vtag);
+ } else {
+ printf("<%s>%0.10e</%s>", vtag, newval, vtag);
+ };
+ }
ptr++;
ptr++;
+ }
+ if (json){
+ printf(ti < end ? " ],\n" : " ]\n");
+ }
+ else {
+ printf("</%s>\n", DATA_ROW_TAG);
}
}
- printf("</%s>\n", DATA_ROW_TAG);
}
free(data);
}
free(data);
- printf(" </%s>\n", DATA_TAG);
- printf("</%s>\n", ROOT_TAG);
+ if (json){
+ printf(" ]\n}\n");
+ }
+ else {
+ printf(" </%s>\n", DATA_TAG);
+ printf("</%s>\n", ROOT_TAG);
+ }
setlocale(LC_NUMERIC, old_locale);
}
free(vtag);
setlocale(LC_NUMERIC, old_locale);
}
free(vtag);
+#else
+ rrd_set_error("the instance of rrdtool has been compiled without graphics");
+#endif
} else if (strcmp("graph", argv[1]) == 0) {
} else if (strcmp("graph", argv[1]) == 0) {
+#ifdef HAVE_RRD_GRAPH
char **calcpr;
#ifdef notused /*XXX*/
char **calcpr;
#ifdef notused /*XXX*/
}
if (rrd_graph
(argc - 1, &argv[1], &calcpr, &xsize, &ysize, NULL, &ymin,
}
if (rrd_graph
(argc - 1, &argv[1], &calcpr, &xsize, &ysize, NULL, &ymin,
- &ymax) != -1) {
+ &ymax) == 0) {
if (!tostdout && !imginfo)
printf("%dx%d\n", xsize, ysize);
if (calcpr) {
if (!tostdout && !imginfo)
printf("%dx%d\n", xsize, ysize);
if (calcpr) {
}
}
}
}
+#else
+ rrd_set_error("the instance of rrdtool has been compiled without graphics");
+#endif
} else if (strcmp("graphv", argv[1]) == 0) {
} else if (strcmp("graphv", argv[1]) == 0) {
+#ifdef HAVE_RRD_GRAPH
rrd_info_t *grinfo = NULL; /* 1 to distinguish it from the NULL that rrd_graph sends in */
grinfo = rrd_graph_v(argc - 1, &argv[1]);
rrd_info_t *grinfo = NULL; /* 1 to distinguish it from the NULL that rrd_graph sends in */
grinfo = rrd_graph_v(argc - 1, &argv[1]);
rrd_info_print(grinfo);
rrd_info_free(grinfo);
}
rrd_info_print(grinfo);
rrd_info_free(grinfo);
}
-
+#else
+ rrd_set_error("the instance of rrdtool has been compiled without graphics");
+#endif
} else if (strcmp("tune", argv[1]) == 0)
rrd_tune(argc - 1, &argv[1]);
} else if (strcmp("tune", argv[1]) == 0)
rrd_tune(argc - 1, &argv[1]);
+#ifndef WIN32
else if (strcmp("flushcached", argv[1]) == 0)
rrd_flushcached(argc - 1, &argv[1]);
else if (strcmp("flushcached", argv[1]) == 0)
rrd_flushcached(argc - 1, &argv[1]);
+#endif
else {
rrd_set_error("unknown function '%s'", argv[1]);
}
else {
rrd_set_error("unknown function '%s'", argv[1]);
}