[libvirt] [PATCH] Emit graphics events when a SPICE client connects/disconnects

Laine Stump laine at laine.org
Wed Mar 14 15:01:43 UTC 2012


On 03/14/2012 05:06 AM, Osier Yang wrote:
> On 03/14/2012 01:45 PM, Laine Stump wrote:
>> Wire up the domain graphics event notifications for SPICE. Adapted
>> from a RHEL-only patch written by Dan Berrange that used custom
>> __com.redhat_SPICE events - equivalent events are now available in
>> upstream QEMU (including a SPICE_CONNECTED event, which was missing in
>> the __COM.redhat_SPICE version).
>>
>> * src/qemu/qemu_monitor_json.c: Wire up SPICE graphics events
>> ---
>>   src/qemu/qemu_monitor_json.c |   56
>> +++++++++++++++++++++++++++++++++++++++---
>>   1 files changed, 52 insertions(+), 4 deletions(-)
>>
>> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
>> index 1a0ee94..a5ef1d4 100644
>> --- a/src/qemu/qemu_monitor_json.c
>> +++ b/src/qemu/qemu_monitor_json.c
>> @@ -59,6 +59,9 @@ static void
>> qemuMonitorJSONHandleVNCConnect(qemuMonitorPtr mon, virJSONValuePtr
>>   static void qemuMonitorJSONHandleVNCInitialize(qemuMonitorPtr mon,
>> virJSONValuePtr data);
>>   static void qemuMonitorJSONHandleVNCDisconnect(qemuMonitorPtr mon,
>> virJSONValuePtr data);
>>   static void qemuMonitorJSONHandleBlockJob(qemuMonitorPtr mon,
>> virJSONValuePtr data);
>> +static void qemuMonitorJSONHandleSPICEConnect(qemuMonitorPtr mon,
>> virJSONValuePtr data);
>> +static void qemuMonitorJSONHandleSPICEInitialize(qemuMonitorPtr mon,
>> virJSONValuePtr data);
>> +static void qemuMonitorJSONHandleSPICEDisconnect(qemuMonitorPtr mon,
>> virJSONValuePtr data);
>>
>>   static struct {
>>       const char *type;
>> @@ -75,6 +78,9 @@ static struct {
>>       { "VNC_INITIALIZED", qemuMonitorJSONHandleVNCInitialize, },
>>       { "VNC_DISCONNECTED", qemuMonitorJSONHandleVNCDisconnect, },
>>       { "BLOCK_JOB_COMPLETED", qemuMonitorJSONHandleBlockJob, },
>> +    { "SPICE_CONNECTED", qemuMonitorJSONHandleSPICEConnect, },
>> +    { "SPICE_INITIALIZED", qemuMonitorJSONHandleSPICEInitialize, },
>> +    { "SPICE_DISCONNECTED", qemuMonitorJSONHandleSPICEDisconnect, },
>>   };
>>
>>
>> @@ -624,7 +630,7 @@ VIR_ENUM_IMPL(qemuMonitorGraphicsAddressFamily,
>>                 VIR_DOMAIN_EVENT_GRAPHICS_ADDRESS_LAST,
>>                 "ipv4", "ipv6", "unix");
>>
>> -static void qemuMonitorJSONHandleVNC(qemuMonitorPtr mon,
>> virJSONValuePtr data, int phase)
>> +static void qemuMonitorJSONHandleGraphics(qemuMonitorPtr mon,
>> virJSONValuePtr data, int phase)
>>   {
>>       const char *localNode, *localService, *localFamily;
>>       const char *remoteNode, *remoteService, *remoteFamily;
>> @@ -643,14 +649,38 @@ static void
>> qemuMonitorJSONHandleVNC(qemuMonitorPtr mon, virJSONValuePtr data, i
>>       }
>>
>>       authScheme = virJSONValueObjectGetString(server, "auth");
>> +    if (!authScheme) {
>> +        VIR_WARN("missing auth scheme in graphics event");
>> +        return;
>> +    }
>>
>>       localFamily = virJSONValueObjectGetString(server, "family");
>> +    if (!authScheme) {
>
> s/authScheme/localFamily/

Oops. That means the original patch in RHEL is also wrong. I'm resending
with these fixed.


>
>> +        VIR_WARN("missing local address family in graphics event");
>> +        return;
>> +    }
>>       localNode = virJSONValueObjectGetString(server, "host");
>> +    if (!authScheme) {
>
> likewise
>
>> +        VIR_WARN("missing local hostname in graphics event");
>> +        return;
>> +    }
>>       localService = virJSONValueObjectGetString(server, "service");
>> +    if (!localService)
>> +        localService = ""; /* Spice has multiple ports, so this
>> isn't provided */
>>
>>       remoteFamily = virJSONValueObjectGetString(client, "family");
>> +    if (!authScheme) {
>
> likewise
>
>> +        VIR_WARN("missing remote address family in graphics event");
>> +        return;
>> +    }
>>       remoteNode = virJSONValueObjectGetString(client, "host");
>> +    if (!authScheme) {
>
> likewise
>
>> +        VIR_WARN("missing remote hostname in graphics event");
>> +        return;
>> +    }
>>       remoteService = virJSONValueObjectGetString(client, "service");
>> +    if (!remoteService)
>> +        remoteService = ""; /* Spice has multiple ports, so this
>> isn't provided */
>
> Will we want to parse the specific parameters of spice events? e.g

If we do, that will be a separate patch. The intent here is to bring
upstream to parity with the RHEL build.

>
> <snip>
>   - "port": port number (json-string)
>   - "family": address family (json-string, "ipv4" or "ipv6")
>   - "connection-id": spice connection id.  All channels with the same id
>                      belong to the same spice session (json-int)
>   - "channel-type": channel type.  "1" is the main control channel,
> filter for
>                     this one if you want track spice sessions only
> (json-int)
>   - "channel-id": channel id.  Usually "0", might be different needed
> when
>                   multiple channels of the same type exist, such as
> multiple
>                   display channels in a multihead setup (json-int)
>   - "tls": whevener the channel is encrypted (json-bool)
> </snip>




More information about the libvir-list mailing list