int wrap_rrd_create(char *argstr) { char **argv; int i, argc; if((argv = string_to_argv(argstr, &argc)) != NULL) { optind=0; /* reset gnu getopt */ opterr=0; /* no error messages */ i = rrd_create(argc, argv); // free up the memory Free_argv(argv); return i; } else { // error return (-1); } }
int create_rrd(char* file) { struct stat st; if (file) { if (stat(file, &st)) { /* stats fails*/ if (errno != ENOENT) { /* error occurred */ perror(file); return -1; } } /* file exists */ create_args[3] = file; if (rrd_create(CREATE_ARGS, create_args)) { fprintf(stderr, "unable to create file: %s\n", file); fprintf(stderr, "%s\n", rrd_get_error()); rrd_clear_error(); return -1; } printf("file %s created\n", file); } return 0; }
void rrdtool_create_command (const char *name, const char *what) { // rrd_create needs the time of the first entry, so it // called at the time of the first update; therefore, we // need to backup the original rrd entry -- in order not // overwrite the update command contained in rrd.cmd rrd_struct temp_rrd = rrd; if (RRD_DEBUG) fprintf (fp_stderr, "rrdtool: create(%s,%s)\n", name, what); #ifdef RRD_TREE sprintf (temp_rrd.file, "%s/%s", rrd.conf.path, name, what); struct stat fbuf; if (!((stat (temp_rrd.file, &fbuf) == 0) && S_ISDIR (fbuf.st_mode))) { mkdir (temp_rrd.file, 0775); if (debug > 1) fprintf (fp_stderr, "RRDtool database path <%s> created\n", temp_rrd.file); } sprintf (temp_rrd.file, "%s/%s/%s.rrd", rrd.conf.path, name, what); #else sprintf (temp_rrd.file, "%s/%s.%s.rrd", rrd.conf.path, name, what); #endif rrd.time_update = (unsigned long) current_time.tv_sec; if (stat (temp_rrd.file, &temp_rrd.fbuf) == 0) { if (debug > 1) fprintf (fp_stderr, "rrdtool: skip create <%s> ... already existent\n", temp_rrd.file); return; /* already called ? */ } /* MTRG-like behavior for on-line usage */ sprintf (temp_rrd.cmd, "create %s --step %lu --start %ld DS:%s:GAUGE:%lu:U:U %s %s %s %s", temp_rrd.file, (unsigned long) (GLOBALS.Max_Time_Step / 1000000), (long) rrd.time_update - 10, name, (unsigned long) (GLOBALS.Max_Time_Step / 500000), RRA_DAILY, RRA_WEEKLY, RRA_MONTHLY, RRA_YEARLY); if (debug > 1) fprintf (fp_stderr, "rrdtool: rrd_create('%s')\n", temp_rrd.cmd); optind = 0; opterr = 0; rrdtool_str2argv (temp_rrd.cmd); rrd_create (rrd.argc, rrd.argv); if (rrd_test_error ()) { fprintf (fp_stderr, "rrdtool: create command:\n%s\n", temp_rrd.cmd); fprintf (fp_stderr, "rrdtool: create error!\n%s\n", rrd_get_error ()); if (temp_rrd.fatal) exit (1); rrd_clear_error (); } }
/** * @brief 创建RRD数据库 * @param rrd_file rrd数据库路径 * @param summary 标志位是否summary * @param step 步长 * @return 成功返回0,失败返回-1 */ int c_rrd_handler::RRD_create(const char *rrd_file, bool summary, unsigned int step) { /* Warning: RRD_create will overwrite a RRD if it already exists */ int argc = 0; const char *argv[128] = {NULL}; const char *data_source_type = "GAUGE"; int heartbeat = 30; char sstep[16] = {'\0'}; char sstart[64] = {'\0'}; char ssum[64] = {'\0'}; char snum[64] = {'\0'}; /* Our heartbeat is twice the step interval. */ heartbeat = 2 * step; argv[argc++] = "dummy"; argv[argc++] = rrd_file; argv[argc++] = "--step"; sprintf(sstep, "%u", step); argv[argc++] = sstep; argv[argc++] = "--start"; sprintf(sstart, "%lu", time(NULL) - 1); argv[argc++] = sstart; sprintf(ssum, "DS:sum:%s:%d:U:U", data_source_type, heartbeat); argv[argc++] = ssum; if(summary) { sprintf(snum, "DS:num:%s:%d:U:U", data_source_type, heartbeat); argv[argc++] = snum; } if (g_is_switch_rrd) { GEN_SWITCH_RRA(argc, argv); } else { GEN_SERVER_RRA(argc, argv); } optind = 0; optopt = 0; opterr = 0; optarg = NULL; rrd_clear_error(); rrd_create(argc, (char**)argv); if(rrd_test_error()) { ERROR_LOG("RRD_create error: %s", rrd_get_error()); return -1; } DEBUG_LOG("CREATE RRD[%s]", rrd_file); return 0; }
JNIEXPORT void JNICALL Java_gnu_rrd_RRDJNI_create (JNIEnv *env, jclass cl, jobjectArray argv) { char **argv2; argv2 = initArgs(env, argv, "create"); rrd_create((*env)->GetArrayLength(env, argv)+1, argv2); freeArgs(env, argv, argv2); if (rrd_test_error()) throwException(env, "gnu/rrd/RRDException", rrd_get_error()); }
/* #endif HAVE_THREADSAFE_LIBRRD */ #else /* !HAVE_THREADSAFE_LIBRRD */ static int srrd_create (const char *filename, /* {{{ */ unsigned long pdp_step, time_t last_up, int argc, const char **argv) { int status; int new_argc; char **new_argv; char pdp_step_str[16]; char last_up_str[16]; new_argc = 6 + argc; new_argv = (char **) malloc ((new_argc + 1) * sizeof (char *)); if (new_argv == NULL) { ERROR ("rrdtool plugin: malloc failed."); return (-1); } if (last_up == 0) last_up = time (NULL) - 10; ssnprintf (pdp_step_str, sizeof (pdp_step_str), "%lu", pdp_step); ssnprintf (last_up_str, sizeof (last_up_str), "%u", (unsigned int) last_up); new_argv[0] = "create"; new_argv[1] = (void *) filename; new_argv[2] = "-s"; new_argv[3] = pdp_step_str; new_argv[4] = "-b"; new_argv[5] = last_up_str; memcpy (new_argv + 6, argv, argc * sizeof (char *)); new_argv[new_argc] = NULL; pthread_mutex_lock (&librrd_lock); optind = 0; /* bug in librrd? */ rrd_clear_error (); status = rrd_create (new_argc, new_argv); pthread_mutex_unlock (&librrd_lock); if (status != 0) { WARNING ("rrdtool plugin: rrd_create (%s) failed: %s", filename, rrd_get_error ()); } sfree (new_argv); return (status); } /* }}} int srrd_create */
int pi_rrd_start (rrd_ctxt_t * rrd) { struct stat statbuf; /* if the file does not exist, we must create the RRD */ if (stat (rrd->filename, &statbuf) < 0) { rrd_ctxt_datapoint_t *dp; unsigned int argc = 0; char *argv[256]; unsigned char period[64]; /* if ENOENT is returned, we need to create the archive file */ if (errno != ENOENT) return -1; argv[argc++] = "create"; argv[argc++] = rrd->filename; /* we add the argument to set a non-standard step */ if (rrd->period != 300) { snprintf (period, 64, "%lu", rrd->period); argv[argc++] = "-s"; argv[argc++] = period; } /* we add the data points */ for (dp = rrd->points.next; (dp != &rrd->points) && (argc < 255); dp = dp->next) argv[argc++] = dp->spec; /* we add the RRAs */ for (dp = rrd->rras.next; (dp != &rrd->rras) && (argc < 255); dp = dp->next) argv[argc++] = dp->spec; argv[argc] = NULL; /* create the rrd! */ errno = 0; if (rrd_create (argc, argv) < 0) return -1; } /* init the timer */ etimer_init (&rrd->timer, (etimer_handler_t *) pi_rrd_update, rrd); /* set the timer for a multiple of the period */ etimer_set (&rrd->timer, (rrd->period - (now.tv_sec % rrd->period)) * 1000); return 0; }
int main( int argc, char **argv) { char *name=basename(argv[0]); rrd_info_t *info; if (!strcmp(name, "rrdcreate")) { rrd_create(argc, argv); } else if (!strcmp(name, "rrdinfo")) { info=rrd_info(argc, argv); rrd_info_print(info); rrd_info_free(info); } else { rrd_update(argc, argv); } if (rrd_test_error()) { printf("RRDtool " PACKAGE_VERSION " Copyright by Tobi Oetiker, 1997-2010\n\n"); if (!strcmp(name, "rrdcreate")) { printf("Usage: rrdcreate <filename>\n" "\t\t\t[--start|-b start time]\n" "\t\t\t[--step|-s step]\n" "\t\t\t[--no-overwrite]\n" "\t\t\t[DS:ds-name:DST:dst arguments]\n" "\t\t\t[RRA:CF:cf arguments]\n\n"); } else if (!strcmp(name, "rrdinfo")) { printf("Usage: rrdinfo <filename>\n"); } else { printf("Usage: rrdupdate <filename>\n" "\t\t\t[--template|-t ds-name[:ds-name]...]\n" "\t\t\t[--skip-past-updates]\n" "\t\t\ttime|N:value[:value...]\n\n" "\t\t\tat-time@value[:value...]\n\n" "\t\t\t[ time:value[:value...] ..]\n\n"); } printf("ERROR: %s\n", rrd_get_error()); rrd_clear_error(); return 1; } return 0; }
static PyObject * _RRD_call(PyObject *self, PyObject *args) { char **argv; int argc, rc; argv = parse_args(args, &argc); if (!argv) return NULL; if (!strcmp("create", argv[0])) rc = rrd_create(argc, argv); else if (!strcmp("update", argv[0])) rc = rrd_update(argc, argv); else if (!strcmp("restore", argv[0])) rc = rrd_restore(argc, argv); else if (!strcmp("dump", argv[0])) rc = rrd_dump(argc, argv); else if (!strcmp("tune", argv[0])) rc = rrd_tune(argc, argv); else if (!strcmp("last", argv[0])) rc = rrd_last(argc, argv); else if (!strcmp("resize", argv[0])) rc = rrd_resize(argc, argv); else if (!strcmp("fetch", argv[0])) return _RRD_fetch(argc, argv); else if (!strcmp("graph", argv[0])) { return _RRD_graph(argc, argv); } else { PyMem_DEL(argv); PyErr_SetString(PyExc_TypeError, "invalid action"); return NULL; } if (rc == -1) { PyMem_DEL(argv); PyErr_SetString(PyExc_ValueError, rrd_get_error()); rrd_clear_error(); return NULL; } PyMem_DEL(argv); return PyLong_FromLong(rc); }
int rrdInit (void) { int ret = 0; struct stat tmp; sensorLog (LOG_DEBUG, "sensor RRD init"); if (stat (rrdFile, &tmp)) { if (errno == ENOENT) { char stepBuff[STEP_BUFF], rraBuff[RRA_BUFF]; int argc = 4, num; const char *argv[6 + MAX_RRD_SENSORS] = { "sensord", rrdFile, "-s", stepBuff }; sensorLog (LOG_INFO, "creating round robin database"); num = rrdGetSensors (argv + argc); if (num == 0) { sensorLog (LOG_ERR, "Error creating RRD: %s: %s", rrdFile, "No sensors detected"); ret = 2; } else if (num < 0) { ret = -num; } else { sprintf (stepBuff, "%d", rrdTime); sprintf (rraBuff, "RRA:%s:%f:%d:%d", rrdNoAverage?"LAST":"AVERAGE", 0.5 /* fraction of non-unknown samples needed per entry */, 1 /* samples per entry */, 7 * 24 * 60 * 60 / rrdTime /* 1 week */); argc += num; argv[argc ++] = rraBuff; argv[argc] = NULL; optind = 1; opterr = 0; optopt = '?'; optarg = NULL; if ((ret = rrd_create (argc, (char **) /* WEAK */ argv))) { sensorLog (LOG_ERR, "Error creating RRD file: %s: %s", rrdFile, rrd_get_error ()); } } } else { sensorLog (LOG_ERR, "Error stat()ing RRD: %s: %s", rrdFile, strerror (errno)); ret = 1; } } sensorLog (LOG_DEBUG, "sensor RRD inited"); return ret; }
/* 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); }
/* 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); }
/** * \brief Create new RRD database * * \param[in] conf plugin configuration * \param[in] file path to RRD file * \return stats_data structure */ stats_data *stats_rrd_create(plugin_conf *conf, std::string file) { /* Create stats counters */ stats_data *stats = new stats_data; stats->file = file; stats->last = time(NULL); for (int group = 0; group < GROUPS; ++group) { for (int field = 0; field < PROTOCOLS_PER_GROUP; ++field) { stats->fields[group][field] = 0; } } /* Create file */ struct stat sts; if (!(stat(file.c_str(), &sts) == -1 && errno == ENOENT)) { /* File already exists */ return stats; } char buffer[64]; /* Create arguments field */ std::vector<std::string> argv{}; /* Create file */ argv.push_back("create"); argv.push_back(file); /* * Set start time * time is decreased by conf->interval because it is not possible to * update the RRD for the next step time. */ snprintf(buffer, 64, "--start=%lu", stats->last - conf->interval); argv.push_back(buffer); /* Set interval */ snprintf(buffer, 64, "--step=%d", conf->interval); argv.push_back(buffer); /* Add all fields */ for (auto field: fields) { snprintf(buffer, 64, "DS:%s:ABSOLUTE:%u:U:U", field, conf->interval * 2); /* datasource definition, wait 2x the interval for data */ argv.push_back(buffer); } /* Add statistics */ argv.push_back("RRA:AVERAGE:0.5:1:51840"); /* 1 x 5min = 5 min samples 6 * 30 * 288 = 51840 => 6 * 30 days */ argv.push_back("RRA:AVERAGE:0.5:6:8640"); /* 6 x 5min = 30 min samples 6 * 30 * 48 = 8640 => 6 * 30 day */ argv.push_back("RRA:AVERAGE:0.5:24:2160"); /* 24 x 5min = 2 hour samples 6 * 30 * 12 = 2160 => 6 * 30 days */ argv.push_back("RRA:AVERAGE:0.5:288:1825"); /* 288 x 5min = 1 day samples 5 * 365 * 1 = 1825 => 5 * 365 days */ argv.push_back("RRA:MAX:0.5:1:51840"); argv.push_back("RRA:MAX:0.5:6:8640"); argv.push_back("RRA:MAX:0.5:24:2160"); argv.push_back("RRA:MAX:0.5:288:1825"); /* Create C style argv */ const char **c_argv = new const char*[argv.size()]; for (u_int16_t i = 0; i < argv.size(); ++i) { c_argv[i] = argv[i].c_str(); } /* Create RRD database */ if (rrd_create(argv.size(), (char **) c_argv)) { MSG_ERROR(msg_module, "Create RRD DB Error: %s", rrd_get_error()); rrd_clear_error(); delete stats; return NULL; } return stats; }
static void CreateRRDB (char *filename, time_t when) { char *buff, *s, *rrd_arg[1100]; long i, num, buffsize, argc; optind = 0; opterr = 0; argc = 0; /* Create bufferspace for create args: 1024 DS records: each ~ 23 bytes in average + 3 RRA records + filename + start time => 512 bytes should be more than enough */ buffsize = 23 * 1024 + 512; buff = (char *)malloc(buffsize); if ( !buff ) { perror("Memory error!"); exit(0); } s = buff; unlink(filename); rrd_arg[argc++] = "create"; // add DB name rrd_arg[argc++] = filename; // Add start time num = snprintf(s, buffsize, "--start=%lld", (long long)when); num++; // include '\0' BUFF_CHECK(num,buffsize); rrd_arg[argc++] = s; buffsize -= num; s += num; /* Add the DS strings */ for ( i=0; i<1024; i++) { num = snprintf(s, buffsize, "DS:p%ld:GAUGE:600:0:U", i); num++; // include '\0' // printf("I: %ld ", i); BUFF_CHECK(num,buffsize); rrd_arg[argc++] = s; buffsize -= num; s += num; } /* RRD DB layout: 1 x 5min = 5 min samples 7 * 288 ( per day ) = 2016 => 7 days 24 x 5min = 2 hour samples 60 * 12 ( per day ) = 720 => 60 days 288 x 5min = 1 day samples 180 * 1 ( per day ) = 180 => 180 days */ num = snprintf(s, buffsize, "RRA:AVERAGE:0.5:1:2016"); num++; // include '\0' BUFF_CHECK(num,buffsize); rrd_arg[argc++] = s; buffsize -= num; s += num; num = snprintf(s, buffsize, "RRA:AVERAGE:0.5:24:720"); num++; // include '\0' BUFF_CHECK(num,buffsize); rrd_arg[argc++] = s; buffsize -= num; s += num; num = snprintf(s, buffsize, "RRA:AVERAGE:0.5:288:180"); num++; // include '\0' BUFF_CHECK(num,buffsize); rrd_arg[argc] = s; /* for ( i=0; i<=argc; i++ ) { printf("I:%ld %s\n", i, rrd_arg[i]); } */ rrd_clear_error(); if ( ( i=rrd_create(argc, rrd_arg))) { fprintf(stderr, "Create DB Error: %ld %s\n", i, rrd_get_error()); } } // End of CreateRRDB
/* Warning: RRD_create will overwrite a RRdb if it already exists */ static int RRD_create( char *rrd, int summary, unsigned int step, unsigned int process_time, ganglia_slope_t slope) { const char *data_source_type = "GAUGE"; char *argv[128]; int argc=0; int heartbeat; char s[16], start[64]; char sum[64]; char num[64]; int i; /* Our heartbeat is twice the step interval. */ heartbeat = 8*step; switch( slope) { case GANGLIA_SLOPE_POSITIVE: data_source_type = "COUNTER"; break; case GANGLIA_SLOPE_ZERO: case GANGLIA_SLOPE_NEGATIVE: case GANGLIA_SLOPE_BOTH: case GANGLIA_SLOPE_UNSPECIFIED: data_source_type = "GAUGE"; break; } argv[argc++] = "dummy"; argv[argc++] = rrd; argv[argc++] = "--step"; sprintf(s, "%u", step); argv[argc++] = s; argv[argc++] = "--start"; sprintf(start, "%u", process_time-1); argv[argc++] = start; sprintf(sum,"DS:sum:%s:%d:U:U", data_source_type, heartbeat); argv[argc++] = sum; if (summary) { sprintf(num,"DS:num:%s:%d:U:U", data_source_type, heartbeat); argv[argc++] = num; } for(i = 0; i< gmetad_config.num_RRAs; i++) { argv[argc++] = gmetad_config.RRAs[i]; } #if 0 /* Read in or defaulted in conf.c */ argv[argc++] = "RRA:AVERAGE:0.5:1:240"; argv[argc++] = "RRA:AVERAGE:0.5:24:240"; argv[argc++] = "RRA:AVERAGE:0.5:168:240"; argv[argc++] = "RRA:AVERAGE:0.5:672:240"; argv[argc++] = "RRA:AVERAGE:0.5:5760:370"; #endif pthread_mutex_lock( &rrd_mutex ); optind=0; opterr=0; rrd_clear_error(); rrd_create(argc, argv); if(rrd_test_error()) { err_msg("RRD_create: %s", rrd_get_error()); pthread_mutex_unlock( &rrd_mutex ); return 1; } debug_msg("Created rrd %s", rrd); pthread_mutex_unlock( &rrd_mutex ); return 0; }
char *rrdCreateViaDaemon(int argc, char **argv) { rrd_clear_error(); rrd_create(argc, argv); return rrdError(); }
/* HandleInputLine is NOT thread safe - due to readdir issues, resolving them portably is not really simple. */ static 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); } #ifdef MAXPATH cwd = getcwd(NULL, MAXPATH); #elif defined(HAVE_GET_CURRENT_DIR_NAME) cwd = get_current_dir_name(); #else #error "You must have either MAXPATH or get_current_dir_name()" #endif 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("list", argv[1]) == 0) { char *list; list = rrd_list(argc - 1, &argv[1]); if (list) { printf("%s", list); free(list); } } 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 (%f)\n", rrd_version()); else if (strcmp("restore", argv[1]) == 0) #ifdef HAVE_RRD_RESTORE rrd_restore(argc - 1, &argv[1]); #else rrd_set_error("the instance of rrdtool has been compiled without XML import functions"); #endif else if (strcmp("resize", argv[1]) == 0)