On Fri, Oct 07, 2022 at 03:22:33PM +0200, Michal Prívozník wrote: > 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: For that matter 'flake8' hates my whitespace, so I'll fix that too > (or add .py suffix, but I dislike that actually). Yeah, likewise > Reviewed-by: Michal Privoznik <mprivozn@xxxxxxxxxx> With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|