]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Pass through arguments of 'ssh' block driver used by libguestfs
authorPeter Krempa <pkrempa@redhat.com>
Mon, 9 Mar 2020 14:05:58 +0000 (15:05 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 16 Mar 2020 14:51:44 +0000 (15:51 +0100)
We currently don't model the 'ssh' protocol properties properly and
since it seems impossible for now (agent path passed via environment
variable). To allow libguestfs to work as it used in pre-blockdev era we
must carry the properties over to the command line. For this instance we
just store it internally and format it back.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_block.c
src/util/virstoragefile.c
src/util/virstoragefile.h
tests/qemublocktest.c
tests/qemublocktestdata/jsontojson/ssh-passthrough-libguestfs-in.json [new file with mode: 0644]
tests/qemublocktestdata/jsontojson/ssh-passthrough-libguestfs-out.json [new file with mode: 0644]

index f64bd8254b872ef476c15f4784beab053f7acab3..5ddf7f1f7c8ec584cf04a87e8b96dfa4dcaade88 100644 (file)
@@ -911,6 +911,7 @@ qemuBlockStorageSourceGetSshProps(virStorageSourcePtr src)
     g_autoptr(virJSONValue) serverprops = NULL;
     virJSONValuePtr ret = NULL;
     const char *username = NULL;
+    g_autoptr(virJSONValue) host_key_check = NULL;
 
     if (src->nhosts != 1) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@@ -924,11 +925,20 @@ qemuBlockStorageSourceGetSshProps(virStorageSourcePtr src)
 
     if (src->auth)
         username = src->auth->username;
+    else if (src->ssh_user)
+        username = src->ssh_user;
+
+    if (src->ssh_host_key_check_disabled &&
+        virJSONValueObjectCreate(&host_key_check,
+                                 "s:mode", "none",
+                                 NULL) < 0)
+        return NULL;
 
     if (virJSONValueObjectCreate(&ret,
                                  "s:path", src->path,
                                  "a:server", &serverprops,
                                  "S:user", username,
+                                 "A:host-key-check", &host_key_check,
                                  NULL) < 0)
         return NULL;
 
index ab2f0ead5f35eab82c138a437b4fd7db5723eb5f..870c40f446644fd8d2628d522bfaf17f37bfa595 100644 (file)
@@ -2464,6 +2464,10 @@ virStorageSourceCopy(const virStorageSource *src,
             return NULL;
     }
 
+    /* ssh config passthrough for libguestfs */
+    def->ssh_host_key_check_disabled = src->ssh_host_key_check_disabled;
+    def->ssh_user = g_strdup(src->ssh_user);
+
     return g_steal_pointer(&def);
 }
 
@@ -2705,6 +2709,8 @@ virStorageSourceClear(virStorageSourcePtr def)
     VIR_FREE(def->tlsAlias);
     VIR_FREE(def->tlsCertdir);
 
+    VIR_FREE(def->ssh_user);
+
     virStorageSourceInitiatorClear(&def->initiator);
 
     /* clear everything except the class header as the object APIs
@@ -3635,6 +3641,8 @@ virStorageSourceParseBackingJSONSSH(virStorageSourcePtr src,
     const char *path = virJSONValueObjectGetString(json, "path");
     const char *host = virJSONValueObjectGetString(json, "host");
     const char *port = virJSONValueObjectGetString(json, "port");
+    const char *user = virJSONValueObjectGetString(json, "user");
+    const char *host_key_check = virJSONValueObjectGetString(json, "host_key_check");
     virJSONValuePtr server = virJSONValueObjectGetObject(json, "server");
 
     if (!(host || server) || !path) {
@@ -3665,6 +3673,11 @@ virStorageSourceParseBackingJSONSSH(virStorageSourcePtr src,
             return -1;
     }
 
+    /* these two are parsed just to be passed back as we don't model them yet */
+    src->ssh_user = g_strdup(user);
+    if (STREQ_NULLABLE(host_key_check, "no"))
+        src->ssh_host_key_check_disabled = true;
+
     return 0;
 }
 
index dd2186c4ff4292e8b000cebec082b45c4994ce01..f2a73feb6a3ddc590ac1a042158fecfff8a0f861 100644 (file)
@@ -384,6 +384,11 @@ struct _virStorageSource {
                        as a source for floppy drive */
 
     bool hostcdrom; /* backing device is a cdrom */
+
+    /* passthrough variables for the ssh driver which we don't handle properly */
+    /* these must not be used apart from formatting the output JSON in the qemu driver */
+    char *ssh_user;
+    bool ssh_host_key_check_disabled;
 };
 
 G_DEFINE_AUTOPTR_CLEANUP_FUNC(virStorageSource, virObjectUnref);
index ec32d28188d7f772507ff7d4b4e1d26832629de9..7a2204787ef146e470fc2c615eeda58a87de3e53 100644 (file)
@@ -1136,6 +1136,7 @@ mymain(void)
     jsontojsondata.schemaroot = qmp_schemaroot_x86_64_blockdev_add;
 
     TEST_JSON_TO_JSON("curl-libguestfs");
+    TEST_JSON_TO_JSON("ssh-passthrough-libguestfs");
 
 #define TEST_IMAGE_CREATE(testname, testbacking) \
     do { \
diff --git a/tests/qemublocktestdata/jsontojson/ssh-passthrough-libguestfs-in.json b/tests/qemublocktestdata/jsontojson/ssh-passthrough-libguestfs-in.json
new file mode 100644 (file)
index 0000000..da8fede
--- /dev/null
@@ -0,0 +1 @@
+json:{"file.driver":"ssh","file.user":"testuser","file.host":"random.host","file.port":1234,"file.path":"somewhere/something","file.host_key_check":"no"}
diff --git a/tests/qemublocktestdata/jsontojson/ssh-passthrough-libguestfs-out.json b/tests/qemublocktestdata/jsontojson/ssh-passthrough-libguestfs-out.json
new file mode 100644 (file)
index 0000000..1f6032d
--- /dev/null
@@ -0,0 +1,14 @@
+{
+  "driver": "ssh",
+  "path": "somewhere/something",
+  "server": {
+    "host": "random.host",
+    "port": "22"
+  },
+  "user": "testuser",
+  "host-key-check": {
+    "mode": "none"
+  },
+  "auto-read-only": true,
+  "discard": "unmap"
+}