[libvirt] [PATCH v4 39/42] remote: handle autoprobing of driver within virtproxyd
Jim Fehlig
JFEHLIG at suse.com
Tue Aug 13 15:22:14 UTC 2019
On 8/8/19 9:10 AM, Daniel P. Berrangé wrote:
> The virtproxyd daemon is merely responsible for forwarding RPC calls to
> one of the other per-driver daemons. As such, it does not have any
> drivers loaded and so regular auto-probing logic will not work. We need
> it to be able to handle NULL URIs though, so must implement some kind of
> alternative probing logic.
>
> When running as root this is quite crude. If a per-driver daemon is
> running, its UNIX socket will exist and we can assume it will accept
> connections. If the per-driver daemon is not running, but socket
> autostart is enabled, we again just assume it will accept connections.
>
> The is not great, however, because a default install may well have
> all sockets available for activation. IOW, the virtxend socket may
> exist, despite the fact that the libxl driver will not actually work.
>
> When running as non-root this is slightly easier as we only have two
> drivers, QEMU and VirtualBox. These daemons will likely not be running
> and socket activation won't be used either, as libvirt spawns the
> daemon on demand. So we just check whether the daemon actually is
> installed.
>
> Reviewed-by: Andrea Bolognani <abologna at redhat.com>
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> ---
> src/remote/Makefile.inc.am | 1 +
> src/remote/remote_daemon_dispatch.c | 138 ++++++++++++++++++++++++++++
> 2 files changed, 139 insertions(+)
>
> diff --git a/src/remote/Makefile.inc.am b/src/remote/Makefile.inc.am
> index 0a3aef1ec1..09535ee6bb 100644
> --- a/src/remote/Makefile.inc.am
> +++ b/src/remote/Makefile.inc.am
> @@ -235,6 +235,7 @@ virtproxyd_CFLAGS = \
> -DSOCK_PREFIX="\"libvirt\"" \
> -DDAEMON_NAME="\"virtproxyd\"" \
> -DENABLE_IP \
> + -DVIRTPROXYD \
> $(NULL)
> virtproxyd_LDFLAGS = $(REMOTE_DAEMON_LD_FLAGS)
> virtproxyd_LDADD = $(REMOTE_DAEMON_LD_ADD)
> diff --git a/src/remote/remote_daemon_dispatch.c b/src/remote/remote_daemon_dispatch.c
> index 7a66629d5b..c8e353ebd3 100644
> --- a/src/remote/remote_daemon_dispatch.c
> +++ b/src/remote/remote_daemon_dispatch.c
> @@ -50,6 +50,7 @@
> #include "viraccessapicheckqemu.h"
> #include "virpolkit.h"
> #include "virthreadjob.h"
> +#include "configmake.h"
>
> #define VIR_FROM_THIS VIR_FROM_RPC
>
> @@ -2094,6 +2095,131 @@ void *remoteClientNew(virNetServerClientPtr client,
>
> /*----- Functions. -----*/
>
> +#ifdef VIRTPROXYD
> +/*
> + * When running in virtproxyd regular auto-probing of drivers
> + * does not work as we don't have any drivers present (except
> + * stateless ones inside libvirt.so). All the interesting
> + * drivers are in separate daemons. Thus when we get a NULL
> + * URI we need to simulate probing that virConnectOpen would
> + * previously do. We use the existance of the UNIX domain
> + * socket as our hook for probing.
> + *
> + * This assumes no stale sockets left over from a now dead
> + * daemon, but that's reasonable since libvirtd unlinks
> + * sockets it creates on shutdown, or uses systemd activation
> + *
> + * We only try to probe for primary hypervisor drivers,
> + * not the secondary drivers.
> + */
> +static int
> +remoteDispatchProbeURI(bool readonly,
> + char **probeduri)
> +{
> + *probeduri = NULL;
> + VIR_DEBUG("Probing for driver daemon sockets");
> +
> + /*
> + * If running root, either the daemon is running and the socket
> + * exists, or we're using socket activation so the socket exists
> + * too.
> + *
> + * If running non-root, chances are that the daemon won't be
> + * running, nor any socket activation is used. We need to
> + * be able to auto-spawn the daemon. We thus just check to
> + * see what daemons are installed. This is not a big deal as
> + * only QEMU & VBox run as non-root, anyway.
> + */
> + if (geteuid() != 0) {
> + /* Order these the same as virDriverLoadModule
> + * calls in daemonInitialize */
> + const char *drivers[] = {
> +# ifdef WITH_QEMU
> + "qemu",
> +# endif
> +# ifdef WITH_VBOX
> + "vbox",
> +# endif
> + };
> + size_t i;
> +
> + for (i = 0; i < ARRAY_CARDINALITY(drivers) && !*probeduri; i++) {
FYI, while skimming through libvirt-related mail on xen-devel I noticed the
following build failure
remote/remote_daemon_dispatch.c:2146:23: error: comparison of unsigned
expression < 0 is always false [-Werror=type-limits]
for (i = 0; i < ARRAY_CARDINALITY(drivers) && !*probeduri; i++) {
^
Full log
http://logs.test-lab.xenproject.org/osstest/logs/140045/build-amd64-libvirt/6.ts-libvirt-build.log
Regards,
Jim
More information about the libvir-list
mailing list