qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

char.json (17474B)


      1 # -*- Mode: Python -*-
      2 # vim: filetype=python
      3 #
      4 
      5 ##
      6 # = Character devices
      7 ##
      8 
      9 { 'include': 'sockets.json' }
     10 
     11 ##
     12 # @ChardevInfo:
     13 #
     14 # Information about a character device.
     15 #
     16 # @label: the label of the character device
     17 #
     18 # @filename: the filename of the character device
     19 #
     20 # @frontend-open: shows whether the frontend device attached to this backend
     21 #                 (eg. with the chardev=... option) is in open or closed state
     22 #                 (since 2.1)
     23 #
     24 # Notes: @filename is encoded using the QEMU command line character device
     25 #        encoding.  See the QEMU man page for details.
     26 #
     27 # Since: 0.14
     28 ##
     29 { 'struct': 'ChardevInfo',
     30   'data': { 'label': 'str',
     31             'filename': 'str',
     32             'frontend-open': 'bool' } }
     33 
     34 ##
     35 # @query-chardev:
     36 #
     37 # Returns information about current character devices.
     38 #
     39 # Returns: a list of @ChardevInfo
     40 #
     41 # Since: 0.14
     42 #
     43 # Example:
     44 #
     45 # -> { "execute": "query-chardev" }
     46 # <- {
     47 #       "return": [
     48 #          {
     49 #             "label": "charchannel0",
     50 #             "filename": "unix:/var/lib/libvirt/qemu/seabios.rhel6.agent,server=on",
     51 #             "frontend-open": false
     52 #          },
     53 #          {
     54 #             "label": "charmonitor",
     55 #             "filename": "unix:/var/lib/libvirt/qemu/seabios.rhel6.monitor,server=on",
     56 #             "frontend-open": true
     57 #          },
     58 #          {
     59 #             "label": "charserial0",
     60 #             "filename": "pty:/dev/pts/2",
     61 #             "frontend-open": true
     62 #          }
     63 #       ]
     64 #    }
     65 #
     66 ##
     67 { 'command': 'query-chardev', 'returns': ['ChardevInfo'],
     68   'allow-preconfig': true }
     69 
     70 ##
     71 # @ChardevBackendInfo:
     72 #
     73 # Information about a character device backend
     74 #
     75 # @name: The backend name
     76 #
     77 # Since: 2.0
     78 ##
     79 { 'struct': 'ChardevBackendInfo', 'data': {'name': 'str'} }
     80 
     81 ##
     82 # @query-chardev-backends:
     83 #
     84 # Returns information about character device backends.
     85 #
     86 # Returns: a list of @ChardevBackendInfo
     87 #
     88 # Since: 2.0
     89 #
     90 # Example:
     91 #
     92 # -> { "execute": "query-chardev-backends" }
     93 # <- {
     94 #       "return":[
     95 #          {
     96 #             "name":"udp"
     97 #          },
     98 #          {
     99 #             "name":"tcp"
    100 #          },
    101 #          {
    102 #             "name":"unix"
    103 #          },
    104 #          {
    105 #             "name":"spiceport"
    106 #          }
    107 #       ]
    108 #    }
    109 #
    110 ##
    111 { 'command': 'query-chardev-backends', 'returns': ['ChardevBackendInfo'] }
    112 
    113 ##
    114 # @DataFormat:
    115 #
    116 # An enumeration of data format.
    117 #
    118 # @utf8: Data is a UTF-8 string (RFC 3629)
    119 #
    120 # @base64: Data is Base64 encoded binary (RFC 3548)
    121 #
    122 # Since: 1.4
    123 ##
    124 { 'enum': 'DataFormat',
    125   'data': [ 'utf8', 'base64' ] }
    126 
    127 ##
    128 # @ringbuf-write:
    129 #
    130 # Write to a ring buffer character device.
    131 #
    132 # @device: the ring buffer character device name
    133 #
    134 # @data: data to write
    135 #
    136 # @format: data encoding (default 'utf8').
    137 #
    138 #          - base64: data must be base64 encoded text.  Its binary
    139 #            decoding gets written.
    140 #          - utf8: data's UTF-8 encoding is written
    141 #          - data itself is always Unicode regardless of format, like
    142 #            any other string.
    143 #
    144 # Returns: Nothing on success
    145 #
    146 # Since: 1.4
    147 #
    148 # Example:
    149 #
    150 # -> { "execute": "ringbuf-write",
    151 #      "arguments": { "device": "foo",
    152 #                     "data": "abcdefgh",
    153 #                     "format": "utf8" } }
    154 # <- { "return": {} }
    155 #
    156 ##
    157 { 'command': 'ringbuf-write',
    158   'data': { 'device': 'str',
    159             'data': 'str',
    160            '*format': 'DataFormat'} }
    161 
    162 ##
    163 # @ringbuf-read:
    164 #
    165 # Read from a ring buffer character device.
    166 #
    167 # @device: the ring buffer character device name
    168 #
    169 # @size: how many bytes to read at most
    170 #
    171 # @format: data encoding (default 'utf8').
    172 #
    173 #          - base64: the data read is returned in base64 encoding.
    174 #          - utf8: the data read is interpreted as UTF-8.
    175 #            Bug: can screw up when the buffer contains invalid UTF-8
    176 #            sequences, NUL characters, after the ring buffer lost
    177 #            data, and when reading stops because the size limit is
    178 #            reached.
    179 #          - The return value is always Unicode regardless of format,
    180 #            like any other string.
    181 #
    182 # Returns: data read from the device
    183 #
    184 # Since: 1.4
    185 #
    186 # Example:
    187 #
    188 # -> { "execute": "ringbuf-read",
    189 #      "arguments": { "device": "foo",
    190 #                     "size": 1000,
    191 #                     "format": "utf8" } }
    192 # <- { "return": "abcdefgh" }
    193 #
    194 ##
    195 { 'command': 'ringbuf-read',
    196   'data': {'device': 'str', 'size': 'int', '*format': 'DataFormat'},
    197   'returns': 'str' }
    198 
    199 ##
    200 # @ChardevCommon:
    201 #
    202 # Configuration shared across all chardev backends
    203 #
    204 # @logfile: The name of a logfile to save output
    205 # @logappend: true to append instead of truncate
    206 #             (default to false to truncate)
    207 #
    208 # Since: 2.6
    209 ##
    210 { 'struct': 'ChardevCommon',
    211   'data': { '*logfile': 'str',
    212             '*logappend': 'bool' } }
    213 
    214 ##
    215 # @ChardevFile:
    216 #
    217 # Configuration info for file chardevs.
    218 #
    219 # @in: The name of the input file
    220 # @out: The name of the output file
    221 # @append: Open the file in append mode (default false to
    222 #          truncate) (Since 2.6)
    223 #
    224 # Since: 1.4
    225 ##
    226 { 'struct': 'ChardevFile',
    227   'data': { '*in': 'str',
    228             'out': 'str',
    229             '*append': 'bool' },
    230   'base': 'ChardevCommon' }
    231 
    232 ##
    233 # @ChardevHostdev:
    234 #
    235 # Configuration info for device and pipe chardevs.
    236 #
    237 # @device: The name of the special file for the device,
    238 #          i.e. /dev/ttyS0 on Unix or COM1: on Windows
    239 #
    240 # Since: 1.4
    241 ##
    242 { 'struct': 'ChardevHostdev',
    243   'data': { 'device': 'str' },
    244   'base': 'ChardevCommon' }
    245 
    246 ##
    247 # @ChardevSocket:
    248 #
    249 # Configuration info for (stream) socket chardevs.
    250 #
    251 # @addr: socket address to listen on (server=true)
    252 #        or connect to (server=false)
    253 # @tls-creds: the ID of the TLS credentials object (since 2.6)
    254 # @tls-authz: the ID of the QAuthZ authorization object against which
    255 #             the client's x509 distinguished name will be validated. This
    256 #             object is only resolved at time of use, so can be deleted
    257 #             and recreated on the fly while the chardev server is active.
    258 #             If missing, it will default to denying access (since 4.0)
    259 # @server: create server socket (default: true)
    260 # @wait: wait for incoming connection on server
    261 #        sockets (default: false).
    262 #        Silently ignored with server: false.  This use is deprecated.
    263 # @nodelay: set TCP_NODELAY socket option (default: false)
    264 # @telnet: enable telnet protocol on server
    265 #          sockets (default: false)
    266 # @tn3270: enable tn3270 protocol on server
    267 #          sockets (default: false) (Since: 2.10)
    268 # @websocket: enable websocket protocol on server
    269 #             sockets (default: false) (Since: 3.1)
    270 # @reconnect: For a client socket, if a socket is disconnected,
    271 #             then attempt a reconnect after the given number of seconds.
    272 #             Setting this to zero disables this function. (default: 0)
    273 #             (Since: 2.2)
    274 #
    275 # Since: 1.4
    276 ##
    277 { 'struct': 'ChardevSocket',
    278   'data': { 'addr': 'SocketAddressLegacy',
    279             '*tls-creds': 'str',
    280             '*tls-authz'  : 'str',
    281             '*server': 'bool',
    282             '*wait': 'bool',
    283             '*nodelay': 'bool',
    284             '*telnet': 'bool',
    285             '*tn3270': 'bool',
    286             '*websocket': 'bool',
    287             '*reconnect': 'int' },
    288   'base': 'ChardevCommon' }
    289 
    290 ##
    291 # @ChardevUdp:
    292 #
    293 # Configuration info for datagram socket chardevs.
    294 #
    295 # @remote: remote address
    296 # @local: local address
    297 #
    298 # Since: 1.5
    299 ##
    300 { 'struct': 'ChardevUdp',
    301   'data': { 'remote': 'SocketAddressLegacy',
    302             '*local': 'SocketAddressLegacy' },
    303   'base': 'ChardevCommon' }
    304 
    305 ##
    306 # @ChardevMux:
    307 #
    308 # Configuration info for mux chardevs.
    309 #
    310 # @chardev: name of the base chardev.
    311 #
    312 # Since: 1.5
    313 ##
    314 { 'struct': 'ChardevMux',
    315   'data': { 'chardev': 'str' },
    316   'base': 'ChardevCommon' }
    317 
    318 ##
    319 # @ChardevStdio:
    320 #
    321 # Configuration info for stdio chardevs.
    322 #
    323 # @signal: Allow signals (such as SIGINT triggered by ^C)
    324 #          be delivered to qemu.  Default: true.
    325 #
    326 # Since: 1.5
    327 ##
    328 { 'struct': 'ChardevStdio',
    329   'data': { '*signal': 'bool' },
    330   'base': 'ChardevCommon' }
    331 
    332 ##
    333 # @ChardevSpiceChannel:
    334 #
    335 # Configuration info for spice vm channel chardevs.
    336 #
    337 # @type: kind of channel (for example vdagent).
    338 #
    339 # Since: 1.5
    340 ##
    341 { 'struct': 'ChardevSpiceChannel',
    342   'data': { 'type': 'str' },
    343   'base': 'ChardevCommon',
    344   'if': 'CONFIG_SPICE' }
    345 
    346 ##
    347 # @ChardevSpicePort:
    348 #
    349 # Configuration info for spice port chardevs.
    350 #
    351 # @fqdn: name of the channel (see docs/spice-port-fqdn.txt)
    352 #
    353 # Since: 1.5
    354 ##
    355 { 'struct': 'ChardevSpicePort',
    356   'data': { 'fqdn': 'str' },
    357   'base': 'ChardevCommon',
    358   'if': 'CONFIG_SPICE' }
    359 
    360 ##
    361 # @ChardevDBus:
    362 #
    363 # Configuration info for DBus chardevs.
    364 #
    365 # @name: name of the channel (following docs/spice-port-fqdn.txt)
    366 #
    367 # Since: 7.0
    368 ##
    369 { 'struct': 'ChardevDBus',
    370   'data': { 'name': 'str' },
    371   'base': 'ChardevCommon',
    372   'if': 'CONFIG_DBUS_DISPLAY' }
    373 
    374 ##
    375 # @ChardevVC:
    376 #
    377 # Configuration info for virtual console chardevs.
    378 #
    379 # @width: console width, in pixels
    380 # @height: console height, in pixels
    381 # @cols: console width, in chars
    382 # @rows: console height, in chars
    383 #
    384 # Since: 1.5
    385 ##
    386 { 'struct': 'ChardevVC',
    387   'data': { '*width': 'int',
    388             '*height': 'int',
    389             '*cols': 'int',
    390             '*rows': 'int' },
    391   'base': 'ChardevCommon' }
    392 
    393 ##
    394 # @ChardevRingbuf:
    395 #
    396 # Configuration info for ring buffer chardevs.
    397 #
    398 # @size: ring buffer size, must be power of two, default is 65536
    399 #
    400 # Since: 1.5
    401 ##
    402 { 'struct': 'ChardevRingbuf',
    403   'data': { '*size': 'int' },
    404   'base': 'ChardevCommon' }
    405 
    406 ##
    407 # @ChardevQemuVDAgent:
    408 #
    409 # Configuration info for qemu vdagent implementation.
    410 #
    411 # @mouse: enable/disable mouse, default is enabled.
    412 # @clipboard: enable/disable clipboard, default is disabled.
    413 #
    414 # Since: 6.1
    415 ##
    416 { 'struct': 'ChardevQemuVDAgent',
    417   'data': { '*mouse': 'bool',
    418             '*clipboard': 'bool' },
    419   'base': 'ChardevCommon',
    420   'if': 'CONFIG_SPICE_PROTOCOL' }
    421 
    422 ##
    423 # @ChardevBackendKind:
    424 #
    425 # @pipe: Since 1.5
    426 # @udp: Since 1.5
    427 # @mux: Since 1.5
    428 # @msmouse: Since 1.5
    429 # @wctablet: Since 2.9
    430 # @braille: Since 1.5
    431 # @testdev: Since 2.2
    432 # @stdio: Since 1.5
    433 # @console: Since 1.5
    434 # @spicevmc: Since 1.5
    435 # @spiceport: Since 1.5
    436 # @qemu-vdagent: Since 6.1
    437 # @dbus: Since 7.0
    438 # @vc: v1.5
    439 # @ringbuf: Since 1.6
    440 # @memory: Since 1.5
    441 #
    442 # Since: 1.4
    443 ##
    444 { 'enum': 'ChardevBackendKind',
    445   'data': [ 'file',
    446             'serial',
    447             'parallel',
    448             'pipe',
    449             'socket',
    450             'udp',
    451             'pty',
    452             'null',
    453             'mux',
    454             'msmouse',
    455             'wctablet',
    456             'braille',
    457             'testdev',
    458             'stdio',
    459             'console',
    460             { 'name': 'spicevmc', 'if': 'CONFIG_SPICE' },
    461             { 'name': 'spiceport', 'if': 'CONFIG_SPICE' },
    462             { 'name': 'qemu-vdagent', 'if': 'CONFIG_SPICE_PROTOCOL' },
    463             { 'name': 'dbus', 'if': 'CONFIG_DBUS_DISPLAY' },
    464             'vc',
    465             'ringbuf',
    466             # next one is just for compatibility
    467             'memory' ] }
    468 
    469 ##
    470 # @ChardevFileWrapper:
    471 #
    472 # Since: 1.4
    473 ##
    474 { 'struct': 'ChardevFileWrapper',
    475   'data': { 'data': 'ChardevFile' } }
    476 
    477 ##
    478 # @ChardevHostdevWrapper:
    479 #
    480 # Since: 1.4
    481 ##
    482 { 'struct': 'ChardevHostdevWrapper',
    483   'data': { 'data': 'ChardevHostdev' } }
    484 
    485 ##
    486 # @ChardevSocketWrapper:
    487 #
    488 # Since: 1.4
    489 ##
    490 { 'struct': 'ChardevSocketWrapper',
    491   'data': { 'data': 'ChardevSocket' } }
    492 
    493 ##
    494 # @ChardevUdpWrapper:
    495 #
    496 # Since: 1.5
    497 ##
    498 { 'struct': 'ChardevUdpWrapper',
    499   'data': { 'data': 'ChardevUdp' } }
    500 
    501 ##
    502 # @ChardevCommonWrapper:
    503 #
    504 # Since: 2.6
    505 ##
    506 { 'struct': 'ChardevCommonWrapper',
    507   'data': { 'data': 'ChardevCommon' } }
    508 
    509 ##
    510 # @ChardevMuxWrapper:
    511 #
    512 # Since: 1.5
    513 ##
    514 { 'struct': 'ChardevMuxWrapper',
    515   'data': { 'data': 'ChardevMux' } }
    516 
    517 ##
    518 # @ChardevStdioWrapper:
    519 #
    520 # Since: 1.5
    521 ##
    522 { 'struct': 'ChardevStdioWrapper',
    523   'data': { 'data': 'ChardevStdio' } }
    524 
    525 ##
    526 # @ChardevSpiceChannelWrapper:
    527 #
    528 # Since: 1.5
    529 ##
    530 { 'struct': 'ChardevSpiceChannelWrapper',
    531   'data': { 'data': 'ChardevSpiceChannel' },
    532   'if': 'CONFIG_SPICE' }
    533 
    534 ##
    535 # @ChardevSpicePortWrapper:
    536 #
    537 # Since: 1.5
    538 ##
    539 { 'struct': 'ChardevSpicePortWrapper',
    540   'data': { 'data': 'ChardevSpicePort' },
    541   'if': 'CONFIG_SPICE' }
    542 
    543 ##
    544 # @ChardevQemuVDAgentWrapper:
    545 #
    546 # Since: 6.1
    547 ##
    548 { 'struct': 'ChardevQemuVDAgentWrapper',
    549   'data': { 'data': 'ChardevQemuVDAgent' },
    550   'if': 'CONFIG_SPICE_PROTOCOL' }
    551 
    552 ##
    553 # @ChardevDBusWrapper:
    554 #
    555 # Since: 7.0
    556 ##
    557 { 'struct': 'ChardevDBusWrapper',
    558   'data': { 'data': 'ChardevDBus' },
    559   'if': 'CONFIG_DBUS_DISPLAY' }
    560 
    561 ##
    562 # @ChardevVCWrapper:
    563 #
    564 # Since: 1.5
    565 ##
    566 { 'struct': 'ChardevVCWrapper',
    567   'data': { 'data': 'ChardevVC' } }
    568 
    569 ##
    570 # @ChardevRingbufWrapper:
    571 #
    572 # Since: 1.5
    573 ##
    574 { 'struct': 'ChardevRingbufWrapper',
    575   'data': { 'data': 'ChardevRingbuf' } }
    576 
    577 ##
    578 # @ChardevBackend:
    579 #
    580 # Configuration info for the new chardev backend.
    581 #
    582 # Since: 1.4
    583 ##
    584 { 'union': 'ChardevBackend',
    585   'base': { 'type': 'ChardevBackendKind' },
    586   'discriminator': 'type',
    587   'data': { 'file': 'ChardevFileWrapper',
    588             'serial': 'ChardevHostdevWrapper',
    589             'parallel': 'ChardevHostdevWrapper',
    590             'pipe': 'ChardevHostdevWrapper',
    591             'socket': 'ChardevSocketWrapper',
    592             'udp': 'ChardevUdpWrapper',
    593             'pty': 'ChardevCommonWrapper',
    594             'null': 'ChardevCommonWrapper',
    595             'mux': 'ChardevMuxWrapper',
    596             'msmouse': 'ChardevCommonWrapper',
    597             'wctablet': 'ChardevCommonWrapper',
    598             'braille': 'ChardevCommonWrapper',
    599             'testdev': 'ChardevCommonWrapper',
    600             'stdio': 'ChardevStdioWrapper',
    601             'console': 'ChardevCommonWrapper',
    602             'spicevmc': { 'type': 'ChardevSpiceChannelWrapper',
    603                           'if': 'CONFIG_SPICE' },
    604             'spiceport': { 'type': 'ChardevSpicePortWrapper',
    605                            'if': 'CONFIG_SPICE' },
    606             'qemu-vdagent': { 'type': 'ChardevQemuVDAgentWrapper',
    607                               'if': 'CONFIG_SPICE_PROTOCOL' },
    608             'dbus': { 'type': 'ChardevDBusWrapper',
    609                       'if': 'CONFIG_DBUS_DISPLAY' },
    610             'vc': 'ChardevVCWrapper',
    611             'ringbuf': 'ChardevRingbufWrapper',
    612             # next one is just for compatibility
    613             'memory': 'ChardevRingbufWrapper' } }
    614 
    615 ##
    616 # @ChardevReturn:
    617 #
    618 # Return info about the chardev backend just created.
    619 #
    620 # @pty: name of the slave pseudoterminal device, present if
    621 #       and only if a chardev of type 'pty' was created
    622 #
    623 # Since: 1.4
    624 ##
    625 { 'struct' : 'ChardevReturn',
    626   'data': { '*pty': 'str' } }
    627 
    628 ##
    629 # @chardev-add:
    630 #
    631 # Add a character device backend
    632 #
    633 # @id: the chardev's ID, must be unique
    634 # @backend: backend type and parameters
    635 #
    636 # Returns: ChardevReturn.
    637 #
    638 # Since: 1.4
    639 #
    640 # Example:
    641 #
    642 # -> { "execute" : "chardev-add",
    643 #      "arguments" : { "id" : "foo",
    644 #                      "backend" : { "type" : "null", "data" : {} } } }
    645 # <- { "return": {} }
    646 #
    647 # -> { "execute" : "chardev-add",
    648 #      "arguments" : { "id" : "bar",
    649 #                      "backend" : { "type" : "file",
    650 #                                    "data" : { "out" : "/tmp/bar.log" } } } }
    651 # <- { "return": {} }
    652 #
    653 # -> { "execute" : "chardev-add",
    654 #      "arguments" : { "id" : "baz",
    655 #                      "backend" : { "type" : "pty", "data" : {} } } }
    656 # <- { "return": { "pty" : "/dev/pty/42" } }
    657 #
    658 ##
    659 { 'command': 'chardev-add',
    660   'data': { 'id': 'str',
    661             'backend': 'ChardevBackend' },
    662   'returns': 'ChardevReturn' }
    663 
    664 ##
    665 # @chardev-change:
    666 #
    667 # Change a character device backend
    668 #
    669 # @id: the chardev's ID, must exist
    670 # @backend: new backend type and parameters
    671 #
    672 # Returns: ChardevReturn.
    673 #
    674 # Since: 2.10
    675 #
    676 # Example:
    677 #
    678 # -> { "execute" : "chardev-change",
    679 #      "arguments" : { "id" : "baz",
    680 #                      "backend" : { "type" : "pty", "data" : {} } } }
    681 # <- { "return": { "pty" : "/dev/pty/42" } }
    682 #
    683 # -> {"execute" : "chardev-change",
    684 #     "arguments" : {
    685 #         "id" : "charchannel2",
    686 #         "backend" : {
    687 #             "type" : "socket",
    688 #             "data" : {
    689 #                 "addr" : {
    690 #                     "type" : "unix" ,
    691 #                     "data" : {
    692 #                         "path" : "/tmp/charchannel2.socket"
    693 #                     }
    694 #                  },
    695 #                  "server" : true,
    696 #                  "wait" : false }}}}
    697 # <- {"return": {}}
    698 #
    699 ##
    700 { 'command': 'chardev-change',
    701   'data': { 'id': 'str',
    702             'backend': 'ChardevBackend' },
    703   'returns': 'ChardevReturn' }
    704 
    705 ##
    706 # @chardev-remove:
    707 #
    708 # Remove a character device backend
    709 #
    710 # @id: the chardev's ID, must exist and not be in use
    711 #
    712 # Returns: Nothing on success
    713 #
    714 # Since: 1.4
    715 #
    716 # Example:
    717 #
    718 # -> { "execute": "chardev-remove", "arguments": { "id" : "foo" } }
    719 # <- { "return": {} }
    720 #
    721 ##
    722 { 'command': 'chardev-remove',
    723   'data': { 'id': 'str' } }
    724 
    725 ##
    726 # @chardev-send-break:
    727 #
    728 # Send a break to a character device
    729 #
    730 # @id: the chardev's ID, must exist
    731 #
    732 # Returns: Nothing on success
    733 #
    734 # Since: 2.10
    735 #
    736 # Example:
    737 #
    738 # -> { "execute": "chardev-send-break", "arguments": { "id" : "foo" } }
    739 # <- { "return": {} }
    740 #
    741 ##
    742 { 'command': 'chardev-send-break',
    743   'data': { 'id': 'str' } }
    744 
    745 ##
    746 # @VSERPORT_CHANGE:
    747 #
    748 # Emitted when the guest opens or closes a virtio-serial port.
    749 #
    750 # @id: device identifier of the virtio-serial port
    751 #
    752 # @open: true if the guest has opened the virtio-serial port
    753 #
    754 # Note: This event is rate-limited.
    755 #
    756 # Since: 2.1
    757 #
    758 # Example:
    759 #
    760 # <- { "event": "VSERPORT_CHANGE",
    761 #      "data": { "id": "channel0", "open": true },
    762 #      "timestamp": { "seconds": 1401385907, "microseconds": 422329 } }
    763 #
    764 ##
    765 { 'event': 'VSERPORT_CHANGE',
    766   'data': { 'id': 'str',
    767             'open': 'bool' } }