15 #define ARGSTR_LEN 32768
17 #define RRDTOOL_CMD "/usr/bin/rrdtool"
20 * Add new argument to a argument list
22 * args pointer list to arguments
23 * argcnt argument counter
24 * argstr array where the actual arguments are stored
25 * idx index in the argstr where the new argument will be appended
27 #define add_arg(args, argcnt, argstr, idx, fmt, arg...) \
28 args[argcnt] = argstr + idx; \
29 idx += sprintf(argstr + idx, fmt, ##arg); \
33 int rrdtool_draw_image(struct rrd_image *image)
35 char cmd[] = RRDTOOL_CMD;
36 // char cmd[] = "echo";
37 char *args[512], argstr[ARGSTR_LEN];
38 int idx = 0, argcnt = 0, i,j;
44 pr_info("Drawing image %s\n", image->image_filename);
47 strncat(tmpfile, image->image_filename, sizeof(tmp) - strlen(tmp) - 1);
48 strncat(tmpfile, ".tmp", sizeof(tmp) - strlen(tmp) - 1);
50 strftime(tmp, 256, "%d.%m.%Y %T (%Z) ", localtime(&t));
51 for (i = 0, j = 0; j < 256;) {
53 timestamp[j++] = '\\';
55 timestamp[j++] = tmp[i++];
62 add_arg(args, argcnt, argstr, idx, " ");
63 add_arg(args, argcnt, argstr, idx, "graph");
64 add_arg(args, argcnt, argstr, idx, "%s", tmpfile);
66 add_arg(args, argcnt, argstr, idx, "--start");
67 add_arg(args, argcnt, argstr, idx, "%s", image->timestart);
68 add_arg(args, argcnt, argstr, idx, "--end");
69 add_arg(args, argcnt, argstr, idx, "%s", image->timeend);
70 add_arg(args, argcnt, argstr, idx, "--width");
71 add_arg(args, argcnt, argstr, idx, "%d", image->width);
72 add_arg(args, argcnt, argstr, idx, "--height");
73 add_arg(args, argcnt, argstr, idx, "%d", image->height);
74 add_arg(args, argcnt, argstr, idx, "--imgformat");
75 add_arg(args, argcnt, argstr, idx, "%s", image->imageformat);
77 for (i = 0; image->options[i]; i++) {
78 add_arg(args, argcnt, argstr, idx, "%s", image->options[i]);
81 for (i = 0; image->text[i]; i++) {
82 args[argcnt++] = image->text[i];
85 add_arg(args, argcnt, argstr, idx, "COMMENT:Last update %s\\c", timestamp);
91 rename(tmpfile, image->image_filename);
96 int rrdtool_draw_images(struct rrd_image **image)
99 for (i = 0; image[i]; i++)
100 rrdtool_draw_image(image[i]);
105 static int sanitize_rrd_update_data(char *data)
107 char clean_data[RRD_DATA_MAX_LEN];
110 char *src, *end, *cln;
112 data[RRD_DATA_MAX_LEN - 1] = 0;
116 while (src < data + RRD_DATA_MAX_LEN && *src) {
123 end = skip_numbers(src);
127 end = skip_numbers(end);
130 if (*end == ':' || !*end) {
135 for (; src <= end; src++, cln++)
141 while (*end != ':' && *end)
153 strncpy(data, clean_data, RRD_DATA_MAX_LEN);
157 int rrdtool_update_data(struct rrd_database *rrd)
159 char data[RRD_DATA_MAX_LEN + 2];
160 char cmd[] = RRDTOOL_CMD;
161 // char cmd[] = "echo";
171 rrd->last_update = time(0);
175 l = sprintf(data, "N:");
178 rrd->parse(data + l, rrd->parser_data);
179 sanitize_rrd_update_data(data + l);
184 rrdtool_draw_images(rrd->images);
186 while (harvest_zombies(0));
190 static int database_exists(struct rrd_database *db)
194 /* If the filename exists, stat will return zero */
196 return !stat(db->filename, &s);
201 static int create_database(struct rrd_database *db)
203 char cmd[] = RRDTOOL_CMD;
204 // char cmd[] = "echo";
205 char *args[512], argstr[ARGSTR_LEN];
206 int idx = 0, argcnt = 0;
209 if (!db->sources || !db->archives) {
210 printf("Cannot create db \"%s\", insufficient source data\n",
215 add_arg(args, argcnt, argstr, idx, " ");
216 add_arg(args, argcnt, argstr, idx, "create");
217 add_arg(args, argcnt, argstr, idx, "%s", db->filename);
218 add_arg(args, argcnt, argstr, idx, "--step");
219 add_arg(args, argcnt, argstr, idx, "%d", db->interval);
221 for (i = 0; db->sources[i].type; i++) {
222 add_arg(args, argcnt, argstr, idx, "DS:%s:%s:%d:%f:%f",
225 db->sources[i].heartbeat,
230 for (i = 0; db->archives[i].type; i++) {
231 add_arg(args, argcnt, argstr, idx, "RRA:%s:%f:%d:%d",
232 db->archives[i].type,
234 db->archives[i].steps,
235 db->archives[i].rows);
238 child = run(cmd, args);
240 harvest_zombies(child);
245 int rrdtool_check_databases(struct rrd_database *dbs[])
247 struct rrd_database *db;
250 for (i = 0, db = dbs[i]; db; i++, db = dbs[i]) {
251 if (database_exists(db)) {
252 printf("database %s found\n", db->filename);
255 printf("Database %s missing, creating\n", db->filename);
258 printf("All done\n");