Exemple #1
0
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;
}
Exemple #2
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;
}
Exemple #3
0
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;
}
Exemple #4
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);
	}
}
Exemple #5
0
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());
}
Exemple #6
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;
}
Exemple #7
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);
}
Exemple #8
0
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
  
}
Exemple #9
0
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;
}
Exemple #10
0
/** 
 * @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;
}
Exemple #11
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;
}
Exemple #12
0
	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());
		}
	}
Exemple #13
0
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;
}
Exemple #14
0
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;
}
Exemple #15
0
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();
}
Exemple #16
0
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
Exemple #17
0
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);
}
Exemple #18
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);
}
Exemple #19
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);
}