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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxx>
---
  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




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux