static int RRD_update( char *rrd, const char *sum, const char *num, unsigned int process_time ) { char *argv[3]; int argc = 3; char val[128]; /* If we are a host RRD, we "sum" over only one host. */ if (num) sprintf(val, "%d:%s:%s", process_time, sum, num); else sprintf(val, "%d:%s", process_time, sum); argv[0] = "dummy"; argv[1] = rrd; argv[2] = val; pthread_mutex_lock( &rrd_mutex ); optind=0; opterr=0; rrd_clear_error(); rrd_update(argc, argv); if(rrd_test_error()) { err_msg("RRD_update (%s): %s", rrd, rrd_get_error()); pthread_mutex_unlock( &rrd_mutex ); return 0; } /* debug_msg("Updated rrd %s with value %s", rrd, val); */ pthread_mutex_unlock( &rrd_mutex ); return 0; }
/** * \brief Update RRD stats file * * \param[in] stats Stats data * \param[in] templ RRD template */ void stats_update(stats_data *stats, std::string templ) { std::vector<std::string> argv; /* Set RRD file */ argv.push_back("update"); argv.push_back(stats->file); /* Set template */ argv.push_back("--template"); argv.push_back(templ); /* Add counters */ argv.push_back(stats_counters_to_string(stats->last, stats->fields)); /* 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(); } /* Update database */ if (rrd_update(argv.size(), (char **) c_argv)) { MSG_ERROR(msg_module, "RRD Insert Error: %s", rrd_get_error()); rrd_clear_error(); } delete c_argv; }
int update_rrd(char* file, long int last_up, data_t* dt) { if ( dt ) { char data[256]; update_params[1] = file; sprintf(data, "%ld:%u:%u:%u:%u:%u:%u", last_up, dt->bytes, dt->ip_v4_bytes, dt->not_ip_bytes, dt->tcp_bytes, dt->udp_bytes, dt->other_bytes); update_params[2] = data; if (rrd_update(3, update_params)) { fprintf(stderr, "rrd update failed: %s\n", rrd_get_error()); rrd_clear_error(); } else printf("%s updated!\n", file); bzero(dt, sizeof(data_t)); } else fprintf(stderr, "\nerror\n"); return 0; }
int wrap_rrd_update(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_update(argc, argv); // free up the memory Free_argv(argv); return i; } else { // error return (-1); } }
JNIEXPORT void JNICALL Java_gnu_rrd_RRDJNI_update (JNIEnv *env, jclass cl, jobjectArray argv) { char **argv2; argv2 = initArgs(env, argv, "update"); rrd_update((*env)->GetArrayLength(env, argv)+1, argv2); freeArgs(env, argv, argv2); if (rrd_test_error()) throwException(env, "gnu/rrd/RRDException", rrd_get_error()); }
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); }
void rrdtool_update_command (const char *name, const char *what, double val) { if (RRD_DEBUG) fprintf (fp_stderr, "rrdtool: update(%s,%s,%f)\n", name, what, val); #ifdef RRD_TREE sprintf (rrd.file, "%s/%s/%s.rrd", rrd.conf.path, name, what); #else sprintf (rrd.file, "%s/%s.%s.rrd", rrd.conf.path, name, what); #endif /* at the first call of this function, all the needed rrd files are created with the start time set appropriately */ if (stat (rrd.file, &rrd.fbuf) == -1) rrdtool_create_all (); if (rrd.time_update == 0) rrd.time_update = (unsigned long) current_time.tv_sec; #ifdef RRD_THREADED sprintf (rrd.cmd, "update %s %ld:%f\n", rrd.file, rrd.time_update, val); if (RRD_DEBUG) fprintf (fp_stderr, "rrdtool: rrd_update('%s')\n", rrd.cmd); write (command_pipe[1],rrd.cmd, strlen(rrd.cmd) ); #else sprintf (rrd.cmd, "update %s %ld:%f", rrd.file, rrd.time_update, val); if (RRD_DEBUG) fprintf (fp_stderr, "rrdtool: rrd_update('%s')\n", rrd.cmd); optind = 0; opterr = 0; rrdtool_str2argv (rrd.cmd); rrd_update (rrd.argc, rrd.argv); if (rrd_test_error ()) { fprintf (fp_stderr, "rrdtool: update command:\n%s\n", rrd.cmd); fprintf (fp_stderr, "rrdtool: update error!\n%s\n", rrd_get_error ()); if (rrd.fatal) exit (1); rrd_clear_error (); } #endif }
void * call_rrd_update(void*arg){ char buffer [2000]; int i = 0; time_t t; srand((unsigned) time(&t)); /* Set Cpu and I/O low priority struct sched_param sc_par; sc_par.sched_priority = 0; pthread_setschedparam(pthread_self(), SCHED_OTHER, &sc_par); setpriority(PRIO_PROCESS, 0, 19); syscall(SYS_ioprio_set,1, 0, (2<< 13)| 7);*/ /* Open pipe as a stream */ FILE * buffer_pipe = fdopen(command_pipe[0], "r"); rrd_clear_error (); /* Infinite loop on pipe */ while(1){ usleep(10000); fgets(buffer,2000,buffer_pipe); /* Replace \n with \0 */ buffer[strlen(buffer)-1]= '\0'; /* Execute update */ rrdtool_str2argv(buffer); optind = 0; opterr = 0; rrd_update (rrd.argc, rrd.argv); //if (i++%1000 == 0)printf("RRD\n"); /* Check errors */ if (rrd_test_error ()) { fprintf (fp_stderr, "rrdtool: update command:\n'%s'\n", buffer); fprintf (fp_stderr, "rrdtool: update error!\n%s\n", rrd_get_error ()); if (rrd.fatal) exit (1); rrd_clear_error (); } } return NULL; }
/** * @brief 更新RRD数据库 * @param rrd_file rrd数据库路径 * @param value 数值 * @param num 个数 * @return 成功返回0,失败返回-1 */ int c_rrd_handler::RRD_update(const char *rrd_file, const char *value, const char *num) { int argc = 3; const char *argv[4] = {NULL}; char val[128] = {'\0'}; if(NULL == rrd_file || NULL == value) { ERROR_LOG("RRD path OR Value is NULL."); return -1; } // if(access(rrd_file, F_OK | R_OK | W_OK) != 0) { // ERROR_LOG("Can not access rrd_file[%s]: [%s]", rrd_file, strerror(errno)); // return -1; // } if(num) { snprintf(val, sizeof(val) - 1, "N:%s:%s", value, num); } else { snprintf(val, sizeof(val) - 1, "N:%s", value); } argv[0] = "dummy"; argv[1] = rrd_file; argv[2] = val; optind = 0; optopt = 0; opterr = 0; optarg = NULL; rrd_clear_error(); rrd_update(argc, (char**)argv); if(rrd_test_error()) { ERROR_LOG("ERROR: RRD_update(%s): %s", rrd_file, rrd_get_error()); return -1; } return 0; }
static PyObject * PyRRD_update(PyObject UNUSED(*self), PyObject *args) { PyObject *r; char **argv; int argc; if (create_args("update", args, &argc, &argv) < 0) return NULL; if (rrd_update(argc, argv) == -1) { PyErr_SetString(ErrorObject, rrd_get_error()); rrd_clear_error(); r = NULL; } else { Py_INCREF(Py_None); r = Py_None; } destroy_args(&argv); return r; }
void onTimer(ev::timer&, int) { if (filename_.empty()) return; // not properly configured char format[128]; snprintf(format, sizeof(format), "N:%zu:%zu:%zu", numRequests_.exchange(0), bytesIn_.exchange(0), bytesOut_.exchange(0)); const char *args[4] = { "update", filename_.c_str(), format, nullptr }; rrd_clear_error(); int rv = rrd_update(3, (char **) args); if (rv < 0) { log(x0::Severity::error, "Could not update RRD statistics: %s", rrd_get_error()); } }
int rrdUpdate (void) { int ret = rrdChips (); if (!ret && doLoad) { FILE *loadavg; if (!(loadavg = fopen ("/proc/loadavg", "r"))) { sensorLog (LOG_ERR, "Error opening `/proc/loadavg': %s", strerror (errno)); ret = 1; } else { float value; if (fscanf (loadavg, "%f", &value) != 1) { sensorLog (LOG_ERR, "Error reading load average"); ret = 2; } else { sprintf (rrdBuff + strlen (rrdBuff), ":%f", value); } fclose (loadavg); } } if (!ret) { const char *argv[] = { "sensord", rrdFile, rrdBuff, NULL }; optind = 1; opterr = 0; optopt = '?'; optarg = NULL; if ((ret = rrd_update (3, (char **) /* WEAK */ argv))) { sensorLog (LOG_ERR, "Error updating RRD file: %s: %s", rrdFile, rrd_get_error ()); } } sensorLog (LOG_DEBUG, "sensor rrd updated"); return ret; }
int pi_rrd_update (rrd_ctxt_t * rrd) { int retval; rrd_ctxt_datapoint_t *dp; unsigned int argc = 0; char *argv[4]; buffer_t *u; u = bf_alloc ((rrd->npoints + rrd->nrras + 1) * 22); if (!u) goto error; bf_printf (u, "%lu:", now.tv_sec); for (dp = rrd->points.next; dp != &rrd->points; dp = dp->next) { switch (dp->elem->type) { case VAL_ELEM_LONG: bf_printf (u, "%ld:", *dp->elem->val.v_ulong); break; case VAL_ELEM_ULONG: case VAL_ELEM_MEMSIZE: bf_printf (u, "%lu:", *dp->elem->val.v_ulong); break; case VAL_ELEM_UINT: bf_printf (u, "%u:", *dp->elem->val.v_uint); break; case VAL_ELEM_INT: bf_printf (u, "%d:", *dp->elem->val.v_uint); break; case VAL_ELEM_BYTESIZE: case VAL_ELEM_ULONGLONG: #ifdef USE_WINDOWS bf_printf (u, "%Lu:", *dp->elem->val.v_ulonglong); #else bf_printf (u, "%I64u:", *dp->elem->val.v_ulonglong); #endif break; case VAL_ELEM_DOUBLE: bf_printf (u, "%lf:", *dp->elem->val.v_uint); break; default: break; } } /* delete last colon */ u->e[-1] = 0; argv[argc++] = "update"; argv[argc++] = rrd->filename; argv[argc++] = u->s; argv[argc] = NULL; retval = rrd_update (argc, argv); if (retval < 0) { errno = 0; plugin_perror (_("RRD %s update failed: %s!"), rrd->name, rrd_get_error ()); } bf_free (u); error: /* set the timer for a multiple of the period */ etimer_set (&rrd->timer, (rrd->period - (now.tv_sec % rrd->period)) * 1000); return retval; }
void RRDVisAnalyzer::nextTable() { // nexttable pushes all information to the RRDs // this is only done when a table is finished as we may only push // newer data to rrdtool // we can only be sure to have no older data when we read a new table std::cout << "Starting to update rrds ..." << std::endl; // this char** is necessary for the rrd_* calls. // we only need 4 strings for the rrd_update calls. // later on we need to include more for the graphing parts (hence array_length = 30) const size_t length = 350; const size_t array_length = 30; char* rrd_args[array_length]; for (size_t i = 0; i != 3; ++i) { rrd_args[i] = (char*) malloc(length*sizeof(char)); bzero(rrd_args[i], length); } rrd_args[4] = NULL; for (SubnetList::iterator i = subnetList.begin(); i != subnetList.end(); ++i) { std::cout << "Writing " << i->first << " ..." << std::endl; for (TimeSubnetStats::iterator j = i->second.begin(); j != i->second.end(); ++j) { /* std::stringstream command; command << rrdPath << " update " << rrdDbPath << "/" << rrdDBMap[i->first] << " "; command << j->first << ":" << j->second.in_packets << ":" << j->second.in_bytes << ":"; command << j->second.out_packets << ":" << j->second.out_bytes << ":"; command << j->second.out_packets + j->second.in_packets << ":" << j->second.out_bytes + j->second.in_bytes; std::cout << command.str() << std::endl; system(command.str().c_str()); */ std::stringstream update; update << j->first << ":" ; update << (int64_t)0-(int64_t)(j->second.in_packets) << ":" << (int64_t)0-(int64_t)(j->second.in_tcp_packets) << ":" << (int64_t)0-(int64_t)(j->second.in_udp_packets) << ":" << (int64_t)0-(int64_t)(j->second.in_icmp_packets) << ":"; update << (int64_t)0-(int64_t)(j->second.in_bytes) << ":" << (int64_t)0-(int64_t)(j->second.in_tcp_bytes) << ":" << (int64_t)0-(int64_t)(j->second.in_udp_bytes) << ":" << (int64_t)0-(int64_t)(j->second.in_icmp_bytes) << ":"; update << j->second.out_packets << ":" << j->second.out_tcp_packets << ":" << j->second.out_udp_packets << ":" << j->second.out_icmp_packets << ":"; update << j->second.out_bytes << ":" << j->second.out_tcp_bytes << ":" << j->second.out_udp_bytes << ":" << j->second.out_icmp_bytes << ":"; update << j->second.out_packets + j->second.in_packets << ":" << j->second.out_tcp_packets + j->second.in_tcp_packets << ":" << j->second.out_udp_packets + j->second.in_udp_packets << ":" << j->second.out_icmp_packets + j->second.in_icmp_packets << ":"; update << j->second.out_bytes + j->second.in_bytes << ":" << j->second.out_tcp_bytes + j->second.in_tcp_bytes << ":" << j->second.out_udp_bytes + j->second.in_udp_bytes << ":" << j->second.out_icmp_bytes + j->second.in_icmp_bytes; strncpy(rrd_args[0], "update", length); strncpy(rrd_args[1], (rrdDbPath +"/" + rrdDBMap[i->first]).c_str(), length); strncpy(rrd_args[2], update.str().c_str(), length); //std:: cout << rrd_args[0] << " " << rrd_args[1] << " " << rrd_args[2] << " " << rrd_args[3] << std::endl;; if (rrd_update(3, (char**)rrd_args) != 0) { std::cout << "Failed to update rrdtool: " << rrd_get_error() << std::endl; rrd_clear_error(); } } } for (size_t i = 0; i != 3; ++i) { free(rrd_args[i]); } std::cout << "Updated rrds ..." << std::endl; std::cout << "Generating graphs ..." << std::endl; // allocate char arrays; for (size_t i = 0; i != array_length; ++i) { rrd_args[i] = (char*) malloc(length*sizeof(char)); bzero(rrd_args[i], length); } for (SubnetList::iterator i = subnetList.begin(); i != subnetList.end(); ++i) { std::string rrd_db = rrdDbPath +"/" + rrdDBMap[i->first]; for (size_t j = 0; j != graphTimeSpans.size(); ++j) { std::string graph_file = rrdDbPath + "/" + rrdDBMap[i->first] + "-bytes" + graphTimeSpans[j] + ".png"; if (graph_file.size() > length) { throw std::runtime_error("Error: graph_file.size() > length"); } graphRRD(graph_file, rrd_db, rrdDBMap[i->first], "bytes", graphTimeSpans[j]); graph_file = rrdDbPath + "/" + rrdDBMap[i->first] + "-packets" + graphTimeSpans[j] + ".png"; graphRRD(graph_file, rrd_db, rrdDBMap[i->first], "packets", graphTimeSpans[j]); } } subnetList.clear(); }
int RRD_StoreDataRow(char *path, char *iso_time, data_row *row) { char rrd_filename[1024], *buff, *s; char *rrd_arg[10]; time_t when, frag; int i, j, len, p, t, buffsize, argc; uint32_t pnum; struct stat statbuf; buffsize = MAXBUFF; buff = (char *)malloc(buffsize); if ( !buff ) { perror("Memory error!"); return 0; } when = ISO2UNIX(iso_time); if ( !when ) return 0; // make sure, we are at a 5min boundary frag = when % 300; if ( frag ) { fprintf(stderr, "Round to next timeslot: offset %lld\n", (long long)frag); when -= frag; } for ( p=tcp; p<=udp; p++ ) { // for every protocol TCP - UDP for ( t=flows; t<=bytes; t++ ) { // for every type flows - packets - bytes for (j=0; j<64; j++) { // for all 64 RRD files in proto - type len = snprintf(rrd_filename, 1024, "%s/%s-%s-%d.rrd", path, proto[p], type[t], j); if ( len >= 1024 ) { fprintf(stderr, "Failed to concat RRD filename: string overflow"); return 0; } // Check if RRD file exists if ( (stat(rrd_filename, &statbuf) < 0 ) || !(statbuf.st_mode & S_IFREG) ) { fprintf(stderr, "No such RRD file: '%s'\n", rrd_filename); return 0; } buffsize = MAXBUFF; s = buff; /* add time to RRD arg string */ len = snprintf(s, buffsize, "%lld:", (long long)when); buffsize -= len; s += len; /* add port data to RRD arg string */ for ( i=0; i<1024; i++) { pnum = ( j << 10 ) + i; /* if ( row[pnum].proto[p].type[t] ) { fprintf(stderr, "%d %d %d\n", pnum, p, t); } */ len = snprintf(s, buffsize, "%llu:", (long long unsigned)row[pnum].proto[p].type[t]); if ( len >= buffsize ) { fprintf(stderr, "No enough space to create RRD arg\n"); return 0; } buffsize -= len; s += len; } s--; *s = '\0'; // Create arg vector argc = 0; rrd_arg[argc++] = "update"; rrd_arg[argc++] = rrd_filename; rrd_arg[argc++] = buff; rrd_arg[argc] = NULL; optind = 0; opterr = 0; rrd_clear_error(); if ( ( i=rrd_update(argc, rrd_arg))) { fprintf(stderr, "RRD: %s Insert Error: %d %s\n", rrd_filename, i, rrd_get_error()); } } // for all 64 rrd files } // for every type flows - packets - bytes } // for every protocol TCP - UDP return 1; } // End of RRD_StoreDataRow
void update_rra(const char* filename, const char* line, const char* timestamp) { // create the structures that we need for the call to rrd_update // we need only 4 args to the call: // "update", filename, "updatestring" char* rrd_args[6]; #define RRD_ELEM_LEN 4096 #define TEMPLATE_LEN 1024 #define VALUE_LEN 1024 size_t i; for (i = 0; i != 5; ++i) { rrd_args[i] = (char*) malloc(RRD_ELEM_LEN*sizeof(char)); bzero(rrd_args[i], RRD_ELEM_LEN); } rrd_args[5] = NULL; char template_string[TEMPLATE_LEN]; bzero(template_string, TEMPLATE_LEN); size_t template_string_len = 0; char value_string[VALUE_LEN]; bzero(value_string, TEMPLATE_LEN); snprintf(value_string, VALUE_LEN, "%s", timestamp); size_t value_string_len = strlen(value_string); // create a copy of the line for strtok char* tmp_line = (char*) malloc(sizeof(char) * (strlen(line) + 1)); if (!tmp_line) { fprintf(stderr, "ERROR: malloc of tmp_line: %s\n", strerror(errno)); exit(-1); } strcpy(tmp_line, line); char delimiter[] = " :"; char* ptr; ptr = strtok(tmp_line, delimiter); int key = 1; // if key is one, then we have a key, otherwise we have a value int first_template = 1; // 1 if this is the first entry to the template string, 0 otherwise while (ptr) { if (key == 1) { // NOTE: the maximum size of a rrdtool data source can be 20 bytes, which // means that we can have 19 characters and the trailing NULL character. // we therefore need to limit our string to 19 characters ... if (strlen(ptr) > 19) { ptr[19] = 0; } // the template string has the format // KEY1:KEY2:KEY3:KEY4 ... snprintf(template_string + template_string_len, TEMPLATE_LEN - template_string_len, "%s%s", first_template?"":":", ptr); template_string_len = strlen(template_string); first_template = 0; } else { // the value string has the format // N:VALUE1:VALUE2:VALUE3: ... snprintf(value_string + value_string_len, VALUE_LEN - value_string_len, ":%s", ptr); value_string_len = strlen(value_string); } key = key?0:1; ptr = strtok(NULL, delimiter); } //printf("%s %lu\n", template_string, strlen(template_string)); //printf("%s %lu\n", value_string, strlen(value_string)); snprintf(rrd_args[0], RRD_ELEM_LEN, "update"); snprintf(rrd_args[1], RRD_ELEM_LEN, "%s", filename); snprintf(rrd_args[2], RRD_ELEM_LEN, "--template", template_string); snprintf(rrd_args[3], RRD_ELEM_LEN, "%s", template_string); snprintf(rrd_args[4], RRD_ELEM_LEN, "%s", value_string); //printf("%s %s %s %s %s\n", rrd_args[0], rrd_args[1], rrd_args[2], rrd_args[3], rrd_args[4], rrd_args[5]); if (rrd_update(5, (char**)rrd_args) != 0) { fprintf(stderr, "Failed to update rrdtool: %s\n", rrd_get_error()); rrd_clear_error(); } for (i = 0; i != 5; ++i) { free(rrd_args[i]); } free(tmp_line); }
/* 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); }
/* 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); }