settings-test: Add option to use the frontend to display the settings
authorTobias Brunner <tobias@strongswan.org>
Tue, 15 May 2018 15:04:23 +0000 (17:04 +0200)
committerTobias Brunner <tobias@strongswan.org>
Wed, 27 Jun 2018 12:19:35 +0000 (14:19 +0200)
This resolves references and redefined values. It currently doesn't work
properly if section names contain dots.

scripts/settings-test.c

index 2169552..336da09 100644 (file)
@@ -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
 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);
+
+                       print_settings_section(settings, "", 0);
+
+                       settings->destroy(settings);
+               }
+               else
+               {
+                       section_t *root = settings_section_create(strdup("root"));
 
-               settings_parser_parse_file(root, file);
+                       settings_parser_parse_file(root, file);
 
-               print_section(root, 0);
+                       print_section(root, 0);
 
-               settings_section_destroy(root, NULL);
+                       settings_section_destroy(root, NULL);
+               }
        }
        else
        {