Enable the client disconnect within virt-admin. Also, update the man page
accordingly.
Signed-off-by: Erik Skultety <eskultet(a)redhat.com>
---
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