[libvirt] [RFC 3/3] qemu: Introduce qemuBuildMasterKeyCommandLine

Peter Krempa pkrempa at redhat.com
Tue Mar 22 13:01:30 UTC 2016


On Mon, Mar 21, 2016 at 14:29:02 -0400, John Ferlan wrote:
> Using the masterKey and if the capability exists build an -object secret
> command line to pass a masterKey file to qemu. The qemuBuildHasMasterKey
> is expected to be reused by other objects which would need to know not
> only if the masterKey has been provided, but if the secret object can be
> used for their own purposes.
> 
> Additionally, generate qemuDomainGetMasterKeyAlias which will be used by
> later patches to define the 'keyid' (eg, masterKey) to be used by other
> secrets to provide the id to qemu for the master key.
> 
> Although the path to the domain libDir and the masterKey file are created
> after qemuBuildCommandLine completes successfully, it's still possible to
> generate the path and use it. No different than code paths that use the
> domain libDir to create socket files (e.g. monitor.sock).
> 
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
>  src/qemu/qemu_command.c                            | 67 ++++++++++++++++++++++
>  src/qemu/qemu_domain.c                             | 17 ++++++
>  src/qemu/qemu_domain.h                             |  2 +
>  .../qemuxml2argvdata/qemuxml2argv-master-key.args  | 23 ++++++++
>  tests/qemuxml2argvdata/qemuxml2argv-master-key.xml | 30 ++++++++++
>  tests/qemuxml2argvtest.c                           |  2 +
>  6 files changed, 141 insertions(+)
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-master-key.args
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-master-key.xml
> 
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index eb02553..04e75fd 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -151,6 +151,70 @@ VIR_ENUM_IMPL(qemuNumaPolicy, VIR_DOMAIN_NUMATUNE_MEM_LAST,
>                "interleave");
>  
>  /**
> + * qemuBuildHasMasterKey:
> + * @qemuCaps: QEMU binary capabilities
> + *
> + * Return true if this binary supports the secret -object, false otherwise.
> + */
> +static bool
> +qemuBuildHasMasterKey(virQEMUCapsPtr qemuCaps)
> +{
> +    return virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_SECRET);
> +}

This doesn't seem to be terribly useful. Especially since you have to
check for priv->masterKey anyways.

> +
> +
> +/**
> + * qemuBuildMasterKeyCommandLine:
> + * @cmd: the command to modify
> + * @qemuCaps qemu capabilities object
> + * @domainLibDir: location to find the master key
> +
> + * Formats the command line for a master key if available
> + *
> + * Returns 0 on success, -1 w/ error message on failure
> + */
> +static int
> +qemuBuildMasterKeyCommandLine(virCommandPtr cmd,
> +                              virQEMUCapsPtr qemuCaps,
> +                              const char *domainLibDir)
> +{
> +    int ret = -1;
> +    char *alias = NULL;
> +    char *path = NULL;
> +
> +    /* If the -object secret does not exist, then just return. This just
> +     * means the domain won't be able to use a secret master key and is
> +     * not a failure.
> +     */
> +    if (!qemuBuildHasMasterKey(qemuCaps)) {
> +        VIR_INFO("secret object is not supported by this QEMU binary");
> +        return 0;

Here is the correct place to generate the key. I don't really see the
benefit of doing it even for qemu that does not support this feature.

> +    }
> +
> +    if (!(alias = qemuDomainGetMasterKeyAlias()))
> +        return -1;
> +
> +    /* Get the path... NB, the path will not exist yet as domainLibDir
> +     * and the master secret file gets created after we've successfully
> +     * built the command line
> +     */
> +    if (!(path = qemuDomainGetMasterKeyFilePath(domainLibDir)))
> +        goto cleanup;
> +
> +    virCommandAddArg(cmd, "-object");
> +    virCommandAddArgFormat(cmd, "secret,id=%s,format=base64,file=%s",
> +                           alias, path);
> +
> +    ret = 0;
> +
> + cleanup:
> +    VIR_FREE(alias);
> +    VIR_FREE(path);
> +    return ret;
> +}
> +
> +
> +/**
>   * qemuVirCommandGetFDSet:
>   * @cmd: the command to modify
>   * @fd: fd to reassign to the child

[...]

> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 507ae9e..53d6705 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -468,6 +468,23 @@ qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
>  }
>  
>  
> +/* qemuDomainGetMasterKeyAlias:
> + *
> + * Generate and return the masterKey alias
> + *
> + * Returns NULL or a string containing the master key alias
> + */
> +char *
> +qemuDomainGetMasterKeyAlias(void)

You've added src/qemu/qemu_alias.c, so this belongs there.

> +{
> +    char *alias;
> +
> +    ignore_value(VIR_STRDUP(alias, "masterKey0"));
> +
> +    return alias;
> +}
> +
> +
>  /* qemuDomainGetMasterKeyFilePath:
>   * @libDir: Directory path to domain lib files
>   *

Peter
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20160322/a8add0ca/attachment-0001.sig>


More information about the libvir-list mailing list