int main(int argc, char *argv[]) { char *rrdargs[] = { "rrdgraph", "bbgen.png", "-s", "e - 48d", "--title", "bbgen runtime last 48 days", "-w576", "-v", "Seconds", "-a", "PNG", "DEF:rt=bbgen.rrd:runtime:AVERAGE", "AREA:rt#00CCCC:Run Time", "COMMENT: Timestamp", NULL }; char **calcpr=NULL; int pcount, result, xsize, ysize; double ymin, ymax; for (pcount = 0; (rrdargs[pcount]); pcount++); rrd_clear_error(); #ifdef RRDTOOL12 result = rrd_graph(pcount, rrdargs, &calcpr, &xsize, &ysize, NULL, &ymin, &ymax); #else result = rrd_graph(pcount, rrdargs, &calcpr, &xsize, &ysize); #endif return 0; }
VALUE rb_rrd_graph( VALUE self, VALUE args) { string_arr a; char **calcpr, **p; VALUE result, print_results; int xsize, ysize; double ymin, ymax; a = string_arr_new(args); reset_rrd_state(); rrd_graph(a.len, a.strings, &calcpr, &xsize, &ysize, NULL, &ymin, &ymax); string_arr_delete(a); RRD_CHECK_ERROR result = rb_ary_new2(3); print_results = rb_ary_new(); p = calcpr; for (p = calcpr; p && *p; p++) { rb_ary_push(print_results, rb_str_new2(*p)); rrd_freemem(*p); } rrd_freemem(calcpr); rb_ary_store(result, 0, print_results); rb_ary_store(result, 1, INT2FIX(xsize)); rb_ary_store(result, 2, INT2FIX(ysize)); return result; }
int wrap_rrd_graph(char *argstr, FILE *fd) { char **prdata = NULL, // must be passed to the rrd_graph function but does not need to be initialised **argv = NULL; int i, argc, xsize = 0, // must be passed to the rrd_graph function but does not need to be initialised ysize = 0; // must be passed to the rrd_graph function but does not need to be initialised double ymin, // must be passed to the rrd_graph function but does not need to be initialised ymax; // must be passed to the rrd_graph function but does not need to be initialised if((argv = string_to_argv(argstr, &argc)) != NULL) { optind=0; /* reset gnu getopt */ opterr=0; /* no error messages */ i = rrd_graph(argc, argv, &prdata, &xsize, &ysize, fd, &ymin, &ymax); // free up the memory Free_argv(argv); return i; } else { // error return (-1); } }
char *drawgraph( long argc, const char **args) { int i, xsize, ysize; double ymin, ymax; for (i = 0; i < argc; i++) if (strcmp(args[i], "--imginfo") == 0 || strcmp(args[i], "-g") == 0) break; if (i == argc) { args[argc++] = "--imginfo"; args[argc++] = "<IMG SRC=\"./%s\" WIDTH=\"%lu\" HEIGHT=\"%lu\">"; } calfree(); if (rrd_graph (argc + 1, (char **) args - 1, &calcpr, &xsize, &ysize, NULL, &ymin, &ymax) != -1) { return stralloc(calcpr[0]); } else { if (rrd_test_error()) { const size_t len = strlen(rrd_get_error()) + DS_NAM_SIZE; char *err = malloc(len); snprintf(err, len, "[ERROR: %s]", rrd_get_error()); rrd_clear_error(); return err; } } return NULL; }
JNIEXPORT jobject JNICALL Java_gnu_rrd_RRDJNI_graph (JNIEnv *env, jclass cl, jobjectArray argv) { char **argv2; char **calcpr; char* info; const char* fn; int asize = 0; int i, j, xsize, ysize; double ymin, ymax; jcharArray graph; jclass RRDGraphClass; jmethodID RRDGraphMethodInit; jmethodID RRDGraphMethodSetElement; jobject graphObj = NULL; jobject o; o = (*env)->GetObjectArrayElement(env, argv, 0); fn = (*env)->GetStringUTFChars(env, (jstring)o, NULL); if (strcmp(fn,"-")==0) { throwException(env, "gnu/rrd/RRDException", "output to stdout is not supported."); return; } RRDGraphClass = (*env)->FindClass(env, "gnu/rrd/RRDGraph"); RRDGraphMethodInit = (*env)->GetMethodID(env, RRDGraphClass, "<init>", "(Ljava/lang/String;Ljava/lang/String;IIDD)V"); calcpr = NULL; argv2 = initArgs(env, argv, "graph"); if (rrd_graph((*env)->GetArrayLength(env, argv)+1, argv2, &calcpr, &xsize, &ysize, NULL, &ymin, &ymax) != -1 ) { if (calcpr) { for(i = 0; calcpr[i]; i++) asize = asize + strlen(calcpr[i]) + 1; if((info = (char*)malloc(asize+1))==NULL) { throwException(env, "gnu/rrd/RRDException", "unable to allocate memory for graph information."); freeArgs(env, argv, argv2); free(calcpr); return; } else { for(i = 0; calcpr[i]; i++){ if (i>0) info = strcat(strcat(info, "\n"), calcpr[i]); else info = strcat(info, calcpr[i]); free(calcpr[i]); } } free(calcpr); } graphObj = (*env)->NewObject(env, RRDGraphClass, RRDGraphMethodInit, (jstring)(*env)->GetObjectArrayElement(env, argv, 0), (jstring)(*env)->NewStringUTF(env, info), (jint)xsize, (jint)ysize, (jdouble)ymin, (jdouble)ymax); } freeArgs(env, argv, argv2); if (rrd_test_error()) throwException(env, "gnu/rrd/RRDException", rrd_get_error()); return graphObj; }
static PyObject *PyRRD_graph( PyObject UNUSED(*self), PyObject * args) { PyObject *r; char **argv, **calcpr; int argc, xsize, ysize, i; double ymin, ymax; if (create_args("graph", args, &argc, &argv) < 0) return NULL; if (rrd_graph(argc, argv, &calcpr, &xsize, &ysize, NULL, &ymin, &ymax) == -1) { PyErr_SetString(ErrorObject, rrd_get_error()); rrd_clear_error(); r = NULL; } else { r = PyTuple_New(3); PyTuple_SET_ITEM(r, 0, PyInt_FromLong((long) xsize)); PyTuple_SET_ITEM(r, 1, PyInt_FromLong((long) ysize)); if (calcpr) { PyObject *e, *t; e = PyList_New(0); PyTuple_SET_ITEM(r, 2, e); for (i = 0; calcpr[i]; i++) { t = PyString_FromString(calcpr[i]); PyList_Append(e, t); Py_DECREF(t); rrd_freemem(calcpr[i]); } rrd_freemem(calcpr); } else { Py_INCREF(Py_None); PyTuple_SET_ITEM(r, 2, Py_None); } } destroy_args(&argv); return r; }
char* drawgraph(long argc, char **args){ int i,xsize, ysize; for(i=0;i<argc;i++) if(strcmp(args[i],"--imginfo")==0 || strcmp(args[i],"-g")==0) break; if(i==argc) { args[argc++] = "--imginfo"; args[argc++] = "<IMG SRC=\"./%s\" WIDTH=\"%lu\" HEIGHT=\"%lu\">"; } optind=0; /* reset gnu getopt */ opterr=0; /* reset gnu getopt */ calfree(); if( rrd_graph(argc+1, args-1, &calcpr, &xsize, &ysize) != -1 ) { return stralloc(calcpr[0]); } else { if (rrd_test_error()) { char *err = malloc((strlen(rrd_get_error())+DS_NAM_SIZE)*sizeof(char)); sprintf(err, "[ERROR: %s]",rrd_get_error()); rrd_clear_error(); calfree(); return err; } } return NULL; }
/* HandleInputLine is NOT thread safe - due to readdir issues, resolving them portably is not really simple. */ int HandleInputLine( int argc, char **argv, FILE * out) { #if defined(HAVE_OPENDIR) && defined (HAVE_READDIR) DIR *curdir; /* to read current dir with ls */ struct dirent *dent; #endif /* Reset errno to 0 before we start. */ if (RemoteMode) { if (argc > 1 && strcmp("quit", argv[1]) == 0) { if (argc != 2) { printf("ERROR: invalid parameter count for quit\n"); return (1); } exit(0); } #if defined(HAVE_OPENDIR) && defined(HAVE_READDIR) && defined(HAVE_CHDIR) && defined(HAVE_SYS_STAT_H) if (argc > 1 && strcmp("cd", argv[1]) == 0) { if (argc != 3) { printf("ERROR: invalid parameter count for cd\n"); return (1); } #if ! defined(HAVE_CHROOT) || ! defined(HAVE_GETUID) if (getuid() == 0 && !ChangeRoot) { printf ("ERROR: chdir security problem - rrdtool is running as " "root but not chroot!\n"); return (1); } #endif if (chdir(argv[2]) != 0){ printf("ERROR: chdir %s %s\n", argv[2], rrd_strerror(errno)); return (1); } return (0); } if (argc > 1 && strcmp("pwd", argv[1]) == 0) { char *cwd; /* To hold current working dir on call to pwd */ if (argc != 2) { printf("ERROR: invalid parameter count for pwd\n"); return (1); } cwd = getcwd(NULL, MAXPATH); if (cwd == NULL) { printf("ERROR: getcwd %s\n", rrd_strerror(errno)); return (1); } printf("%s\n", cwd); free(cwd); return (0); } if (argc > 1 && strcmp("mkdir", argv[1]) == 0) { if (argc != 3) { printf("ERROR: invalid parameter count for mkdir\n"); return (1); } #if ! defined(HAVE_CHROOT) || ! defined(HAVE_GETUID) if (getuid() == 0 && !ChangeRoot) { printf ("ERROR: mkdir security problem - rrdtool is running as " "root but not chroot!\n"); return (1); } #endif if(mkdir(argv[2], 0777)!=0){ printf("ERROR: mkdir %s: %s\n", argv[2],rrd_strerror(errno)); return (1); } return (0); } if (argc > 1 && strcmp("ls", argv[1]) == 0) { if (argc != 2) { printf("ERROR: invalid parameter count for ls\n"); return (1); } if ((curdir = opendir(".")) != NULL) { struct stat st; while ((dent = readdir(curdir)) != NULL) { if (!stat(dent->d_name, &st)) { if (S_ISDIR(st.st_mode)) { printf("d %s\n", dent->d_name); } if (strlen(dent->d_name) > 4 && S_ISREG(st.st_mode)) { if (!strcmp (dent->d_name + NAMLEN(dent) - 4, ".rrd") || !strcmp(dent->d_name + NAMLEN(dent) - 4, ".RRD")) { printf("- %s\n", dent->d_name); } } } } closedir(curdir); } else { printf("ERROR: opendir .: %s\n", rrd_strerror(errno)); return (errno); } return (0); } #endif /* opendir and readdir */ } if (argc < 3 || strcmp("help", argv[1]) == 0 || strcmp("--help", argv[1]) == 0 || strcmp("-help", argv[1]) == 0 || strcmp("-?", argv[1]) == 0 || strcmp("-h", argv[1]) == 0) { PrintUsage(""); return 0; } if (strcmp("create", argv[1]) == 0) rrd_create(argc - 1, &argv[1]); else if (strcmp("dump", argv[1]) == 0) rrd_dump(argc - 1, &argv[1]); else if (strcmp("info", argv[1]) == 0 || strcmp("updatev", argv[1]) == 0) { rrd_info_t *data; if (strcmp("info", argv[1]) == 0) data = rrd_info(argc - 1, &argv[1]); else data = rrd_update_v(argc - 1, &argv[1]); rrd_info_print(data); rrd_info_free(data); } else if (strcmp("--version", argv[1]) == 0 || strcmp("version", argv[1]) == 0 || strcmp("v", argv[1]) == 0 || strcmp("-v", argv[1]) == 0 || strcmp("-version", argv[1]) == 0) printf("RRDtool " PACKAGE_VERSION " Copyright by Tobi Oetiker, 1997-2008 (%f)\n", rrd_version()); else if (strcmp("restore", argv[1]) == 0) rrd_restore(argc - 1, &argv[1]); else if (strcmp("resize", argv[1]) == 0) rrd_resize(argc - 1, &argv[1]); else if (strcmp("last", argv[1]) == 0) printf("%ld\n", rrd_last(argc - 1, &argv[1])); else if (strcmp("lastupdate", argv[1]) == 0) { rrd_lastupdate(argc - 1, &argv[1]); } else if (strcmp("first", argv[1]) == 0) printf("%ld\n", rrd_first(argc - 1, &argv[1])); else if (strcmp("update", argv[1]) == 0) rrd_update(argc - 1, &argv[1]); else if (strcmp("fetch", argv[1]) == 0) { time_t start, end, ti; unsigned long step, ds_cnt, i, ii; rrd_value_t *data, *datai; char **ds_namv; if (rrd_fetch (argc - 1, &argv[1], &start, &end, &step, &ds_cnt, &ds_namv, &data) == 0) { datai = data; printf(" "); for (i = 0; i < ds_cnt; i++) printf("%20s", ds_namv[i]); printf("\n\n"); for (ti = start + step; ti <= end; ti += step) { printf("%10lu:", ti); for (ii = 0; ii < ds_cnt; ii++) printf(" %0.10e", *(datai++)); printf("\n"); } for (i = 0; i < ds_cnt; i++) free(ds_namv[i]); free(ds_namv); free(data); } } else if (strcmp("xport", argv[1]) == 0) { #ifdef HAVE_RRD_GRAPH time_t start, end; unsigned long step, col_cnt; rrd_value_t *data; char **legend_v; rrd_xport (argc - 1, &argv[1], NULL, &start, &end, &step, &col_cnt, &legend_v, &data); #else rrd_set_error("the instance of rrdtool has been compiled without graphics"); #endif } else if (strcmp("graph", argv[1]) == 0) { #ifdef HAVE_RRD_GRAPH char **calcpr; #ifdef notused /*XXX*/ const char *imgfile = argv[2]; /* rrd_graph changes argv pointer */ #endif int xsize, ysize; double ymin, ymax; int i; int tostdout = (strcmp(argv[2], "-") == 0); int imginfo = 0; for (i = 2; i < argc; i++) { if (strcmp(argv[i], "--imginfo") == 0 || strcmp(argv[i], "-f") == 0) { imginfo = 1; break; } } if (rrd_graph (argc - 1, &argv[1], &calcpr, &xsize, &ysize, NULL, &ymin, &ymax) == 0) { if (!tostdout && !imginfo) printf("%dx%d\n", xsize, ysize); if (calcpr) { for (i = 0; calcpr[i]; i++) { if (!tostdout) printf("%s\n", calcpr[i]); free(calcpr[i]); } free(calcpr); } } #else rrd_set_error("the instance of rrdtool has been compiled without graphics"); #endif } 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]); if (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("flushcached", argv[1]) == 0) rrd_flushcached(argc - 1, &argv[1]); else if (strcmp("modify", argv[1]) == 0) rrd_modify(argc - 1, &argv[1]); else { rrd_set_error("unknown function '%s'", argv[1]); } if (rrd_test_error()) { fprintf(out, "ERROR: %s\n", rrd_get_error()); rrd_clear_error(); return 1; } return (0); }
static PyObject * _RRD_graph(int argc, char **argv) { int rc, xsize, ysize; char **prdata; double ymin, ymax; PyObject *result; rc = rrd_graph(argc, argv, &prdata, &xsize, &ysize, NULL, &ymin, &ymax); if (rc == -1) { PyMem_DEL(argv); PyErr_SetString(PyExc_ValueError, rrd_get_error()); rrd_clear_error(); return NULL; } result = PyTuple_New(3); if (! result) { PyMem_DEL(argv); return NULL; } PyTuple_SET_ITEM(result, 0, PyInt_FromLong((long)xsize)); PyTuple_SET_ITEM(result, 1, PyInt_FromLong((long)ysize)); if (prdata) { PyObject *e, *t; int i; e = PyList_New(0); if (! e) goto error; PyTuple_SET_ITEM(result, 2, e); for(i = 0; prdata[i]; i++) { t = PyString_FromString(prdata[i]); if (! t) { Py_DECREF(e); goto error; } PyList_Append(e, t); Py_DECREF(t); free(prdata[i]); } free(prdata); } else { Py_INCREF(Py_None); PyTuple_SET_ITEM(result, 2, Py_None); } PyMem_DEL(argv); return result; error: Py_DECREF(result); PyMem_DEL(argv); return NULL; }
/* HandleInputLine is NOT thread safe - due to readdir issues, resolving them portably is not really simple. */ int HandleInputLine( int argc, char **argv, FILE * out) { #if defined(HAVE_OPENDIR) && defined (HAVE_READDIR) DIR *curdir; /* to read current dir with ls */ struct dirent *dent; #endif #if defined(HAVE_SYS_STAT_H) struct stat st; #endif /* Reset errno to 0 before we start. */ if (RemoteMode) { if (argc > 1 && strcmp("quit", argv[1]) == 0) { if (argc > 2) { printf("ERROR: invalid parameter count for quit\n"); return (1); } exit(0); } #if defined(HAVE_OPENDIR) && defined(HAVE_READDIR) && defined(HAVE_CHDIR) if (argc > 1 && strcmp("cd", argv[1]) == 0) { if (argc > 3) { printf("ERROR: invalid parameter count for cd\n"); return (1); } #if ! defined(HAVE_CHROOT) || ! defined(HAVE_GETUID) if (getuid() == 0 && !ChangeRoot) { printf ("ERROR: chdir security problem - rrdtool is running as " "root but not chroot!\n"); return (1); } #endif if (chdir(argv[2]) != 0) { printf("ERROR: chdir %s %s\n", argv[2], rrd_strerror(errno)); return (1); } return (0); } if (argc > 1 && strcmp("pwd", argv[1]) == 0) { char *cwd; /* To hold current working dir on call to pwd */ if (argc > 2) { printf("ERROR: invalid parameter count for pwd\n"); return (1); } cwd = getcwd(NULL, MAXPATH); if (cwd == NULL) { printf("ERROR: getcwd %s\n", rrd_strerror(errno)); return (1); } printf("%s\n", cwd); free(cwd); return (0); } if (argc > 1 && strcmp("mkdir", argv[1]) == 0) { if (argc > 3) { printf("ERROR: invalid parameter count for mkdir\n"); return (1); } #if ! defined(HAVE_CHROOT) || ! defined(HAVE_GETUID) if (getuid() == 0 && !ChangeRoot) { printf ("ERROR: mkdir security problem - rrdtool is running as " "root but not chroot!\n"); return (1); } #endif if(mkdir(argv[2], 0777)!=0) { printf("ERROR: mkdir %s: %s\n", argv[2],rrd_strerror(errno)); return (1); } return (0); } if (argc > 1 && strcmp("ls", argv[1]) == 0) { if (argc > 2) { printf("ERROR: invalid parameter count for ls\n"); return (1); } if ((curdir = opendir(".")) != NULL) { while ((dent = readdir(curdir)) != NULL) { if (!stat(dent->d_name, &st)) { if (S_ISDIR(st.st_mode)) { printf("d %s\n", dent->d_name); } if (strlen(dent->d_name) > 4 && S_ISREG(st.st_mode)) { if (!strcmp (dent->d_name + NAMLEN(dent) - 4, ".rrd") || !strcmp(dent->d_name + NAMLEN(dent) - 4, ".RRD")) { printf("- %s\n", dent->d_name); } } } } closedir(curdir); } else { printf("ERROR: opendir .: %s\n", rrd_strerror(errno)); return (errno); } return (0); } #endif /* opendir and readdir */ } if (argc < 3 || strcmp("help", argv[1]) == 0 || strcmp("--help", argv[1]) == 0 || strcmp("-help", argv[1]) == 0 || strcmp("-?", argv[1]) == 0 || strcmp("-h", argv[1]) == 0) { PrintUsage(""); return 0; } if (strcmp("create", argv[1]) == 0) rrd_create(argc - 1, &argv[1]); else if (strcmp("dump", argv[1]) == 0) rrd_dump(argc - 1, &argv[1]); else if (strcmp("info", argv[1]) == 0 || strcmp("updatev", argv[1]) == 0) { rrd_info_t *data; if (strcmp("info", argv[1]) == 0) data = rrd_info(argc - 1, &argv[1]); else data = rrd_update_v(argc - 1, &argv[1]); rrd_info_print(data); rrd_info_free(data); } else if (strcmp("--version", argv[1]) == 0 || strcmp("version", argv[1]) == 0 || strcmp("v", argv[1]) == 0 || strcmp("-v", argv[1]) == 0 || strcmp("-version", argv[1]) == 0) printf("RRDtool " PACKAGE_VERSION " Copyright by Tobi Oetiker, 1997-2008 (%f)\n", rrd_version()); else if (strcmp("restore", argv[1]) == 0) rrd_restore(argc - 1, &argv[1]); else if (strcmp("resize", argv[1]) == 0) rrd_resize(argc - 1, &argv[1]); else if (strcmp("last", argv[1]) == 0) printf("%ld\n", rrd_last(argc - 1, &argv[1])); else if (strcmp("lastupdate", argv[1]) == 0) { rrd_lastupdate(argc - 1, &argv[1]); } else if (strcmp("first", argv[1]) == 0) printf("%ld\n", rrd_first(argc - 1, &argv[1])); else if (strcmp("update", argv[1]) == 0) rrd_update(argc - 1, &argv[1]); else if (strcmp("fetch", argv[1]) == 0) { time_t start, end, ti; unsigned long step, ds_cnt, i, ii; rrd_value_t *data, *datai; char **ds_namv; if (rrd_fetch (argc - 1, &argv[1], &start, &end, &step, &ds_cnt, &ds_namv, &data) != -1) { datai = data; printf(" "); for (i = 0; i < ds_cnt; i++) printf("%20s", ds_namv[i]); printf("\n\n"); for (ti = start + step; ti <= end; ti += step) { printf("%10lu:", ti); for (ii = 0; ii < ds_cnt; ii++) printf(" %0.10e", *(datai++)); printf("\n"); } for (i = 0; i < ds_cnt; i++) free(ds_namv[i]); free(ds_namv); free(data); } } else if (strcmp("xport", argv[1]) == 0) { int xxsize; unsigned long int j = 0; time_t start, end, ti; unsigned long step, col_cnt, row_cnt; rrd_value_t *data, *ptr; char **legend_v; int enumds = 0; 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; } if (rrd_xport (argc - 1, &argv[1], &xxsize, &start, &end, &step, &col_cnt, &legend_v, &data) != -1) { char *old_locale = setlocale(LC_NUMERIC, "C"); 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>%lld</%s>\n", META_START_TAG, (long long int) start + step, META_START_TAG); printf(" <%s>%lu</%s>\n", META_STEP_TAG, step, META_STEP_TAG); printf(" <%s>%lld</%s>\n", META_END_TAG, (long long int) 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); for (j = 0; j < col_cnt; j++) { char *entry = NULL; entry = legend_v[j]; printf(" <%s>%s</%s>\n", LEGEND_ENTRY_TAG, entry, LEGEND_ENTRY_TAG); free(entry); } free(legend_v); printf(" </%s>\n", LEGEND_TAG); printf(" </%s>\n", META_TAG); printf(" <%s>\n", DATA_TAG); for (ti = start + step; ti <= end; ti += step) { 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; if (enumds == 1) snprintf(vtag, vtag_s, "%s%lu", COL_DATA_TAG, j); else snprintf(vtag, vtag_s, "%s", COL_DATA_TAG); newval = *ptr; if (isnan(newval)) { printf("<%s>NaN</%s>", vtag, vtag); } else { printf("<%s>%0.10e</%s>", vtag, newval, vtag); }; ptr++; } printf("</%s>\n", DATA_ROW_TAG); } free(data); printf(" </%s>\n", DATA_TAG); printf("</%s>\n", ROOT_TAG); setlocale(LC_NUMERIC, old_locale); } free(vtag); } else if (strcmp("graph", argv[1]) == 0) { char **calcpr; #ifdef notused /*XXX*/ const char *imgfile = argv[2]; /* rrd_graph changes argv pointer */ #endif int xsize, ysize; double ymin, ymax; int i; int tostdout = (strcmp(argv[2], "-") == 0); int imginfo = 0; for (i = 2; i < argc; i++) { if (strcmp(argv[i], "--imginfo") == 0 || strcmp(argv[i], "-f") == 0) { imginfo = 1; break; } } if (rrd_graph (argc - 1, &argv[1], &calcpr, &xsize, &ysize, NULL, &ymin, &ymax) != -1) { if (!tostdout && !imginfo) printf("%dx%d\n", xsize, ysize); if (calcpr) { for (i = 0; calcpr[i]; i++) { if (!tostdout) printf("%s\n", calcpr[i]); free(calcpr[i]); } free(calcpr); } } } else if (strcmp("graphv", argv[1]) == 0) { 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]); if (grinfo) { rrd_info_print(grinfo); rrd_info_free(grinfo); } } else if (strcmp("tune", argv[1]) == 0) rrd_tune(argc - 1, &argv[1]); else if (strcmp("flushcached", argv[1]) == 0) rrd_flushcached(argc - 1, &argv[1]); else { rrd_set_error("unknown function '%s'", argv[1]); } if (rrd_test_error()) { fprintf(out, "ERROR: %s\n", rrd_get_error()); rrd_clear_error(); return 1; } return (0); }
void RRDVisAnalyzer::graphRRD(const std::string& graph_file, const std::string& rrd_db, const std::string& title, const std::string& type, const std::string& start) { const size_t length = 350; const size_t array_length = 50; char* rrd_args[array_length]; for (size_t i = 0; i != array_length; ++i) { rrd_args[i] = (char*) malloc(length*sizeof(char)); bzero(rrd_args[i], length); } size_t rrdIndexCounter = 0; int xsize, ysize; double ymin, ymax; char **calcpr; std::stringstream args_stream; std::string arg; strncpy(rrd_args[rrdIndexCounter++], "graph", length); strncpy(rrd_args[rrdIndexCounter++], graph_file.c_str(), graph_file.length()>length?length:graph_file.length()); if (type == "bytes") { arg = "DEF:in_bytes=" + rrd_db + ":in_bytes:AVERAGE"; strncpy(rrd_args[rrdIndexCounter++], arg.c_str(), length); arg = "DEF:in_tcp_bytes=" + rrd_db + ":in_tcp_bytes:AVERAGE"; strncpy(rrd_args[rrdIndexCounter++], arg.c_str(), length); arg = "DEF:in_udp_bytes=" + rrd_db + ":in_udp_bytes:AVERAGE"; strncpy(rrd_args[rrdIndexCounter++], arg.c_str(), length); arg = "DEF:in_icmp_bytes=" + rrd_db + ":in_icmp_bytes:AVERAGE"; strncpy(rrd_args[rrdIndexCounter++], arg.c_str(), length); arg ="DEF:out_bytes=" + rrd_db + ":out_bytes:AVERAGE"; strncpy(rrd_args[rrdIndexCounter++], arg.c_str(), length); arg = "DEF:out_tcp_bytes=" + rrd_db + ":out_tcp_bytes:AVERAGE"; strncpy(rrd_args[rrdIndexCounter++], arg.c_str(), length); arg = "DEF:out_udp_bytes=" + rrd_db + ":out_udp_bytes:AVERAGE"; strncpy(rrd_args[rrdIndexCounter++], arg.c_str(), length); arg = "DEF:out_icmp_bytes=" + rrd_db + ":out_icmp_bytes:AVERAGE"; strncpy(rrd_args[rrdIndexCounter++], arg.c_str(), length); strncpy(rrd_args[rrdIndexCounter++], "AREA:in_tcp_bytes#f00000:IN_TCP_BYTES:STACK", length); strncpy(rrd_args[rrdIndexCounter++], "AREA:in_udp_bytes#f0f000:IN_UDP_BYTES:STACK", length); strncpy(rrd_args[rrdIndexCounter++], "AREA:in_icmp_bytes#f00ff0:IN_ICMP_BYTES:STACK", length); strncpy(rrd_args[rrdIndexCounter++], "LINE1:in_bytes#000000:IN_BYTES", length); strncpy(rrd_args[rrdIndexCounter++], "AREA:out_tcp_bytes#f00000:OUT_TCP_BYTES", length); strncpy(rrd_args[rrdIndexCounter++], "AREA:out_udp_bytes#f0f000:OUT_UDP_BYTES:STACK", length); strncpy(rrd_args[rrdIndexCounter++], "AREA:out_icmp_bytes#f00ff0:OUT_ICMP_BYTES:STACK", length); strncpy(rrd_args[rrdIndexCounter++], "LINE1:out_bytes#0000ff:OUT_BYTES", length); strncpy(rrd_args[rrdIndexCounter++], "HRULE:0#000000:Zero Line", length); } else if (type == "packets") { arg = "DEF:in_packets=" + rrd_db + ":in_packets:AVERAGE"; strncpy(rrd_args[rrdIndexCounter++], arg.c_str(), length); arg = "DEF:in_tcp_packets=" + rrd_db + ":in_tcp_packets:AVERAGE"; strncpy(rrd_args[rrdIndexCounter++], arg.c_str(), length); arg = "DEF:in_udp_packets=" + rrd_db + ":in_udp_packets:AVERAGE"; strncpy(rrd_args[rrdIndexCounter++], arg.c_str(), length); arg = "DEF:in_icmp_packets=" + rrd_db + ":in_icmp_packets:AVERAGE"; strncpy(rrd_args[rrdIndexCounter++], arg.c_str(), length); arg ="DEF:out_packets=" + rrd_db + ":out_packets:AVERAGE"; strncpy(rrd_args[rrdIndexCounter++], arg.c_str(), length); arg = "DEF:out_tcp_packets=" + rrd_db + ":out_tcp_packets:AVERAGE"; strncpy(rrd_args[rrdIndexCounter++], arg.c_str(), length); arg = "DEF:out_udp_packets=" + rrd_db + ":out_udp_packets:AVERAGE"; strncpy(rrd_args[rrdIndexCounter++], arg.c_str(), length); arg = "DEF:out_icmp_packets=" + rrd_db + ":out_icmp_packets:AVERAGE"; strncpy(rrd_args[rrdIndexCounter++], arg.c_str(), length); strncpy(rrd_args[rrdIndexCounter++], "AREA:in_tcp_packets#f00000:IN_TCP_PACKETS:STACK", length); strncpy(rrd_args[rrdIndexCounter++], "AREA:in_udp_packets#f0f000:IN_UDP_PACKETS:STACK", length); strncpy(rrd_args[rrdIndexCounter++], "AREA:in_icmp_packets#f00ff0:IN_ICMP_PACKETS:STACK", length); strncpy(rrd_args[rrdIndexCounter++], "LINE1:in_packets#000000:IN_PACKETS", length); strncpy(rrd_args[rrdIndexCounter++], "AREA:out_tcp_packets#f00000:OUT_TCP_PACKETS", length); strncpy(rrd_args[rrdIndexCounter++], "AREA:out_udp_packets#f0f000:OUT_UDP_PACKETS:STACK", length); strncpy(rrd_args[rrdIndexCounter++], "AREA:out_icmp_packets#f00ff0:OUT_ICMP_PACKETS:STACK", length); strncpy(rrd_args[rrdIndexCounter++], "LINE1:out_packets#ffff00:OUT_PACKETS", length); } args_stream << lastFlowStart << start; strncpy(rrd_args[rrdIndexCounter++], "--start", length); strncpy(rrd_args[rrdIndexCounter++], args_stream.str().c_str(), length); strncpy(rrd_args[rrdIndexCounter++], "--title", length); args_stream.str(""); args_stream << lastFlowStart; strncpy(rrd_args[rrdIndexCounter++], args_stream.str().c_str(), length); strncpy(rrd_args[rrdIndexCounter++], "--end", length); args_stream.str(""); args_stream << lastFlowStart; strncpy(rrd_args[rrdIndexCounter++], args_stream.str().c_str(), length); strncpy(rrd_args[rrdIndexCounter++], "--width", length); args_stream.str(""); args_stream << 1024; strncpy(rrd_args[rrdIndexCounter++], args_stream.str().c_str(), length); strncpy(rrd_args[rrdIndexCounter++], "--height", length); args_stream.str(""); args_stream << 860; strncpy(rrd_args[rrdIndexCounter++], args_stream.str().c_str(), length); strncpy(rrd_args[rrdIndexCounter++], "--slope-mode", length); rrd_args[rrdIndexCounter] = NULL; if (rrd_graph(rrdIndexCounter, (char**)rrd_args, &calcpr, &xsize, &ysize, NULL, &ymin, &ymax) != 0) { std::cout << "Failed to graph: " << rrd_get_error() << std::endl; rrd_clear_error(); } else { if (calcpr) { for (size_t i = 0; calcpr[i]; i++) { free(calcpr[i]); } free(calcpr); } } for (size_t i = 0; i != array_length; ++i) { free(rrd_args[i]); } }