14 #define ARGSTR_LEN 32768
16 #define RRDTOOL_CMD "/usr/bin/rrdtool"
19 * Add new argument to a argument list
21 * args pointer list to arguments
22 * argcnt argument counter
23 * argstr array where the actual arguments are stored
24 * idx index in the argstr where the new argument will be appended
26 #define add_arg(args, argcnt, argstr, idx, fmt, arg...) \
27 args[argcnt] = argstr + idx; \
28 idx += sprintf(argstr + idx, fmt, ##arg); \
32 int rrdtool_draw_image(struct rrd_image *image)
34 char cmd[] = RRDTOOL_CMD;
35 // char cmd[] = "echo";
36 char *args[512], argstr[ARGSTR_LEN];
37 int idx = 0, argcnt = 0, i,j;
42 pr_info("Drawing image %s\n", image->image_filename);
44 strftime(tmp, 256, "%d.%m.%Y %T (%Z) ", localtime(&t));
45 for (i = 0, j = 0; j < 256;) {
47 timestamp[j++] = '\\';
49 timestamp[j++] = tmp[i++];
56 add_arg(args, argcnt, argstr, idx, " ");
57 add_arg(args, argcnt, argstr, idx, "graph");
58 add_arg(args, argcnt, argstr, idx, "%s", image->image_filename);
60 add_arg(args, argcnt, argstr, idx, "--start");
61 add_arg(args, argcnt, argstr, idx, "%s", image->timestart);
62 add_arg(args, argcnt, argstr, idx, "--end");
63 add_arg(args, argcnt, argstr, idx, "%s", image->timeend);
64 add_arg(args, argcnt, argstr, idx, "--width");
65 add_arg(args, argcnt, argstr, idx, "%d", image->width);
66 add_arg(args, argcnt, argstr, idx, "--height");
67 add_arg(args, argcnt, argstr, idx, "%d", image->height);
68 add_arg(args, argcnt, argstr, idx, "--imgformat");
69 add_arg(args, argcnt, argstr, idx, "%s", image->imageformat);
71 for (i = 0; image->options[i]; i++) {
72 add_arg(args, argcnt, argstr, idx, "%s", image->options[i]);
75 for (i = 0; image->text[i]; i++) {
76 args[argcnt++] = image->text[i];
79 add_arg(args, argcnt, argstr, idx, "COMMENT:Last update %s\\c", timestamp);
88 int rrdtool_draw_images(struct rrd_image **image)
91 for (i = 0; image[i]; i++)
92 rrdtool_draw_image(image[i]);
97 int rrdtool_update_data(struct rrd_database *rrd)
99 char data[RRD_DATA_MAX_LEN];
100 char cmd[] = RRDTOOL_CMD;
101 // char cmd[] = "echo";
111 rrd->last_update = time(0);
115 l = sprintf(data, "N:");
118 rrd->parse(data + l, rrd->parser_data);
123 rrdtool_draw_images(rrd->images);
125 while (harvest_zombies(0));
129 static int database_exists(struct rrd_database *db)
133 /* If the filename exists, stat will return zero */
135 return !stat(db->filename, &s);
140 static int create_database(struct rrd_database *db)
142 char cmd[] = RRDTOOL_CMD;
143 // char cmd[] = "echo";
144 char *args[512], argstr[ARGSTR_LEN];
145 int idx = 0, argcnt = 0;
148 if (!db->sources || !db->archives) {
149 printf("Cannot create db \"%s\", insufficient source data\n",
154 add_arg(args, argcnt, argstr, idx, " ");
155 add_arg(args, argcnt, argstr, idx, "create");
156 add_arg(args, argcnt, argstr, idx, "%s", db->filename);
157 add_arg(args, argcnt, argstr, idx, "--step");
158 add_arg(args, argcnt, argstr, idx, "%d", db->interval);
160 for (i = 0; db->sources[i].type; i++) {
161 add_arg(args, argcnt, argstr, idx, "DS:%s:%s:%d:%f:%f",
164 db->sources[i].heartbeat,
169 for (i = 0; db->archives[i].type; i++) {
170 add_arg(args, argcnt, argstr, idx, "RRA:%s:%f:%d:%d",
171 db->archives[i].type,
173 db->archives[i].steps,
174 db->archives[i].rows);
177 child = run(cmd, args);
179 harvest_zombies(child);
184 int rrdtool_check_databases(struct rrd_database *dbs[])
186 struct rrd_database *db;
189 for (i = 0, db = dbs[i]; db; i++, db = dbs[i]) {
190 if (database_exists(db)) {
191 printf("database %s found\n", db->filename);
194 printf("Database %s missing, creating\n", db->filename);
197 printf("All done\n");