From: Richard Kettlewell Date: Thu, 21 May 2009 19:31:34 +0000 (+0000) Subject: Horrible bodge to wait for root user to be created before attempting to X-Git-Tag: 5.0~115 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/commitdiff_plain/abf64ff8ca718eef550f37e753506fc42b19e902 Horrible bodge to wait for root user to be created before attempting to connect from test scripts. Really the server's startup ordering needs to be adjusted instead. --- diff --git a/clients/disorder.c b/clients/disorder.c index bc2a8ec..ccfaf20 100644 --- a/clients/disorder.c +++ b/clients/disorder.c @@ -51,6 +51,7 @@ #include "vector.h" #include "version.h" #include "dateparse.h" +#include "trackdb.h" static disorder_client *client; @@ -64,6 +65,7 @@ static const struct option options[] = { { "help-commands", no_argument, 0, 'H' }, { "user", required_argument, 0, 'u' }, { "password", required_argument, 0, 'p' }, + { "wait-for-root", no_argument, 0, 'W' }, { 0, 0, 0, 0 } }; @@ -728,8 +730,28 @@ static void help_commands(void) { exit(0); } +static void wait_for_root(void) { + const char *password; + + while(!trackdb_readable()) { + info("waiting for trackdb..."); + sleep(1); + } + trackdb_init(TRACKDB_NO_RECOVER|TRACKDB_NO_UPGRADE); + for(;;) { + trackdb_open(TRACKDB_READ_ONLY); + password = trackdb_get_password("root"); + trackdb_close(); + if(password) + break; + info("waiting for root user to be created..."); + sleep(1); + } + trackdb_deinit(); +} + int main(int argc, char **argv) { - int n, i, j, local = 0; + int n, i, j, local = 0, wfr = 0; int status = 0; struct vector args; const char *user = 0, *password = 0; @@ -740,7 +762,7 @@ int main(int argc, char **argv) { pcre_free = xfree; if(!setlocale(LC_CTYPE, "")) fatal(errno, "error calling setlocale"); if(!setlocale(LC_TIME, "")) fatal(errno, "error calling setlocale"); - while((n = getopt_long(argc, argv, "+hVc:dHlNu:p:", options, 0)) >= 0) { + while((n = getopt_long(argc, argv, "+hVc:dHlNu:p:W", options, 0)) >= 0) { switch(n) { case 'h': help(); case 'H': help_commands(); @@ -751,6 +773,7 @@ int main(int argc, char **argv) { case 'N': config_per_user = 0; break; case 'u': user = optarg; break; case 'p': password = optarg; break; + case 'W': wfr = 1; break; default: fatal(0, "invalid option"); } } @@ -763,6 +786,8 @@ int main(int argc, char **argv) { config->password = password; if(local) config->connect.af = -1; + if(wfr) + wait_for_root(); n = optind; optind = 1; /* for subsequent getopt calls */ /* gcrypt initialization */ diff --git a/lib/client.c b/lib/client.c index 00d7cf5..20db675 100644 --- a/lib/client.c +++ b/lib/client.c @@ -396,7 +396,7 @@ int disorder_connect(disorder_client *c) { if(!password) { /* Oh well */ c->last = "no password"; - error(0, "no password configured"); + error(0, "no password configured for user '%s'", username); return -1; } return disorder_connect_generic(config, diff --git a/tests/dtest.py b/tests/dtest.py index d2bb201..38eadf8 100644 --- a/tests/dtest.py +++ b/tests/dtest.py @@ -230,10 +230,8 @@ Start the daemon.""" print " starting daemon" # remove the socket if it exists socket = "%s/home/socket" % testroot - try: + if os.path.exists(socket): os.remove(socket) - except: - pass daemon = subprocess.Popen(["disorderd", "--foreground", "--config", "%s/config" % testroot], @@ -254,6 +252,10 @@ Start the daemon.""" time.sleep(1) if waited > 0: print " took about %ds for socket to appear" % waited + # Wait for root user to be created + command(["disorder", + "--config", disorder._configfile, "--no-per-user-config", + "--wait-for-root"]) def create_user(username="fred", password="fredpass"): """create_user(USERNAME, PASSWORD)