Signed-off-by: Jonathon Jongsma <jjongsma(a)redhat.com>
---
tools/virsh-domain.c | 76 ++++++++++++++++++++++++++++++++++++++++++++
tools/virsh.pod | 4 +++
2 files changed, 80 insertions(+)
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 828ae30789..b964608987 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -14030,6 +14030,76 @@ cmdDomFSInfo(vshControl *ctl, const vshCmd *cmd)
return ret;
}
+/*
+ * "guestusers" command
+ */
+static const vshCmdInfo info_guestusers[] = {
+ {.name = "help",
+ .data = N_("query the users logged on in the guest (via agent)")
+ },
+ {.name = "desc",
+ .data = N_("Use the guest agent to query the list of logged in users from
guest's "
+ "point of view")
+ },
+ {.name = NULL}
+};
+
+static const vshCmdOptDef opts_guestusers[] = {
+ VIRSH_COMMON_OPT_DOMAIN_FULL(VIR_CONNECT_LIST_DOMAINS_ACTIVE),
+ {.name = NULL}
+};
+
+static bool
+cmdGuestusers(vshControl *ctl, const vshCmd *cmd)
+{
+ virDomainPtr dom;
+ virDomainUserInfoPtr *userinfo = NULL;
+ int ninfo = 0;
+ size_t i;
+ bool ret = false;
+ vshTablePtr table = NULL;
+
+ if (!(dom = virshCommandOptDomain(ctl, cmd, NULL)))
+ return false;
+
+ if ((ninfo = virDomainGetGuestUsers(dom, &userinfo, 0)) < 0)
+ goto cleanup;
+
+ if (userinfo != NULL) {
+ table = vshTableNew(_("User"), _("Domain"), _("Login
Time"), NULL);
+ if (!table)
+ goto cleanup;
+
+ for (i = 0; i < ninfo; i++) {
+ VIR_AUTOFREE(char *) loginstr =
virTimeStringThen(userinfo[i]->loginTime);
+ if (loginstr == NULL)
+ goto cleanup;
+
+ if (vshTableRowAppend(table,
+ userinfo[i]->user,
+ userinfo[i]->domain ? userinfo[i]->domain :
"",
+ loginstr,
+ NULL) < 0)
+ goto cleanup;
+ }
+
+ vshTablePrintToStdout(table, ctl);
+ } else {
+ vshPrintExtra(ctl, _("No active users in the domain"));
+ }
+
+ ret = true;
+
+cleanup:
+ if (ninfo >= 0) {
+ for (i = 0; i < ninfo; i++)
+ virDomainUserInfoFree(userinfo[i]);
+ }
+ VIR_FREE(userinfo);
+ virshDomainFree(dom);
+ return ret;
+}
+
const vshCmdDef domManagementCmds[] = {
{.name = "attach-device",
.handler = cmdAttachDevice,
@@ -14645,5 +14715,11 @@ const vshCmdDef domManagementCmds[] = {
.info = info_domblkthreshold,
.flags = 0
},
+ {.name = "guestusers",
+ .handler = cmdGuestusers,
+ .opts = opts_guestusers,
+ .info = info_guestusers,
+ .flags = 0
+ },
{.name = NULL}
};
diff --git a/tools/virsh.pod b/tools/virsh.pod
index 5168fa96b6..59cf3d5857 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -3072,6 +3072,10 @@ provided too. The desired operation is then executed on the
domain.
See B<vcpupin> for information on I<cpulist>.
+=item B<guestusers> I<domain>
+
+Query the list of logged in users from guest's point of view using the guest agent.
+
=item B<vncdisplay> I<domain>
Output the IP address and port number for the VNC display. If the information
--
2.20.1