• D
    Add domain events for graphics network clients · 987e31ed
    Daniel P. Berrange 提交于
    This introduces a new event type
    
       VIR_DOMAIN_EVENT_ID_GRAPHICS
    
    The same event can be emitted in 3 scenarios
    
      typedef enum {
          VIR_DOMAIN_EVENT_GRAPHICS_CONNECT = 0,
          VIR_DOMAIN_EVENT_GRAPHICS_INITIALIZE,
          VIR_DOMAIN_EVENT_GRAPHICS_DISCONNECT,
      } virDomainEventGraphicsPhase;
    
    Connect/disconnect are triggered at socket accept/close.
    The initialize phase is immediately after the protocol
    setup and authentication has completed. ie when the
    client is authorized and about to start interacting with
    the graphical desktop
    
    This event comes with *a lot* of potential information
    
     - IP address, port & address family of client
     - IP address, port & address family of server
     - Authentication scheme (arbitrary string)
     - Authenticated subject identity. A subject may have
       multiple identities with some authentication schemes.
       For example, vencrypt+sasl results in a x509dname
       and saslUsername identities.
    
    This results in a very complicated callback :-(
    
       typedef enum {
          VIR_DOMAIN_EVENT_GRAPHICS_ADDRESS_IPV4,
          VIR_DOMAIN_EVENT_GRAPHICS_ADDRESS_IPV6,
       } virDomainEventGraphicsAddressType;
    
       struct _virDomainEventGraphicsAddress {
           int family;
           const char *node;
           const char *service;
       };
       typedef struct _virDomainEventGraphicsAddress virDomainEventGraphicsAddress;
       typedef virDomainEventGraphicsAddress *virDomainEventGraphicsAddressPtr;
    
       struct _virDomainEventGraphicsSubject {
          int nidentity;
          struct {
              const char *type;
              const char *name;
          } *identities;
       };
       typedef struct _virDomainEventGraphicsSubject virDomainEventGraphicsSubject;
       typedef virDomainEventGraphicsSubject *virDomainEventGraphicsSubjectPtr;
    
       typedef void (*virConnectDomainEventGraphicsCallback)(virConnectPtr conn,
                                                             virDomainPtr dom,
                                                             int phase,
                                                             virDomainEventGraphicsAddressPtr local,
                                                             virDomainEventGraphicsAddressPtr remote,
                                                             const char *authScheme,
                                                             virDomainEventGraphicsSubjectPtr subject,
                                                             void *opaque);
    
    The wire protocol is similarly complex
    
       struct remote_domain_event_graphics_address {
         int family;
         remote_nonnull_string node;
         remote_nonnull_string service;
       };
    
       const REMOTE_DOMAIN_EVENT_GRAPHICS_IDENTITY_MAX = 20;
    
       struct remote_domain_event_graphics_identity {
         remote_nonnull_string type;
         remote_nonnull_string name;
       };
    
       struct remote_domain_event_graphics_msg {
         remote_nonnull_domain dom;
         int phase;
         remote_domain_event_graphics_address local;
         remote_domain_event_graphics_address remote;
         remote_nonnull_string authScheme;
         remote_domain_event_graphics_identity subject<REMOTE_DOMAIN_EVENT_GRAPHICS_IDENTITY_MAX>;
       };
    
    This is currently implemented in QEMU for the VNC graphics
    protocol, but designed to be usable with SPICE graphics in
    the future too.
    
    * daemon/remote.c: Dispatch graphics events to client
    * examples/domain-events/events-c/event-test.c: Watch for
      graphics events
    * include/libvirt/libvirt.h.in: Define new graphics event ID
      and callback signature
    * src/conf/domain_event.c, src/conf/domain_event.h,
      src/libvirt_private.syms: Extend API to handle graphics events
    * src/qemu/qemu_driver.c: Connect to the QEMU monitor event
      for VNC events and emit a libvirt graphics event
    * src/remote/remote_driver.c: Receive and dispatch graphics
      events to application
    * src/remote/remote_protocol.x: Wire protocol definition for
      graphics events
    * src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h,
      src/qemu/qemu_monitor_json.c: Watch for VNC_CONNECTED,
      VNC_INITIALIZED & VNC_DISCONNETED events from QEMU monitor
    987e31ed
remote_protocol.c 86.5 KB