+#include <stdlib.h>
+#include <string.h>
+
#include "debug.h"
#include "config.h"
#include "rrdtool.h"
const char *database = NULL, *filename = NULL, *timestart = NULL;
const char *timeend = NULL, *imageformat = NULL;
const char **options = NULL, **text = NULL;
+ const char *updatestr = NULL;
int width = 0, height = 0, text_lead = 0;
count = config_setting_length(list);
config_setting_lookup_string(image, "timestart", ×tart);
if (!timestart) {
- pr_err("Database %s does not have \"height\" entry "
+ pr_err("Database %s does not have \"timestart\" entry "
" in image data\n",
db->name);
return -1;
config_setting_lookup_string(image, "timeend", &timeend);
if (!timeend) {
- pr_err("Database %s does not have \"height\" entry "
+ pr_err("Database %s does not have \"timeend\" entry "
" in image data\n",
db->name);
return -1;
config_setting_lookup_string(image, "imageformat",
&imageformat);
if (!imageformat) {
- pr_err("Database %s does not have \"height\" entry "
- " in image data\n",
+ pr_err("Database %s does not have \"imageformat\" "\
+ "entry in image data\n",
db->name);
return -1;
}
+ config_setting_lookup_string(image, "update_string",
+ &updatestr);
+
str_list = config_setting_get_member(image, "options");
if (str_list)
read_strings_from_list(str_list, &options);
db->images[i]->width = width;
db->images[i]->height = height;
strncpy(db->images[i]->timestart, timestart,
- sizeof(db->images[i]->timestart));
+ sizeof(db->images[i]->timestart) - 1);
strncpy(db->images[i]->timeend, timeend,
- sizeof(db->images[i]->timeend));
+ sizeof(db->images[i]->timeend) - 1);
strncpy(db->images[i]->imageformat, imageformat,
- sizeof(db->images[i]->imageformat));
+ sizeof(db->images[i]->imageformat) - 1);
db->images[i]->options = options;
db->images[i]->text_lead = text_lead;
db->images[i]->text = text;
+
+ if (updatestr)
+ db->images[i]->updatestr = strdup(updatestr);
}
return 0;
}
-static int (*str_to_parser(const char *str))(char *rrd_data, void *parser_data)
-{
- if (!str)
- return NULL;
-
- if (!strcmp(str, "cpu"))
- return cpu_parser;
-
- if (!strcmp(str, "mem"))
- return mem_parser;
-
- if (!strcmp(str, "cpu_mem"))
- return cpu_mem_parser;
-
- if (!strcmp(str, "digitemp"))
- return digitemp_parser;
-
- if (!strcmp(str, "digitemp_mod"))
- return digitemp_parser_mod;
-
- if (!strcmp(str, "script"))
- return script_parser;
-
- if (!strcmp(str, "netstats"))
- return netstats_parser;
-
- return NULL;
-}
-
static int parse_data_sources(config_setting_t *rrd, struct rrd_database *db)
{
config_setting_t *list, *group;
{
config_setting_t *list, *str_list;
const char *name, *parser = NULL, *filename, **parser_data;
+ const char **pre_draw_cmd;
+ const char **post_draw_cmd;
+ const char *logfile = NULL, *logfile_timestamp_fmt = NULL;
if (!config_setting_lookup_string(rrd, "name", &name)) {
pr_err("Database entry does not contain name\n");
pr_info("parsing database %s\n", name);
db->name = strdup(name);
- if (!config_setting_lookup_string(rrd, "filename", &filename)) {
+ if (!config_setting_lookup_string(rrd, "filename", &filename))
pr_err("Database %s does not contain filename\n", db->name);
- return -1;
- }
+
db->filename = strdup(filename);
if (!config_setting_lookup_int(rrd, "interval", &db->interval)) {
/* Parser is not a mandatory parameter */
config_setting_lookup_string(rrd, "parser", &parser);
- db->parse = str_to_parser(parser);
+ db->parser = str_to_parser(parser);
list = config_setting_get_member(rrd, "image");
parse_images(list, db);
db->parser_data = parser_data;
}
+ str_list = config_setting_get_member(rrd, "pre_draw_cmd");
+ if (str_list) {
+ read_strings_from_list(str_list, &pre_draw_cmd);
+ db->pre_draw_cmd = (char *const *)pre_draw_cmd;
+ }
+
+ str_list = config_setting_get_member(rrd, "post_draw_cmd");
+ if (str_list) {
+ read_strings_from_list(str_list, &post_draw_cmd);
+ db->post_draw_cmd = (char *const *)post_draw_cmd;
+ }
+
+ config_setting_lookup_string(rrd, "logfile", &logfile);
+ if (logfile)
+ db->logfile = strdup(logfile);
+
+ config_setting_lookup_string(rrd, "logfile_timestamp_fmt",
+ &logfile_timestamp_fmt);
+ if (logfile_timestamp_fmt)
+ db->logfile_timestamp_fmt = strdup(logfile_timestamp_fmt);
+
+
return 0;
}
config_destroy(&config);
return rrd_db;
}
-
-#define CONFIG_ADD_STRING(_config, _setting, _name, _val) \
- do { \
- _setting = config_setting_add(_config, _name, \
- CONFIG_TYPE_STRING); \
- config_setting_set_string(_setting, _val); \
- } while (0); \
-
-#define CONFIG_ADD_INT(_config, _setting, _name, _val) \
- do { \
- _setting = config_setting_add(_config, _name, \
- CONFIG_TYPE_INT); \
- config_setting_set_int(_setting, _val); \
- } while (0); \
-
-#define CONFIG_ADD_FLOAT(_config, _setting, _name, _val) \
- do { \
- _setting = config_setting_add(_config, _name, \
- CONFIG_TYPE_FLOAT); \
- config_setting_set_float(_setting, _val); \
- } while (0); \
-
-static void put_strings_to_list(config_setting_t *config,
- const char *entry_name, const char **strings)
-{
- config_setting_t *list, *setting;
- int i;
-
- list = config_setting_add(config, entry_name, CONFIG_TYPE_LIST);
- for (i = 0; strings[i]; i++)
- CONFIG_ADD_STRING(list, setting, NULL, strings[i]);
-}
-
-static void put_image_to_list(config_setting_t *config,
- struct rrd_image *image)
-{
- config_setting_t *setting, *group;
-
- group = config_setting_add(config, "image", CONFIG_TYPE_GROUP);
-
- CONFIG_ADD_STRING(group, setting, "rrd_database", image->rrd_database);
- CONFIG_ADD_STRING(group, setting, "filename", image->image_filename);
- CONFIG_ADD_INT(group, setting, "width", image->width);
- CONFIG_ADD_INT(group, setting, "height", image->height);
- CONFIG_ADD_STRING(group, setting, "timestart", image->timestart);
- CONFIG_ADD_STRING(group, setting, "timeend", image->timeend);
- CONFIG_ADD_STRING(group, setting, "imageformat", image->imageformat);
-
- put_strings_to_list(group, "options", image->options);
-
- CONFIG_ADD_INT(group, setting, "text_lead", image->text_lead);
-
- put_strings_to_list(group, "text", image->text);
-}
-
-static void put_data_source_to_list(config_setting_t *list,
- struct rrd_data_source *source)
-{
- config_setting_t *setting, *group;
-
- group = config_setting_add(list, "data_source", CONFIG_TYPE_GROUP);
-
- CONFIG_ADD_STRING(group, setting, "type", source->type);
- CONFIG_ADD_STRING(group, setting, "name", source->name);
- CONFIG_ADD_INT(group, setting, "heartbeat", source->heartbeat);
- CONFIG_ADD_FLOAT(group, setting, "min", source->min);
- CONFIG_ADD_FLOAT(group, setting, "max", source->max);
-}
-
-static void put_archive_to_list(config_setting_t *list,
- struct rrd_archive *archive)
-{
- config_setting_t *setting, *group;
-
- group = config_setting_add(list, "archive", CONFIG_TYPE_GROUP);
-
- CONFIG_ADD_STRING(group, setting, "type", archive->type);
- CONFIG_ADD_FLOAT(group, setting, "xff", archive->xff);
- CONFIG_ADD_INT(group, setting, "steps", archive->steps);
- CONFIG_ADD_INT(group, setting, "rows", archive->rows);
-}
-
-static char *parser_to_str(int (*parser)(char *rrd_data, void *parser_data))
-{
- if (parser == cpu_parser)
- return "cpu";
-
- if (parser == mem_parser)
- return "mem";
-
- if (parser == cpu_mem_parser)
- return "cpu_mem";
-
- if (parser == digitemp_parser)
- return "digitemp";
-
- if (parser == digitemp_parser_mod)
- return "digitemp_mod";
-
- if (parser == script_parser)
- return "script";
-
- if (parser == netstats_parser)
- return "netstats";
-
- return NULL;
-}
-
-static void put_database_to_list(config_setting_t *config,
- struct rrd_database *db)
-{
- config_setting_t *setting;
- config_setting_t *list, *group;
- char *str = parser_to_str(db->parse);
- int i;
-
- group = config_setting_add(config, RRD_DATABASE_LIST,
- CONFIG_TYPE_GROUP);
-
- CONFIG_ADD_STRING(group, setting, "name", db->name);
- CONFIG_ADD_STRING(group, setting, "filename", db->filename);
- CONFIG_ADD_INT(group, setting, "interval", db->interval);
- CONFIG_ADD_STRING(group, setting, "parser", str);
-
- if (db->parser_data)
- put_strings_to_list(group, "parser_data", db->parser_data);
-
- list = config_setting_add(group, "image", CONFIG_TYPE_LIST);
- for (i = 0; db->images[i]; i++) {
- put_image_to_list(list, db->images[i]);
- }
-
- if (db->sources) {
- list = config_setting_add(group, "sources", CONFIG_TYPE_LIST);
- for (i = 0; db->sources[i].type; i++) {
- put_data_source_to_list(list, &db->sources[i]);
- }
- }
-
- if (db->archives) {
- list = config_setting_add(group, "archives", CONFIG_TYPE_LIST);
- for (i = 0; db->archives[i].type; i++) {
- put_archive_to_list(list, &db->archives[i]);
- }
- }
-}
-
-int write_database(const char *conffile, struct rrd_database **rrd_db)
-{
- config_t config;
- config_setting_t *root, *rrd_database_list;
- int i;
- int ret;
-
- config_init(&config);
-
- config_set_tab_width(&config, 4);
-
- root = config_root_setting(&config);
-
- rrd_database_list = config_setting_add(root, RRD_DATABASE_LIST,
- CONFIG_TYPE_LIST);
- for (i = 0; rrd_db[i]; i++) {
- put_database_to_list(rrd_database_list, rrd_db[i]);
- }
-
- ret = !config_write_file(&config, conffile);
- if (ret)
- pr_err("Error while writing file.\n");
-
- config_destroy(&config);
-
- return ret;
-}