qapi/ui: add 'display-update' command for changing listen address

Add possibility to change addresses where VNC server listens for new
connections. Prior to 6.0 this functionality was available through
'change' qmp command which was deleted.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@openvz.org>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Message-Id: <20220401143936.356460-3-vsementsov@openvz.org>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
master
Vladimir Sementsov-Ogievskiy 2022-04-01 17:39:35 +03:00 committed by Gerd Hoffmann
parent d708f99d85
commit abea19468e
5 changed files with 106 additions and 1 deletions

View File

@ -355,7 +355,8 @@ documentation of ``query-hotpluggable-cpus`` for additional details.
``change`` (removed in 6.0)
'''''''''''''''''''''''''''
Use ``blockdev-change-medium`` or ``change-vnc-password`` instead.
Use ``blockdev-change-medium`` or ``change-vnc-password`` or
``display-update`` instead.
``query-events`` (removed in 6.0)
'''''''''''''''''''''''''''''''''

View File

@ -518,6 +518,7 @@ int vnc_display_pw_expire(const char *id, time_t expires);
void vnc_parse(const char *str);
int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp);
bool vnc_display_reload_certs(const char *id, Error **errp);
bool vnc_display_update(DisplayUpdateOptionsVNC *arg, Error **errp);
/* input.c */
int index_from_key(const char *key, size_t key_length);

View File

@ -346,6 +346,21 @@ void qmp_display_reload(DisplayReloadOptions *arg, Error **errp)
}
}
void qmp_display_update(DisplayUpdateOptions *arg, Error **errp)
{
switch (arg->type) {
case DISPLAY_UPDATE_TYPE_VNC:
#ifdef CONFIG_VNC
vnc_display_update(&arg->u.vnc, errp);
#else
error_setg(errp, "vnc is invalid, missing 'CONFIG_VNC'");
#endif
break;
default:
abort();
}
}
static int qmp_x_query_rdma_foreach(Object *obj, void *opaque)
{
RdmaProvider *rdma;

View File

@ -1468,3 +1468,68 @@
{ 'command': 'display-reload',
'data': 'DisplayReloadOptions',
'boxed' : true }
##
# @DisplayUpdateType:
#
# Available DisplayUpdate types.
#
# @vnc: VNC display
#
# Since: 7.1
#
##
{ 'enum': 'DisplayUpdateType',
'data': ['vnc'] }
##
# @DisplayUpdateOptionsVNC:
#
# Specify the VNC reload options.
#
# @addresses: If specified, change set of addresses
# to listen for connections. Addresses configured
# for websockets are not touched.
#
# Since: 7.1
#
##
{ 'struct': 'DisplayUpdateOptionsVNC',
'data': { '*addresses': ['SocketAddress'] } }
##
# @DisplayUpdateOptions:
#
# Options of the display configuration reload.
#
# @type: Specify the display type.
#
# Since: 7.1
#
##
{ 'union': 'DisplayUpdateOptions',
'base': {'type': 'DisplayUpdateType'},
'discriminator': 'type',
'data': { 'vnc': 'DisplayUpdateOptionsVNC' } }
##
# @display-update:
#
# Update display configuration.
#
# Returns: Nothing on success.
#
# Since: 7.1
#
# Example:
#
# -> { "execute": "display-update",
# "arguments": { "type": "vnc", "addresses":
# [ { "type": "inet", "host": "0.0.0.0",
# "port": "5901" } ] } }
# <- { "return": {} }
#
##
{ 'command': 'display-update',
'data': 'DisplayUpdateOptions',
'boxed' : true }

View File

@ -3981,6 +3981,29 @@ static int vnc_display_listen(VncDisplay *vd,
return 0;
}
bool vnc_display_update(DisplayUpdateOptionsVNC *arg, Error **errp)
{
VncDisplay *vd = vnc_display_find(NULL);
if (!vd) {
error_setg(errp, "Can not find vnc display");
return false;
}
if (arg->has_addresses) {
if (vd->listener) {
qio_net_listener_disconnect(vd->listener);
object_unref(OBJECT(vd->listener));
vd->listener = NULL;
}
if (vnc_display_listen(vd, arg->addresses, NULL, errp) < 0) {
return false;
}
}
return true;
}
void vnc_display_open(const char *id, Error **errp)
{