[libvirt PATCH 9/9] rpc: use new virt-nc binary for remote tunnelling

Michal Privoznik mprivozn at redhat.com
Fri Jul 10 12:03:59 UTC 2020


On 7/9/20 8:36 PM, Daniel P. Berrangé wrote:
> This wires up support for using the new virt-nc binary with the ssh,
> libssh and libssh2 protocols.
> 
> The new binary will be used preferentially if it is available in $PATH,
> otherwise we fall back to traditional netcat.
> 
> The "proxy" URI parameter can be used to force use of netcat e.g.
> 
>    qemu+ssh://host/system?proxy=netcat
> 
> or the disable fallback e.g.
> 
>    qemu+ssh://host/system?proxy=virt-nc
> 
> With use of virt-nc, we can now support remote session URIs
> 
>    qemu+ssh://host/session
> 
> and this will only use virt-nc, with no fallback. This also lets the
> libvirtd process be auto-started.
> 
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> ---
>   docs/uri.html.in            | 18 ++++++++++
>   src/remote/remote_driver.c  | 30 +++++++++++++++-
>   src/remote/remote_sockets.c |  8 -----
>   src/rpc/virnetclient.c      | 70 ++++++++++++++++++++++++++++++-------
>   src/rpc/virnetclient.h      | 30 +++++++++++++---
>   tests/virnetsockettest.c    |  7 ++--
>   6 files changed, 136 insertions(+), 27 deletions(-)
> 

> diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c
> index cd1bcc3ab3..5939f74e62 100644
> --- a/src/rpc/virnetclient.c
> +++ b/src/rpc/virnetclient.c
> @@ -50,6 +50,10 @@ enum {
>       VIR_NET_CLIENT_MODE_COMPLETE,
>   };
>   
> +VIR_ENUM_IMPL(virNetClientProxy,
> +              VIR_NET_CLIENT_PROXY_LAST,
> +              "auto", "netcat", "virt-nc");
> +
>   struct _virNetClientCall {
>       int mode;
>   
> @@ -414,20 +418,50 @@ virNetClientDoubleEscapeShell(const char *str)
>   }
>   
>   char *
> -virNetClientSSHHelperCommand(const char *netcatPath,
> -                             const char *socketPath)
> +virNetClientSSHHelperCommand(virNetClientProxy proxy,
> +                             const char *netcatPath,
> +                             const char *socketPath,
> +                             const char *driverURI,
> +                             bool readonly)
>   {
>       g_autofree char *netcatPathSafe = virNetClientDoubleEscapeShell(netcatPath);
> +    g_autofree char *driverURISafe = virNetClientDoubleEscapeShell(driverURI);
> +    g_autofree char *nccmd = NULL;
> +    g_autofree char *virtnccmd = NULL;
>   
> -    return g_strdup_printf(
> -        "sh -c "
> -        "'if '%s' -q 2>&1 | grep \"requires an argument\" >/dev/null 2>&1; then "
> -          "ARG=-q0;"
> +    nccmd = g_strdup_printf(
> +        "if '%s' -q 2>&1 | grep \"requires an argument\" >/dev/null 2>&1; then "
> +            "ARG=-q0;"
>           "else "
> -          "ARG=;"
> +            "ARG=;"
>           "fi;"
> -        "'%s' $ARG -U %s'",
> +        "'%s' $ARG -U %s",
>           netcatPathSafe, netcatPathSafe, socketPath);
> +
> +    virtnccmd = g_strdup_printf("%s '%s'",
> +                                readonly ? "virt-nc -r" : "virt-nc",
> +                                driverURISafe);
> +
> +    switch (proxy) {
> +    case VIR_NET_CLIENT_PROXY_AUTO:
> +        return g_strdup_printf("sh -c 'which virt-nc 1>/dev/null 2>&1; "
> +                               "if test $? = 0; then "
> +                               "    %s; "
> +                               "else"
> +                               "    %s; "
> +                               "fi'", virtnccmd, nccmd);
> +
> +    case VIR_NET_CLIENT_PROXY_NETCAT:
> +        return g_strdup_printf("sh -c '%s'", nccmd);
> +
> +    case VIR_NET_CLIENT_PROXY_VIRT_NC:
> +        return g_strdup_printf("sh -c '%s'", virtnccmd);
> +
> +    case VIR_NET_CLIENT_PROXY_LAST:
> +    default:
> +        virReportEnumRangeError(virNetClientProxy, proxy);
> +        return NULL;
> +    }
>   }

This needs to be coupled with virnetsockettest update because the 
expected output of executed command changes.

Michal




More information about the libvir-list mailing list