From: Peter Krempa <[email protected]>

Signed-off-by: Peter Krempa <[email protected]>
---
 docs/manpages/virsh.rst | 19 ++++++++++++++++++
 tools/virsh-host.c      | 43 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 62 insertions(+)

diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst
index 80b0ea14a8..01e2ac9d32 100644
--- a/docs/manpages/virsh.rst
+++ b/docs/manpages/virsh.rst
@@ -1097,6 +1097,25 @@ on the host are reported. The option *--all* will report 
every CPU model known
 to the hypervisor, including ones that are not supported on the hypervisor 
(e.g.
 newer generation models).

+introspection
+-------------
+
+**Syntax:**
+
+::
+
+   introspection [--xpath EXPRESSION] [--wrap]
+
+Output the libvirt connection feature introspection XML.
+
+If the **--xpath** argument provides an XPath expression, it will be
+evaluated against the output XML and only those matching nodes will
+be printed. The default behaviour is to print each matching node as
+a standalone document, however, for ease of additional processing,
+the **--wrap** argument will cause the matching node to be wrapped
+in a common root node.
+
+
 DOMAIN COMMANDS
 ===============

diff --git a/tools/virsh-host.c b/tools/virsh-host.c
index ef91e22fed..e1980bc276 100644
--- a/tools/virsh-host.c
+++ b/tools/virsh-host.c
@@ -1864,6 +1864,43 @@ cmdHypervisorCPUModelNames(vshControl *ctl,
 }


+static const vshCmdInfo info_introspection = {
+    .help = N_("get XML containing connection introspection data"),
+    .desc = N_("get XML containing connection introspection data"),
+};
+
+static const vshCmdOptDef opts_introspection[] = {
+    {.name = "xpath",
+     .type = VSH_OT_STRING,
+     .completer = vshCompleteEmpty,
+     .help = N_("xpath expression to filter the XML document")
+    },
+    {.name = "wrap",
+     .type = VSH_OT_BOOL,
+     .help = N_("wrap xpath results in an common root element"),
+    },
+    {.name = NULL}
+};
+
+static bool
+cmdIntrospection(vshControl *ctl,
+                 const vshCmd *cmd)
+{
+    g_autofree char *xml = NULL;
+    virshControl *priv = ctl->privData;
+    bool wrap = vshCommandOptBool(cmd, "wrap");
+    const char *xpath = NULL;
+
+    if (vshCommandOptStringQuiet(ctl, cmd, "xpath", &xpath) < 0)
+        return false;
+
+    if (!(xml = virConnectGetIntrospection(priv->conn, 0)))
+        return false;
+
+    return virshDumpXML(ctl, xml, "domain", xpath, wrap);
+}
+
+
 const vshCmdDef hostAndHypervisorCmds[] = {
     {.name = "allocpages",
      .handler = cmdAllocpages,
@@ -2003,5 +2040,11 @@ const vshCmdDef hostAndHypervisorCmds[] = {
      .info = &info_version,
      .flags = 0
     },
+    {.name = "introspection",
+     .handler = cmdIntrospection,
+     .opts = opts_introspection,
+     .info = &info_introspection,
+     .flags = 0
+    },
     {.name = NULL}
 };
-- 
2.54.0

Reply via email to