On 10/5/22 12:51, Daniel P. Berrangé wrote: > Libvirt provides QMP passthrough APIs for the QEMU driver and these are > exposed in virsh. It is not especially pleasant, however, using the raw > QMP JSON syntax. QEMU has a tool 'qmp-shell' which can speak QMP and > exposes a human friendly interactive shell. It is not possible to use > this with libvirt managed guest, however, since only one client can > attach to the QMP socket at any point in time. While it would be > possible to configure a second QMP socket for a VM, it may not be > an known requirement at the time the guest is provisioned. > > The virt-qmp-proxy tool aims to solve this problem. It opens a UNIX > socket and listens for incoming client connections, speaking QMP on > the connected socket. It will forward any QMP commands received onto > the running libvirt QEMU guest, and forward any replies back to the > QMP client. It will also forward back events. > > $ virsh start demo > $ virt-qmp-proxy demo demo.qmp & > $ qmp-shell demo.qmp > Welcome to the QMP low-level shell! > Connected to QEMU 6.2.0 > > (QEMU) query-kvm > { > "return": { > "enabled": true, > "present": true > } > } > > Note this tool of course has the same risks as the raw libvirt > QMP passthrough. It is safe to run query commands to fetch information > but commands which change the QEMU state risk disrupting libvirt's > management of QEMU, potentially resulting in data loss/corruption in > the worst case. Any use of this tool will cause the guest to be marked > as tainted as an warning that it could be in an unexpected state. > > Since this tool introduces a python dependency it is not desirable > to include it in any of the existing RPMs in libvirt. This tool is > also QEMU specific, so isn't appropriate to bundle with the generic > tools. Thus a new RPM is introduced 'libvirt-clients-qemu', to > contain additional QEMU specific tools, with extra external deps. > > Signed-off-by: Daniel P. Berrangé <berrange@xxxxxxxxxx> > --- > > In v3: > > - Added to libvirt-clients-qemu RPM > - Renamed to virt-qemu-qmp-proxy > > docs/manpages/meson.build | 1 + > docs/manpages/virt-qemu-qmp-proxy.rst | 120 +++++++++ > libvirt.spec.in | 15 ++ > tools/meson.build | 5 + > tools/virt-qemu-qmp-proxy | 360 ++++++++++++++++++++++++++ > 5 files changed, 501 insertions(+) > create mode 100644 docs/manpages/virt-qemu-qmp-proxy.rst > create mode 100755 tools/virt-qemu-qmp-proxy > > diff --git a/tools/virt-qemu-qmp-proxy b/tools/virt-qemu-qmp-proxy > new file mode 100755 > index 0000000000..d85342bd2b > --- /dev/null > +++ b/tools/virt-qemu-qmp-proxy > + @staticmethod > + def make_file(fd): > + flags = fcntl.fcntl(fd, fcntl.F_GETFL) > + > + mask = os.O_RDONLY | os.O_WRONLY | os.O_RDWR | os.O_APPEND > + flags = flags & mask > + mode = "" > + if flags == os.O_RDONLY: > + mode = "rb" > + elif flags == os.O_WRONLY: > + mode = "wb" > + elif flags == os.O_RDWR: > + mode = "r+b" > + elif flags == (os.O_WRONLY | os.O_APPEND): > + mode = "ab" > + elif flags == (os.O_RDWR | os.O_APPEND): > + mode = "a+b" > + > + return os.fdopen(fd, mode) This upsets syntax-check. Squash this in: diff --git i/build-aux/syntax-check.mk w/build-aux/syntax-check.mk index 649eb91acb..e35c2be734 100644 --- i/build-aux/syntax-check.mk +++ w/build-aux/syntax-check.mk @@ -1363,7 +1363,7 @@ exclude_file_name_regexp--sc_prohibit_strdup = \ ^(docs/|examples/|tests/virnetserverclientmock.c|tests/commandhelper.c|tools/nss/libvirt_nss_(leases|macs)\.c$$) exclude_file_name_regexp--sc_prohibit_close = \ - (\.p[yl]$$|\.spec\.in$$|^docs/|^(src/util/vir(file|event)\.c|src/libvirt-stream\.c|tests/(vir.+mock\.c|commandhelper\.c|qemusecuritymock\.c)|tools/nss/libvirt_nss_(leases|macs)\.c)$$) + (\.p[yl]$$|\.spec\.in$$|^docs/|^(src/util/vir(file|event)\.c|src/libvirt-stream\.c|tests/(vir.+mock\.c|commandhelper\.c|qemusecuritymock\.c)|tools/nss/libvirt_nss_(leases|macs)\.c)|tools/virt-qemu-qmp-proxy$$) exclude_file_name_regexp--sc_prohibit_empty_lines_at_EOF = \ (^tests/(nodedevmdevctl|virhostcpu|virpcitest|virstoragetest)data/|docs/js/.*\.js|docs/fonts/.*\.woff|\.diff|tests/virconfdata/no-newline\.conf$$) (or add .py suffix, but I dislike that actually). Reviewed-by: Michal Privoznik <mprivozn@xxxxxxxxxx> Michal