Enable the client disconnect within virt-admin. Also, update the man page accordingly. Signed-off-by: Erik Skultety <eskultet@xxxxxxxxxx> --- tools/virt-admin.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++ tools/virt-admin.pod | 16 ++++++++++++ 2 files changed, 88 insertions(+) diff --git a/tools/virt-admin.c b/tools/virt-admin.c index f0fecdd..81b8589 100644 --- a/tools/virt-admin.c +++ b/tools/virt-admin.c @@ -655,6 +655,72 @@ cmdSrvClientsList(vshControl *ctl, const vshCmd *cmd) return ret; } +/* ------------------------- + * Command client-disconnect + * ------------------------- + */ + +static const vshCmdInfo info_client_disconnect[] = { + {.name = "help", + .data = N_("force disconnect a client from the given server") + }, + {.name = "desc", + .data = N_("Force close a specific client's connection to the given " + "server.") + }, + {.name = NULL} +}; + +static const vshCmdOptDef opts_client_disconnect[] = { + {.name = "client", + .type = VSH_OT_INT, + .flags = VSH_OFLAG_REQ, + .help = N_("client which to disconnect, specified by ID"), + }, + {.name = "server", + .type = VSH_OT_DATA, + .flags = VSH_OFLAG_REQ, + .help = N_("server which the client is currently connected to"), + }, + {.name = NULL} +}; + +static bool +cmdClientDisconnect(vshControl *ctl, const vshCmd *cmd) +{ + bool ret = false; + const char *srvname = NULL; + unsigned long long id = 0; + virAdmServerPtr srv = NULL; + virAdmClientPtr client = NULL; + vshAdmControlPtr priv = ctl->privData; + + if (vshCommandOptStringReq(ctl, cmd, "server", &srvname) < 0) + return false; + + if (vshCommandOptULongLongWrap(ctl, cmd, "client", &id) < 0) + return false; + + if (!(srv = virAdmConnectLookupServer(priv->conn, srvname, 0))) + goto cleanup; + + if (!(client = virAdmServerLookupClient(srv, id, 0))) + goto cleanup; + + if (virAdmClientClose(client, 0) < 0) { + vshError(ctl, _("Failed to disconnect client '%llu' from server %s"), + id, virAdmServerGetName(srv)); + goto cleanup; + } + + vshPrint(ctl, _("Client '%llu' disconnected"), id); + ret = true; + cleanup: + virAdmClientFree(client); + virAdmServerFree(srv); + return ret; +} + static void * vshAdmConnectionHandler(vshControl *ctl) { @@ -976,6 +1042,12 @@ static const vshCmdDef managementCmds[] = { .info = info_srv_threadpool_set, .flags = 0 }, + {.name = "client-disconnect", + .handler = cmdClientDisconnect, + .opts = opts_client_disconnect, + .info = info_client_disconnect, + .flags = 0 + }, {.name = NULL} }; diff --git a/tools/virt-admin.pod b/tools/virt-admin.pod index 6f9dd63..573f8d9 100644 --- a/tools/virt-admin.pod +++ b/tools/virt-admin.pod @@ -229,6 +229,22 @@ information about client's connection time (system local time is used). =back +=head1 CLIENT COMMANDS + +Following commands provide management and monitoring of clients connected to +one of daemon's available servers. Clients are specified by their numeric ID +which is obtained by listing all clients connected to a specified server +(see command B<srv-clients-list>). + +=over + +=item B<client-disconnect> I<client> I<server> + +Close a connection originating from I<client>. The I<server> argument +specifies the name of the server I<client> is currently connected to. + +=back + =head1 ENVIRONMENT The following environment variables can be set to alter the behaviour -- 2.4.11 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list