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, const char **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";
-
- if (parser == onewire_parser)
- return "onewire";
-
- 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;
-}