ganeti.daemon: fix daemon mode with GnuTLS >= 3.3
authorApollon Oikonomopoulos <apoikos@gmail.com>
Sat, 4 Oct 2014 18:14:03 +0000 (21:14 +0300)
committerHelga Velroyen <helgav@google.com>
Mon, 6 Oct 2014 09:25:15 +0000 (11:25 +0200)
commit6e06de4e7efbb037b9a46b8c2063a05b2921d94f
treef5dc642121655d2ade3777ac8e47dc5ccd2e746c
parenta8f2733bd00c5f18be1f0203c945db5e748eb19f
ganeti.daemon: fix daemon mode with GnuTLS >= 3.3

Newer GnuTLS versions (>= 3.3.0) use a library constructor for
initialization and open /dev/urandom on library load, way before we
fork(). Closing /dev/urandom on fork causes a failure to re-seed GnuTLS's
random number generator during the first ganeti.http.client request, which
in turn causes the process to silently abort(3).

For more background on this behavior, see this thread at the GnuTLS
mailing list:

http://lists.gnupg.org/pipermail/gnutls-help/2014-April/003429.html

Note that calling pycurl.global_init() at the correct place (as we do) is not
enough, as it does not cause a re-initialization of the GnuTLS library.

As we cannot reliably detect neither the GnuTLS version, nor the socket, we
work our way around this by keeping all fds referring to /dev/urandom open
after fork. We do so using the /proc/self/fd interface.

This fixes issues #961 and #964.

Note that this would not affect the Haskell daemons using cURL + GnuTLS,
because we don't close all file descriptors on fork there.

Signed-off-by: Apollon Oikonomopoulos <apoikos@gmail.com>
Reviewed-by: Helga Velroyen <helgav@google.com>
lib/daemon.py