提交 d6db013c 编写于 作者: P Peter Krempa

qemu: Pass through arguments of 'ssh' block driver used by libguestfs

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: NPeter Krempa <pkrempa@redhat.com>
Reviewed-by: NJán Tomko <jtomko@redhat.com>
上级 d0892341
......@@ -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;
......
......@@ -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;
}
......
......@@ -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);
......
......@@ -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 { \
......
json:{"file.driver":"ssh","file.user":"testuser","file.host":"random.host","file.port":1234,"file.path":"somewhere/something","file.host_key_check":"no"}
{
"driver": "ssh",
"path": "somewhere/something",
"server": {
"host": "random.host",
"port": "22"
},
"user": "testuser",
"host-key-check": {
"mode": "none"
},
"auto-read-only": true,
"discard": "unmap"
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册