mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
virsh: add qemu-monitor-command --pretty
I was using qemu-monitor-command during development, and found it quite hard to use. Compare the results of this patch on ease of reading: $ virsh qemu-monitor-command dom '{"execute":"query-version"}' {"return":{"qemu":{"micro":1,"minor":12,"major":0},"package":"(qemu-kvm-0.12.1.2)"},"id":"libvirt-7683"} $ virsh qemu-monitor-command --pretty dom '{"execute":"query-version"}' { "return": { "qemu": { "micro": 1, "minor": 12, "major": 0 }, "package": "(qemu-kvm-0.12.1.2)" }, "id": "libvirt-7674" } * tools/virsh-host.c (cmdQemuMonitorCommand): New option. * tools/virsh.pod (qemu-monitor-command): Document it.
This commit is contained in:
parent
7c035625f8
commit
2a1aaa609e
@ -38,6 +38,7 @@
|
|||||||
#include "virsh-domain.h"
|
#include "virsh-domain.h"
|
||||||
#include "xml.h"
|
#include "xml.h"
|
||||||
#include "virtypedparam.h"
|
#include "virtypedparam.h"
|
||||||
|
#include "json.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "capabilities" command
|
* "capabilities" command
|
||||||
@ -529,6 +530,8 @@ static const vshCmdInfo info_qemu_monitor_command[] = {
|
|||||||
static const vshCmdOptDef opts_qemu_monitor_command[] = {
|
static const vshCmdOptDef opts_qemu_monitor_command[] = {
|
||||||
{"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")},
|
{"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")},
|
||||||
{"hmp", VSH_OT_BOOL, 0, N_("command is in human monitor protocol")},
|
{"hmp", VSH_OT_BOOL, 0, N_("command is in human monitor protocol")},
|
||||||
|
{"pretty", VSH_OT_BOOL, 0,
|
||||||
|
N_("pretty-print any qemu monitor protocol output")},
|
||||||
{"cmd", VSH_OT_ARGV, VSH_OFLAG_REQ, N_("command")},
|
{"cmd", VSH_OT_ARGV, VSH_OFLAG_REQ, N_("command")},
|
||||||
{NULL, 0, 0, NULL}
|
{NULL, 0, 0, NULL}
|
||||||
};
|
};
|
||||||
@ -544,6 +547,7 @@ cmdQemuMonitorCommand(vshControl *ctl, const vshCmd *cmd)
|
|||||||
const vshCmdOpt *opt = NULL;
|
const vshCmdOpt *opt = NULL;
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||||
bool pad = false;
|
bool pad = false;
|
||||||
|
virJSONValuePtr pretty = NULL;
|
||||||
|
|
||||||
dom = vshCommandOptDomain(ctl, cmd, NULL);
|
dom = vshCommandOptDomain(ctl, cmd, NULL);
|
||||||
if (dom == NULL)
|
if (dom == NULL)
|
||||||
@ -561,12 +565,27 @@ cmdQemuMonitorCommand(vshControl *ctl, const vshCmd *cmd)
|
|||||||
}
|
}
|
||||||
monitor_cmd = virBufferContentAndReset(&buf);
|
monitor_cmd = virBufferContentAndReset(&buf);
|
||||||
|
|
||||||
if (vshCommandOptBool(cmd, "hmp"))
|
if (vshCommandOptBool(cmd, "hmp")) {
|
||||||
|
if (vshCommandOptBool(cmd, "pretty")) {
|
||||||
|
vshError(ctl, _("--hmp and --pretty are not compatible"));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
flags |= VIR_DOMAIN_QEMU_MONITOR_COMMAND_HMP;
|
flags |= VIR_DOMAIN_QEMU_MONITOR_COMMAND_HMP;
|
||||||
|
}
|
||||||
|
|
||||||
if (virDomainQemuMonitorCommand(dom, monitor_cmd, &result, flags) < 0)
|
if (virDomainQemuMonitorCommand(dom, monitor_cmd, &result, flags) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
if (vshCommandOptBool(cmd, "pretty")) {
|
||||||
|
char *tmp;
|
||||||
|
pretty = virJSONValueFromString(result);
|
||||||
|
if (pretty && (tmp = virJSONValueToString(pretty, true))) {
|
||||||
|
VIR_FREE(result);
|
||||||
|
result = tmp;
|
||||||
|
} else {
|
||||||
|
vshResetLibvirtError();
|
||||||
|
}
|
||||||
|
}
|
||||||
vshPrint(ctl, "%s\n", result);
|
vshPrint(ctl, "%s\n", result);
|
||||||
|
|
||||||
ret = true;
|
ret = true;
|
||||||
@ -574,6 +593,7 @@ cmdQemuMonitorCommand(vshControl *ctl, const vshCmd *cmd)
|
|||||||
cleanup:
|
cleanup:
|
||||||
VIR_FREE(result);
|
VIR_FREE(result);
|
||||||
VIR_FREE(monitor_cmd);
|
VIR_FREE(monitor_cmd);
|
||||||
|
virJSONValueFree(pretty);
|
||||||
if (dom)
|
if (dom)
|
||||||
virDomainFree(dom);
|
virDomainFree(dom);
|
||||||
|
|
||||||
|
@ -2910,15 +2910,17 @@ attaching to an externally launched QEMU process. There may be
|
|||||||
issues with the guest ABI changing upon migration, and hotunplug
|
issues with the guest ABI changing upon migration, and hotunplug
|
||||||
may not work.
|
may not work.
|
||||||
|
|
||||||
=item B<qemu-monitor-command> I<domain> [I<--hmp>] I<command>...
|
=item B<qemu-monitor-command> I<domain> { [I<--hmp>] | [I<--pretty>] }
|
||||||
|
I<command>...
|
||||||
|
|
||||||
Send an arbitrary monitor command I<command> to domain I<domain> through the
|
Send an arbitrary monitor command I<command> to domain I<domain> through the
|
||||||
qemu monitor. The results of the command will be printed on stdout. If
|
qemu monitor. The results of the command will be printed on stdout. If
|
||||||
I<--hmp> is passed, the command is considered to be a human monitor command
|
I<--hmp> is passed, the command is considered to be a human monitor command
|
||||||
and libvirt will automatically convert it into QMP if needed. In that case
|
and libvirt will automatically convert it into QMP if needed. In that case
|
||||||
the result will also be converted back from QMP. If more than one argument
|
the result will also be converted back from QMP. If I<--pretty> is given,
|
||||||
is provided for I<command>, they are concatenated with a space in between
|
and the monitor uses QMP, then the output will be pretty-printed. If more
|
||||||
before passing the single command to the monitor.
|
than one argument is provided for I<command>, they are concatenated with a
|
||||||
|
space in between before passing the single command to the monitor.
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user