From ca3c7b7ea65f155451ad63315bb01080ffb880d2 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Tue, 15 May 2018 17:04:23 +0200 Subject: [PATCH] settings-test: Add option to use the frontend to display the settings This resolves references and redefined values. It currently doesn't work properly if section names contain dots. --- scripts/settings-test.c | 107 +++++++++++++++++++++++++++++++++------- 1 file changed, 88 insertions(+), 19 deletions(-) diff --git a/scripts/settings-test.c b/scripts/settings-test.c index 2169552ac..336da09f0 100644 --- a/scripts/settings-test.c +++ b/scripts/settings-test.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014 Tobias Brunner + * Copyright (C) 2014-2018 Tobias Brunner * HSR Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -29,21 +29,32 @@ bool settings_parser_parse_file(void *this, char *name); /** - * Recursively print the section and all subsections/settings + * Produce indentation for the given level */ -static void print_section(section_t *section, int level) +static void get_indent(char indent[BUF_LEN], int level) { - section_t *sub; - kv_t *kv; int i; - char indent[256]; - for (i = 0; i < level * 2 && i < sizeof(indent) - 2; i += 2) + for (i = 0; i < level * 2 && i < BUF_LEN - 2; i += 2) { indent[i ] = ' '; indent[i+1] = ' '; } indent[i] = '\0'; +} + +/** + * Recursively print the section and all subsections/settings + */ +static void print_section(section_t *section, int level) +{ + section_t *sub; + section_ref_t *ref; + kv_t *kv; + char indent[BUF_LEN]; + int i, j; + + get_indent(indent, level); for (i = 0; i < array_count(section->kv_order); i++) { @@ -53,12 +64,53 @@ static void print_section(section_t *section, int level) for (i = 0; i < array_count(section->sections_order); i++) { array_get(section->sections_order, i, &sub); - printf("%s%s {\n", indent, sub->name); + printf("%s%s", indent, sub->name); + if (array_count(sub->references)) + { + for (j = 0; j < array_count(sub->references); j++) + { + array_get(sub->references, j, &ref); + printf("%s%s", j == 0 ? " : " : ", ", ref->name); + } + } + printf(" {\n", indent); print_section(sub, level + 1); printf("%s}\n", indent); } } +/** + * Recursively print a given section and all subsections/settings + * FIXME: Doesn't work properly if any of the keys contain dots + */ +static void print_settings_section(settings_t *settings, char *section, + int level) +{ + enumerator_t *enumerator; + char indent[BUF_LEN], buf[BUF_LEN], *key, *value; + + get_indent(indent, level); + + enumerator = settings->create_key_value_enumerator(settings, section); + while (enumerator->enumerate(enumerator, &key, &value)) + { + printf("%s%s = %s\n", indent, key, value); + + } + enumerator->destroy(enumerator); + + enumerator = settings->create_section_enumerator(settings, section); + while (enumerator->enumerate(enumerator, &key)) + { + printf("%s%s {\n", indent, key); + snprintf(buf, sizeof(buf), "%s%s%s", section, + strlen(section) ? "." : "", key); + print_settings_section(settings, buf, level + 1); + printf("%s}\n", indent); + } + enumerator->destroy(enumerator); +} + static void usage(FILE *out, char *name) { fprintf(out, "Test strongswan.conf parser\n\n"); @@ -66,6 +118,7 @@ static void usage(FILE *out, char *name) fprintf(out, "Options:\n"); fprintf(out, " -h, --help print this help.\n"); fprintf(out, " -d, --debug enables debugging of the parser.\n"); + fprintf(out, " -r, --resolve displays the settings with references/redefines resolved.\n"); fprintf(out, " -f, --file=FILE config file to load (default STDIN).\n"); fprintf(out, "\n"); } @@ -73,12 +126,7 @@ static void usage(FILE *out, char *name) int main(int argc, char *argv[]) { char *file = NULL; - - /* don't load strongswan.conf */ - library_init("", "settings-test"); - atexit(library_deinit); - - dbg_default_set_level(3); + bool resolve = FALSE; while (true) { @@ -86,9 +134,10 @@ int main(int argc, char *argv[]) {"help", no_argument, NULL, 'h' }, {"debug", no_argument, NULL, 'd' }, {"file", required_argument, NULL, 'f' }, + {"resolve", no_argument, NULL, 'r' }, {0,0,0,0 }, }; - switch (getopt_long(argc, argv, "hdf:", long_opts, NULL)) + switch (getopt_long(argc, argv, "hdf:r", long_opts, NULL)) { case EOF: break; @@ -101,6 +150,9 @@ int main(int argc, char *argv[]) case 'f': file = optarg; continue; + case 'r': + resolve = TRUE; + continue; default: usage(stderr, argv[0]); return 1; @@ -108,15 +160,32 @@ int main(int argc, char *argv[]) break; } + /* don't load strongswan.conf */ + library_init("", "settings-test"); + atexit(library_deinit); + + dbg_default_set_level(3); + if (file) { - section_t *root = settings_section_create(strdup("root")); + if (resolve) + { + settings_t *settings = settings_create(file); - settings_parser_parse_file(root, file); + print_settings_section(settings, "", 0); - print_section(root, 0); + settings->destroy(settings); + } + else + { + section_t *root = settings_section_create(strdup("root")); - settings_section_destroy(root, NULL); + settings_parser_parse_file(root, file); + + print_section(root, 0); + + settings_section_destroy(root, NULL); + } } else {