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.
This commit is contained in:
Tobias Brunner 2018-05-15 17:04:23 +02:00
parent 35ca6a7b2f
commit ca3c7b7ea6
1 changed files with 88 additions and 19 deletions

View 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
@ -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
{