Commit Diff
Diff:
5eb3fc905f5e3bd2f2d586fb1e0ceda879500b3e
f0a01fc742e83b3f4736b5d64af3ab18148afc5a
Commit:
f0a01fc742e83b3f4736b5d64af3ab18148afc5a
Tree:
b0f9e815f8b7692787bc95fa70d896b648095abf
Author:
Omar Polo <op@omarpolo.com>
Date:
Sat Oct 9 21:40:55 2021 UTC
Message:
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.
commit - 5eb3fc905f5e3bd2f2d586fb1e0ceda879500b3e
commit + f0a01fc742e83b3f4736b5d64af3ab18148afc5a
blob - e69c10860b5e61366d2de0a7607f218f3e22bb0a
blob + 94403c060db24d84cacd1d5fb1b03af8df57770c
--- ChangeLog
+++ ChangeLog
@@ -1,4 +1,6 @@
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
blob - b9944ead3b4311d8c30bbd6705224a4a736a2e70
blob + 39121037af40309a08e71b3e26653c447be9d02f
--- gmid.1
+++ gmid.1
@@ -62,6 +62,8 @@ Check that the configuration is valid, but don't start
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
blob - f0ffa3ef389cff98e442c2da2c9c20de1ad98dab
blob + 1b91e298a97cc3d37d1a5d4ff58af35f3b2ed3e3
--- gmid.c
+++ gmid.c
@@ -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;
}
blob - a691b751848c60f07699c64b85205891353b2d08
blob + ecd53a26758d1f5c8b06a71a2d45c722a2155544
--- gmid.h
+++ gmid.h
@@ -291,6 +291,7 @@ int cmdline_symset(char *);
void yyerror(const char*, ...);
void parse_conf(const char*);
+void print_conf(void);
int cmdline_symset(char *);
/* log.c */
blob - 54282a36b33c7144b66bf3b0984a1efb84c0e595
blob + 255be767e5e0e7036a0052ae4030359d73847cf0
--- parse.y
+++ parse.y
@@ -811,6 +811,33 @@ int
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)
{
Omar Polo