two -n to dump the parsed configuration

This adds a barebone dumping of the parsed configuration.  It is not
complete, but I'm interested in dumping the full path to `cert' and
`key' in order to write some scripts that can inspect the
configuration, extract the certificates and renew them when expired
automatically.

It's not easy to parse gmid configuration otherwise because the syntax
is flexible and users can use macros.  Instead, the idea is to run
gmid and let it dump the configuration once it's been parsed in a
static and predictable format.

Now is possible to parse gmid configuration with, say, awk or perl.
This commit is contained in:
Omar Polo 2021-10-09 21:40:55 +00:00
parent 5eb3fc905f
commit f0a01fc742
5 changed files with 36 additions and 2 deletions

View File

@ -1,5 +1,7 @@
2021-10-09 Omar Polo <op@omarpolo.com>
* parse.y (print_conf): multiple -n to dump the parsed configuration
* contrib/gencert: add gencert, a simple script to generate self-signed certs
2021-10-04 Omar Polo <op@omarpolo.com>

2
gmid.1
View File

@ -62,6 +62,8 @@ in the config file if present.
Stays and logs on the foreground.
.It Fl n
Check that the configuration is valid, but don't start the server.
If specified two or more time, dump the configuration in addition to
verify it.
.It Fl P Pa pidfile
Write daemon's pid to the given location.
.Ar pidfile

6
gmid.c
View File

@ -589,7 +589,7 @@ main(int argc, char **argv)
return 0;
case 'n':
conftest = 1;
conftest++;
break;
case 'P':
@ -639,7 +639,9 @@ main(int argc, char **argv)
if (config_path == NULL)
fatal("missing configuration");
parse_conf(config_path);
puts("config OK");
fprintf(stderr, "config OK\n");
if (conftest > 1)
print_conf();
return 0;
}

1
gmid.h
View File

@ -291,6 +291,7 @@ void drop_priv(void);
void yyerror(const char*, ...);
void parse_conf(const char*);
void print_conf(void);
int cmdline_symset(char *);
/* log.c */

27
parse.y
View File

@ -811,6 +811,33 @@ parse_conf(const char *filename)
exit(1);
}
void
print_conf(void)
{
struct vhost *h;
/* struct location *l; */
/* struct envlist *e; */
/* struct alist *a; */
if (conf.chroot != NULL)
printf("chroot \"%s\"\n", conf.chroot);
printf("ipv6 %s\n", conf.ipv6 ? "on" : "off");
/* XXX: defined mimes? */
printf("port %d\n", conf.port);
printf("prefork %d\n", conf.prefork);
/* XXX: protocols? */
if (conf.user != NULL)
printf("user \"%s\"\n", conf.user);
TAILQ_FOREACH(h, &hosts, vhosts) {
printf("\nserver \"%s\" {\n", h->domain);
printf(" cert \"%s\"\n", h->cert);
printf(" key \"%s\"\n", h->key);
/* TODO: print locations... */
printf("}\n");
}
}
int
symset(const char *name, const char *val, int persist)
{