Add support for rrdcached(1) (1/2: update)
This commit is contained in:
parent
edb8efe603
commit
9b15ff87e6
12
src/damon.c
12
src/damon.c
|
@ -55,6 +55,7 @@ typedef struct _Host
|
||||||
struct _DaMon
|
struct _DaMon
|
||||||
{
|
{
|
||||||
char const * prefix;
|
char const * prefix;
|
||||||
|
char const * rrdcached;
|
||||||
unsigned int refresh;
|
unsigned int refresh;
|
||||||
Host * hosts;
|
Host * hosts;
|
||||||
unsigned int hosts_cnt;
|
unsigned int hosts_cnt;
|
||||||
|
@ -161,7 +162,7 @@ int damon_update(DaMon * damon, RRDType type, char const * filename,
|
||||||
== NULL)
|
== NULL)
|
||||||
return -1;
|
return -1;
|
||||||
va_start(args, args_cnt);
|
va_start(args, args_cnt);
|
||||||
ret = rrd_updatev(type, path, args_cnt, args);
|
ret = rrd_updatev(type, damon->rrdcached, path, args_cnt, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
string_delete(path);
|
string_delete(path);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -203,6 +204,7 @@ static int _init_config(DaMon * damon, char const * filename)
|
||||||
if((config = config_new()) == NULL)
|
if((config = config_new()) == NULL)
|
||||||
return 1;
|
return 1;
|
||||||
damon->prefix = NULL;
|
damon->prefix = NULL;
|
||||||
|
damon->rrdcached = NULL;
|
||||||
damon->refresh = DAMON_DEFAULT_REFRESH;
|
damon->refresh = DAMON_DEFAULT_REFRESH;
|
||||||
damon->hosts = NULL;
|
damon->hosts = NULL;
|
||||||
damon->hosts_cnt = 0;
|
damon->hosts_cnt = 0;
|
||||||
|
@ -221,6 +223,13 @@ static int _init_config(DaMon * damon, char const * filename)
|
||||||
config_delete(config);
|
config_delete(config);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if((p = config_get(config, "", "rrdcached")) != NULL
|
||||||
|
&& (damon->rrdcached = strdup(p)) == NULL)
|
||||||
|
{
|
||||||
|
free(damon->prefix);
|
||||||
|
config_delete(config);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
if((p = config_get(config, "", "refresh")) != NULL)
|
if((p = config_get(config, "", "refresh")) != NULL)
|
||||||
{
|
{
|
||||||
tmp = strtol(p, &q, 10);
|
tmp = strtol(p, &q, 10);
|
||||||
|
@ -353,5 +362,6 @@ static void _damon_destroy(DaMon * damon)
|
||||||
}
|
}
|
||||||
event_delete(damon->event);
|
event_delete(damon->event);
|
||||||
free(damon->hosts);
|
free(damon->hosts);
|
||||||
|
free(damon->rrdcached);
|
||||||
free(damon->prefix);
|
free(damon->prefix);
|
||||||
}
|
}
|
||||||
|
|
42
src/rrd.c
42
src/rrd.c
|
@ -63,7 +63,7 @@ static char * _rrd_timestamp(off_t offset);
|
||||||
/* rrd_create */
|
/* rrd_create */
|
||||||
static int _create_directories(char const * filename);
|
static int _create_directories(char const * filename);
|
||||||
|
|
||||||
int rrd_create(RRDType type, char const * filename)
|
int rrd_create(RRDType type, char const * rrdcached, char const * filename)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
char * argv[16] = { RRDTOOL, "create", NULL, "--start", NULL, NULL };
|
char * argv[16] = { RRDTOOL, "create", NULL, "--start", NULL, NULL };
|
||||||
|
@ -167,27 +167,30 @@ static int _create_directories(char const * filename)
|
||||||
|
|
||||||
|
|
||||||
/* rrd_update */
|
/* rrd_update */
|
||||||
int rrd_update(RRDType type, char const * filename, int args_cnt, ...)
|
int rrd_update(RRDType type, char const * rrdcached, char const * filename, int
|
||||||
|
args_cnt, ...)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
va_list args;
|
va_list args;
|
||||||
|
|
||||||
va_start(args, args_cnt);
|
va_start(args, args_cnt);
|
||||||
ret = rrd_updatev(type, filename, args_cnt, args);
|
ret = rrd_updatev(type, rrdcached, filename, args_cnt, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* rrd_updatev */
|
/* rrd_updatev */
|
||||||
int rrd_updatev(RRDType type, char const * filename, int args_cnt, va_list args)
|
int rrd_updatev(RRDType type, char const * rrdcached, char const * filename,
|
||||||
|
int args_cnt, va_list args)
|
||||||
{
|
{
|
||||||
struct stat st;
|
struct stat st;
|
||||||
char * argv[] = { RRDTOOL, "update", NULL, NULL, NULL };
|
char * argv[] = { RRDTOOL, "update", NULL, NULL, NULL, NULL, NULL };
|
||||||
|
size_t i = 3;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
size_t s;
|
size_t s;
|
||||||
int pos;
|
int pos;
|
||||||
int i;
|
int arg;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
@ -198,7 +201,7 @@ int rrd_updatev(RRDType type, char const * filename, int args_cnt, va_list args)
|
||||||
{
|
{
|
||||||
if(errno != ENOENT)
|
if(errno != ENOENT)
|
||||||
return _rrd_perror(filename, -errno);
|
return _rrd_perror(filename, -errno);
|
||||||
if(rrd_create(type, filename) != 0)
|
if(rrd_create(type, rrdcached, filename) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
/* prepare the parameters */
|
/* prepare the parameters */
|
||||||
|
@ -206,19 +209,32 @@ int rrd_updatev(RRDType type, char const * filename, int args_cnt, va_list args)
|
||||||
return _rrd_perror("gettimeofday", -errno);
|
return _rrd_perror("gettimeofday", -errno);
|
||||||
if((argv[2] = string_new(filename)) == NULL)
|
if((argv[2] = string_new(filename)) == NULL)
|
||||||
return 1;
|
return 1;
|
||||||
s = (args_cnt + 1) * 12;
|
if(rrdcached != NULL)
|
||||||
if((argv[3] = malloc(s)) == NULL)
|
|
||||||
{
|
{
|
||||||
|
argv[i++] = "--daemon";
|
||||||
|
if((argv[i++] = string_new(rrdcached)) == NULL)
|
||||||
|
{
|
||||||
|
string_delete(argv[2]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
s = (args_cnt + 1) * 12;
|
||||||
|
if((argv[i] = malloc(s)) == NULL)
|
||||||
|
{
|
||||||
|
if(rrdcached != NULL)
|
||||||
|
string_delete(argv[4]);
|
||||||
string_delete(argv[2]);
|
string_delete(argv[2]);
|
||||||
return _rrd_perror(NULL, -errno);
|
return _rrd_perror(NULL, -errno);
|
||||||
}
|
}
|
||||||
pos = snprintf(argv[3], s, "%ld", tv.tv_sec);
|
pos = snprintf(argv[i], s, "%ld", tv.tv_sec);
|
||||||
for(i = 0; i < args_cnt; i++)
|
for(arg = 0; arg < args_cnt; arg++)
|
||||||
pos += snprintf(&argv[3][pos], s - pos, ":%"PRIu64,
|
pos += snprintf(&argv[i][pos], s - pos, ":%"PRIu64,
|
||||||
va_arg(args, uint64_t));
|
va_arg(args, uint64_t));
|
||||||
/* update the database */
|
/* update the database */
|
||||||
ret = _rrd_exec(argv);
|
ret = _rrd_exec(argv);
|
||||||
free(argv[3]);
|
free(argv[i]);
|
||||||
|
if(rrdcached != NULL)
|
||||||
|
string_delete(argv[4]);
|
||||||
string_delete(argv[2]);
|
string_delete(argv[2]);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,10 +35,11 @@ typedef enum _RRDType
|
||||||
|
|
||||||
|
|
||||||
/* functions */
|
/* functions */
|
||||||
int rrd_create(RRDType type, char const * filename);
|
int rrd_create(RRDType type, char const * rrdcached, char const * filename);
|
||||||
|
|
||||||
int rrd_update(RRDType type, char const * filename, int args_cnt, ...);
|
int rrd_update(RRDType type, char const * rrdcached, char const * filename,
|
||||||
int rrd_updatev(RRDType type, char const * filename,
|
int args_cnt, ...);
|
||||||
|
int rrd_updatev(RRDType type, char const * rrdcached, char const * filename,
|
||||||
int args_cnt, va_list args);
|
int args_cnt, va_list args);
|
||||||
|
|
||||||
#endif /* !DAMON_RRD_H */
|
#endif /* !DAMON_RRD_H */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user