Пример #1
0
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;
}
Пример #2
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;
}
Пример #3
0
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);
	}
}
Пример #4
0
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;
}
Пример #5
0
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;
}
Пример #6
0
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;
}
Пример #7
0
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;
}
Пример #8
0
/* 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);
}
Пример #9
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;
}
Пример #10
0
/* 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);
}
Пример #11
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]);
	}


}