On 04.05.2016 16:46, Erik Skultety wrote:
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 | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++
tools/virt-admin.pod | 5 ++++
2 files changed, 78 insertions(+)
diff --git a/tools/virt-admin.c b/tools/virt-admin.c
index d6f7084..530409c 100644
--- a/tools/virt-admin.c
+++ b/tools/virt-admin.c
@@ -742,6 +742,73 @@ cmdClientInfo(vshControl *ctl, const vshCmd *cmd)
VIR_FREE(timestr);
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}
+};
Just like in client-info, I think these two arguments should be swapped.
+
+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)
{
@@ -1069,6 +1136,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 bf64e1e..b90f037 100644
--- a/tools/virt-admin.pod
+++ b/tools/virt-admin.pod
@@ -270,6 +270,11 @@ B<Examples>
readonly : no
sock_addr : 127.0.0.1:57060
+=item B<client-disconnect> I<server> I<client>
+
+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
Michal