}
-int
-qemuMonitorSetDrivePassphrase(qemuMonitorPtr mon,
- const char *alias,
- const char *passphrase)
-{
- VIR_DEBUG("alias=%s passphrase=%p(value hidden)", alias, passphrase);
-
- QEMU_CHECK_MONITOR(mon);
-
- return qemuMonitorJSONSetDrivePassphrase(mon, alias, passphrase);
-}
-
-
int
qemuMonitorCreateSnapshot(qemuMonitorPtr mon, const char *name)
{
int qemuMonitorDriveDel(qemuMonitorPtr mon,
const char *drivestr);
-int qemuMonitorSetDrivePassphrase(qemuMonitorPtr mon,
- const char *alias,
- const char *passphrase);
-
int qemuMonitorCreateSnapshot(qemuMonitorPtr mon, const char *name);
int qemuMonitorLoadSnapshot(qemuMonitorPtr mon, const char *name);
int qemuMonitorDeleteSnapshot(qemuMonitorPtr mon, const char *name);
}
-int qemuMonitorJSONSetDrivePassphrase(qemuMonitorPtr mon,
- const char *alias,
- const char *passphrase)
-{
- int ret = -1;
- virJSONValuePtr cmd;
- virJSONValuePtr reply = NULL;
-
- cmd = qemuMonitorJSONMakeCommand("block_passwd",
- "s:device", alias,
- "s:password", passphrase,
- NULL);
- if (!cmd)
- return -1;
-
- if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
- goto cleanup;
-
- if (qemuMonitorJSONCheckError(cmd, reply) < 0)
- goto cleanup;
-
- ret = 0;
- cleanup:
- virJSONValueFree(cmd);
- virJSONValueFree(reply);
- return ret;
-}
-
int
qemuMonitorJSONDiskSnapshot(qemuMonitorPtr mon, virJSONValuePtr actions,
const char *device, const char *file,
int qemuMonitorJSONDelObject(qemuMonitorPtr mon,
const char *objalias);
-int qemuMonitorJSONSetDrivePassphrase(qemuMonitorPtr mon,
- const char *alias,
- const char *passphrase);
-
int qemuMonitorJSONDiskSnapshot(qemuMonitorPtr mon,
virJSONValuePtr actions,
const char *device,
return NULL;
}
-static int
-qemuProcessGetVolumeQcowPassphrase(virDomainDiskDefPtr disk,
- char **secretRet,
- size_t *secretLen)
-{
- virConnectPtr conn = NULL;
- char *passphrase;
- unsigned char *data;
- size_t size;
- int ret = -1;
- virStorageEncryptionPtr enc;
-
- if (!disk->src->encryption) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("disk %s does not have any encryption information"),
- disk->src->path);
- return -1;
- }
- enc = disk->src->encryption;
-
- if (!(conn = virGetConnectSecret()))
- goto cleanup;
-
- if (enc->format != VIR_STORAGE_ENCRYPTION_FORMAT_QCOW ||
- enc->nsecrets != 1 ||
- enc->secrets[0]->type !=
- VIR_STORAGE_ENCRYPTION_SECRET_TYPE_PASSPHRASE) {
- virReportError(VIR_ERR_XML_ERROR,
- _("invalid <encryption> for volume %s"),
- virDomainDiskGetSource(disk));
- goto cleanup;
- }
-
- if (virSecretGetSecretString(conn, &enc->secrets[0]->seclookupdef,
- VIR_SECRET_USAGE_TYPE_VOLUME,
- &data, &size) < 0)
- goto cleanup;
-
- if (memchr(data, '\0', size) != NULL) {
- memset(data, 0, size);
- VIR_FREE(data);
- virReportError(VIR_ERR_XML_ERROR,
- _("format='qcow' passphrase for %s must not contain a "
- "'\\0'"), virDomainDiskGetSource(disk));
- goto cleanup;
- }
-
- if (VIR_ALLOC_N(passphrase, size + 1) < 0) {
- memset(data, 0, size);
- VIR_FREE(data);
- goto cleanup;
- }
- memcpy(passphrase, data, size);
- passphrase[size] = '\0';
-
- memset(data, 0, size);
- VIR_FREE(data);
-
- *secretRet = passphrase;
- *secretLen = size;
-
- ret = 0;
-
- cleanup:
- virObjectUnref(conn);
- return ret;
-}
-
static int
qemuProcessHandleReset(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
virDomainObjPtr vm,
int asyncJob)
{
int ret = 0;
- qemuDomainObjPrivatePtr priv = vm->privateData;
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
size_t i;
- char *alias = NULL;
- char *secret = NULL;
for (i = 0; i < vm->def->ngraphics; ++i) {
virDomainGraphicsDefPtr graphics = vm->def->graphics[i];
goto cleanup;
}
- for (i = 0; i < vm->def->ndisks; i++) {
- size_t secretLen;
-
- if (!vm->def->disks[i]->src->encryption ||
- !virDomainDiskGetSource(vm->def->disks[i]))
- continue;
-
- if (vm->def->disks[i]->src->encryption->format !=
- VIR_STORAGE_ENCRYPTION_FORMAT_DEFAULT &&
- vm->def->disks[i]->src->encryption->format !=
- VIR_STORAGE_ENCRYPTION_FORMAT_QCOW)
- continue;
-
- VIR_FREE(secret);
- if (qemuProcessGetVolumeQcowPassphrase(vm->def->disks[i],
- &secret, &secretLen) < 0)
- goto cleanup;
-
- VIR_FREE(alias);
- if (!(alias = qemuAliasFromDisk(vm->def->disks[i])))
- goto cleanup;
- if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
- goto cleanup;
- ret = qemuMonitorSetDrivePassphrase(priv->mon, alias, secret);
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
- ret = -1;
- if (ret < 0)
- goto cleanup;
- }
-
cleanup:
- VIR_FREE(alias);
- VIR_FREE(secret);
virObjectUnref(cfg);
return ret;
}
GEN_TEST_FUNC(qemuMonitorJSONRemoveNetdev, "net0")
GEN_TEST_FUNC(qemuMonitorJSONDelDevice, "ide0")
GEN_TEST_FUNC(qemuMonitorJSONAddDevice, "some_dummy_devicestr")
-GEN_TEST_FUNC(qemuMonitorJSONSetDrivePassphrase, "drive-vda", "secret_passhprase")
GEN_TEST_FUNC(qemuMonitorJSONDriveMirror, "vdb", "/foo/bar", NULL, 1024, 0, 0,
VIR_DOMAIN_BLOCK_REBASE_SHALLOW | VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT)
GEN_TEST_FUNC(qemuMonitorJSONBlockCommit, "vdb", "/foo/bar1", "/foo/bar2", NULL, 1024)
DO_TEST_GEN(qemuMonitorJSONRemoveNetdev);
DO_TEST_GEN(qemuMonitorJSONDelDevice);
DO_TEST_GEN(qemuMonitorJSONAddDevice);
- DO_TEST_GEN(qemuMonitorJSONSetDrivePassphrase);
DO_TEST_GEN(qemuMonitorJSONDriveMirror);
DO_TEST_GEN(qemuMonitorJSONBlockCommit);
DO_TEST_GEN(qemuMonitorJSONDrivePivot);