[libvirt] [PATCH 2/2] spice: expose the QEMU disable file transfer option

Doug Goldstein cardoe at cardoe.com
Thu Jan 16 03:24:51 UTC 2014


On Jan 15, 2014, at 10:33 AM, Francesco Romani <fromani at redhat.com> wrote:
> 
> spice-server offers an API to disable file transfer messages
> on the agent channel between the client and the guest.
> This is supported in qemu through the disable-agent-file-xfer option.
> 
> This patch exposes this option to libvirt.
> Adds a new element 'filetransfer', with one property,
> 'filetransfer', which accepts a boolean setting.
> Default is enabled.

Haven't reviewed the code but the commit message is wrong. The property is 'enable' from the schema change.



> 
> Depends on the capability exported in the first patch of the series.
> 
> Signed-off-by: Francesco Romani <fromani at redhat.com>
> ---
> docs/formatdomain.html.in                          |  8 +++++
> docs/schemas/domaincommon.rng                      | 11 ++++++
> src/conf/domain_conf.c                             | 31 ++++++++++++++++-
> src/conf/domain_conf.h                             | 10 ++++++
> src/libvirt_private.syms                           |  2 ++
> src/qemu/qemu_command.c                            |  9 +++++
> ...emuxml2argv-graphics-spice-agent-file-xfer.args |  9 +++++
> ...qemuxml2argv-graphics-spice-agent-file-xfer.xml | 40 ++++++++++++++++++++++
> .../qemuxml2argv-graphics-spice.args               |  5 +--
> .../qemuxml2argv-graphics-spice.xml                |  1 +
> tests/qemuxml2argvtest.c                           |  9 ++++-
> 11 files changed, 131 insertions(+), 4 deletions(-)
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-agent-file-xfer.args
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-agent-file-xfer.xml
> 
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index 68860ef..c11a7d3 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -4042,6 +4042,7 @@ qemu-kvm -net nic,model=? /dev/null
>     <streaming mode='filter'/>
>     <clipboard copypaste='no'/>
>     <mouse mode='client'/>
> +    <filetransfer enable='no'/>
>   </graphics></pre>
>             <p>
>               Spice supports variable compression settings for audio,
> @@ -4081,6 +4082,13 @@ qemu-kvm -net nic,model=? /dev/null
>               <span class="since">since 0.9.11</span>. If no mode is
>               specified, the qemu default will be used (client mode).
>             </p>
> +            <p>
> +              File transfer functionality (via Spice agent) is set using the
> +              <code>filetransfer</code> element.
> +              It is enabled by default, and can be disabled by setting the
> +              <code>enable</code> property to <code>no</code> ,
> +              since <span class="since">since 1.2.2</span>.
> +            </p>
>           </dd>
>           <dt><code>"rdp"</code></dt>
>           <dd>
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index a69f6b6..9ddb772 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -2474,6 +2474,17 @@
>                 <empty/>
>               </element>
>             </optional>
> +            <optional>
> +              <element name="filetransfer">
> +                <attribute name="enable">
> +                  <choice>
> +                    <value>yes</value>
> +                    <value>no</value>
> +                  </choice>
> +                </attribute>
> +                <empty/>
> +              </element>
> +            </optional>
>           </interleave>
>         </group>
>         <group>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index c1dd598..7d6c9ba 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -604,6 +604,12 @@ VIR_ENUM_IMPL(virDomainGraphicsSpiceClipboardCopypaste,
>               "yes",
>               "no");
> 
> +VIR_ENUM_IMPL(virDomainGraphicsSpiceAgentFileTransfer,
> +              VIR_DOMAIN_GRAPHICS_SPICE_AGENT_FILE_TRANSFER_LAST,
> +              "default",
> +              "yes",
> +              "no");
> +
> VIR_ENUM_IMPL(virDomainHostdevMode, VIR_DOMAIN_HOSTDEV_MODE_LAST,
>               "subsystem",
>               "capabilities")
> @@ -8519,6 +8525,26 @@ virDomainGraphicsDefParseXML(xmlNodePtr node,
>                     VIR_FREE(copypaste);
> 
>                     def->data.spice.copypaste = copypasteVal;
> +                } else if (xmlStrEqual(cur->name, BAD_CAST "filetransfer")) {
> +                    char *enable = virXMLPropString(cur, "enable");
> +                    int enableVal;
> +
> +                    if (!enable) {
> +                        virReportError(VIR_ERR_XML_ERROR, "%s",
> +                                       _("spice filetransfer missing enable"));
> +                        goto error;
> +                    }
> +
> +                    if ((enableVal =
> +                         virDomainGraphicsSpiceAgentFileTransferTypeFromString(enable)) <= 0) {
> +                        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                                       _("unknown enable value '%s'"), enable);
> +                        VIR_FREE(enable);
> +                        goto error;
> +                    }
> +                    VIR_FREE(enable);
> +
> +                    def->data.spice.filetransfer = enableVal;
>                 } else if (xmlStrEqual(cur->name, BAD_CAST "mouse")) {
>                     char *mode = virXMLPropString(cur, "mode");
>                     int modeVal;
> @@ -16423,7 +16449,7 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
>         if (!children && (def->data.spice.image || def->data.spice.jpeg ||
>                           def->data.spice.zlib || def->data.spice.playback ||
>                           def->data.spice.streaming || def->data.spice.copypaste ||
> -                          def->data.spice.mousemode)) {
> +                          def->data.spice.mousemode || def->data.spice.filetransfer)) {
>             virBufferAddLit(buf, ">\n");
>             children = true;
>         }
> @@ -16448,6 +16474,9 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
>         if (def->data.spice.copypaste)
>             virBufferAsprintf(buf, "      <clipboard copypaste='%s'/>\n",
>                               virDomainGraphicsSpiceClipboardCopypasteTypeToString(def->data.spice.copypaste));
> +        if (def->data.spice.filetransfer)
> +            virBufferAsprintf(buf, "      <filetransfer enable='%s'/>\n",
> +                              virDomainGraphicsSpiceAgentFileTransferTypeToString(def->data.spice.filetransfer));
>     }
> 
>     if (children) {
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 647d115..ce877fc 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -1461,6 +1461,14 @@ enum virDomainGraphicsSpiceClipboardCopypaste {
>     VIR_DOMAIN_GRAPHICS_SPICE_CLIPBOARD_COPYPASTE_LAST
> };
> 
> +enum virDomainGraphicsSpiceAgentFileTransfer {
> +    VIR_DOMAIN_GRAPHICS_SPICE_AGENT_FILE_TRANSFER_DEFAULT = 0,
> +    VIR_DOMAIN_GRAPHICS_SPICE_AGENT_FILE_TRANSFER_YES,
> +    VIR_DOMAIN_GRAPHICS_SPICE_AGENT_FILE_TRANSFER_NO,
> +
> +    VIR_DOMAIN_GRAPHICS_SPICE_AGENT_FILE_TRANSFER_LAST
> +};
> +
> enum virDomainGraphicsListenType {
>     VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE = 0,
>     VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS,
> @@ -1531,6 +1539,7 @@ struct _virDomainGraphicsDef {
>             int playback;
>             int streaming;
>             int copypaste;
> +            int filetransfer;
>         } spice;
>     } data;
>     /* nListens, listens, and *port are only useful if type is vnc,
> @@ -2693,6 +2702,7 @@ VIR_ENUM_DECL(virDomainInputBus)
> VIR_ENUM_DECL(virDomainGraphics)
> VIR_ENUM_DECL(virDomainGraphicsListen)
> VIR_ENUM_DECL(virDomainGraphicsAuthConnected)
> +VIR_ENUM_DECL(virDomainGraphicsSpiceAgentFileTransfer)
> VIR_ENUM_DECL(virDomainGraphicsSpiceChannelName)
> VIR_ENUM_DECL(virDomainGraphicsSpiceChannelMode)
> VIR_ENUM_DECL(virDomainGraphicsSpiceImageCompression)
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 3b3de15..2a9b0b1 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -235,6 +235,8 @@ virDomainGraphicsListenGetType;
> virDomainGraphicsListenSetAddress;
> virDomainGraphicsListenSetNetwork;
> virDomainGraphicsListenSetType;
> +virDomainGraphicsSpiceAgentFileTransferTypeFromString;
> +virDomainGraphicsSpiceAgentFileTransferTypeToString;
> virDomainGraphicsSpiceChannelModeTypeFromString;
> virDomainGraphicsSpiceChannelModeTypeToString;
> virDomainGraphicsSpiceChannelNameTypeFromString;
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 81486df..96b8825 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -7393,6 +7393,15 @@ qemuBuildGraphicsSPICECommandLine(virQEMUDriverConfigPtr cfg,
>                           virDomainGraphicsSpiceStreamingModeTypeToString(graphics->data.spice.streaming));
>     if (graphics->data.spice.copypaste == VIR_DOMAIN_GRAPHICS_SPICE_CLIPBOARD_COPYPASTE_NO)
>         virBufferAddLit(&opt, ",disable-copy-paste");
> +    if (graphics->data.spice.filetransfer == VIR_DOMAIN_GRAPHICS_SPICE_AGENT_FILE_TRANSFER_NO) {
> +        if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE_FILE_XFER_DISABLE)) {
> +           virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                          _("This QEMU can't disable file transfers through spice"));
> +            goto error;
> +        } else {
> +            virBufferAddLit(&opt, ",disable-agent-file-xfer");
> +        }
> +    }
> 
>     if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_SEAMLESS_MIGRATION)) {
>         /* If qemu supports seamless migration turn it
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-agent-file-xfer.args b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-agent-file-xfer.args
> new file mode 100644
> index 0000000..66f22bc
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-agent-file-xfer.args
> @@ -0,0 +1,9 @@
> +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=spice \
> +/usr/bin/qemu -S -M pc -m 214 -smp 1 -nodefaults -monitor \
> +unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -usb -hda \
> +/dev/HostVG/QEMUGuest1 -spice port=5903,tls-port=5904,addr=127.0.0.1,\
> +x509-dir=/etc/pki/libvirt-spice,tls-channel=main,plaintext-channel=inputs,\
> +disable-agent-file-xfer -vga qxl -global qxl-vga.ram_size=67108864 \
> +-global qxl-vga.vram_size=33554432 \
> +-device qxl,id=video1,ram_size=67108864,vram_size=67108864,bus=pci.0,addr=0x4 \
> +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-agent-file-xfer.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-agent-file-xfer.xml
> new file mode 100644
> index 0000000..3a3e366
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-agent-file-xfer.xml
> @@ -0,0 +1,40 @@
> +<domain type='qemu'>
> +  <name>QEMUGuest1</name>
> +  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
> +  <memory unit='KiB'>219136</memory>
> +  <currentMemory unit='KiB'>219136</currentMemory>
> +  <vcpu placement='static'>1</vcpu>
> +  <os>
> +    <type arch='i686' machine='pc'>hvm</type>
> +    <boot dev='hd'/>
> +  </os>
> +  <clock offset='utc'/>
> +  <on_poweroff>destroy</on_poweroff>
> +  <on_reboot>restart</on_reboot>
> +  <on_crash>destroy</on_crash>
> +  <devices>
> +    <emulator>/usr/bin/qemu</emulator>
> +    <disk type='block' device='disk'>
> +      <source dev='/dev/HostVG/QEMUGuest1'/>
> +      <target dev='hda' bus='ide'/>
> +      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
> +    </disk>
> +    <controller type='usb' index='0'/>
> +    <controller type='ide' index='0'/>
> +    <controller type='pci' index='0' model='pci-root'/>
> +    <input type='mouse' bus='ps2'/>
> +    <graphics type='spice' port='5903' tlsPort='5904' autoport='no' listen='127.0.0.1'>
> +      <listen type='address' address='127.0.0.1'/>
> +      <channel name='main' mode='secure'/>
> +      <channel name='inputs' mode='insecure'/>
> +      <filetransfer enable='no'/>
> +    </graphics>
> +    <video>
> +      <model type='qxl' ram='65536' vram='32768' heads='1'/>
> +    </video>
> +    <video>
> +      <model type='qxl' ram='65536' vram='65536' heads='1'/>
> +    </video>
> +    <memballoon model='virtio'/>
> +  </devices>
> +</domain>
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args
> index 7ddfa64..8430d9c 100644
> --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args
> @@ -6,7 +6,8 @@ x509-dir=/etc/pki/libvirt-spice,tls-channel=default,tls-channel=main,\
> plaintext-channel=inputs,\
> image-compression=auto_glz,jpeg-wan-compression=auto,\
> zlib-glz-wan-compression=auto,\
> -playback-compression=on,streaming-video=filter,disable-copy-paste -vga \
> -qxl -global qxl.ram_size=67108864 -global qxl.vram_size=18874368 \
> +playback-compression=on,streaming-video=filter,disable-copy-paste,\
> +disable-agent-file-xfer -vga qxl -global qxl.ram_size=67108864 \
> +-global qxl.vram_size=18874368 \
> -device qxl,id=video1,ram_size=67108864,vram_size=33554432,bus=pci.0,addr=0x4 \
> -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml
> index b22fbcc..c2b5095 100644
> --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml
> @@ -33,6 +33,7 @@
>       <playback compression='on'/>
>       <streaming mode='filter'/>
>       <clipboard copypaste='no'/>
> +      <filetransfer enable='no'/>
>     </graphics>
>     <video>
>       <model type='qxl' ram='65536' vram='18432' heads='1'/>
> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> index b0cfa60..a25264e 100644
> --- a/tests/qemuxml2argvtest.c
> +++ b/tests/qemuxml2argvtest.c
> @@ -856,7 +856,8 @@ mymain(void)
>     DO_TEST("graphics-spice",
>             QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL,
>             QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE,
> -            QEMU_CAPS_DEVICE_QXL);
> +            QEMU_CAPS_DEVICE_QXL,
> +            QEMU_CAPS_SPICE_FILE_XFER_DISABLE);
>     driver.config->spiceSASL = 1;
>     ignore_value(VIR_STRDUP(driver.config->spiceSASLdir, "/root/.sasl2"));
>     DO_TEST("graphics-spice-sasl",
> @@ -890,6 +891,12 @@ mymain(void)
>             QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_USB_HUB,
>             QEMU_CAPS_ICH9_USB_EHCI1, QEMU_CAPS_USB_REDIR,
>             QEMU_CAPS_CHARDEV_SPICEVMC);
> +    DO_TEST("graphics-spice-agent-file-xfer",
> +            QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL,
> +            QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE,
> +            QEMU_CAPS_DEVICE_QXL_VGA,
> +            QEMU_CAPS_DEVICE_QXL,
> +            QEMU_CAPS_SPICE_FILE_XFER_DISABLE);
> 
>     DO_TEST("input-usbmouse", NONE);
>     DO_TEST("input-usbtablet", NONE);
> -- 
> 1.8.4.2
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list




More information about the libvir-list mailing list