[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