On 4/18/25 14:55, Blade Liu wrote:
> Hi all,
>
> I have a problem to execute qmp commands via qemu guest agent using
> libvirt-Python. In libivrt and qemu tutorial, qmp commands are invoked
> by terminal. In my project, I want to invoke the commands natively using
> libvirt-Python API, not using Python subprocess module.
> (my test shows using subprocess to invoke the commands have some issues)
>
> I'm not sure if libvirt-Python provides such API. If the API is not avaiable,
> as libvirt natively use C interface to interact
> with QEMU, do we have to implement it by hand?
>
> Another way to invoke qmp commands is communicate the socket of qemu guest
> agent. I tried it which did not work. Invoking qmp commands with virsh works
> fine.
>
> Sorry if this post should be posted in other libvirt mail lists. Thank you
> very much for feedbacks.
>
> Environment
> - OS: Centos 8.5(x86_64)
> - libvirt 6.0.0
> - QEMU 6.0.0
>
> === qemu guest socket
> $ss | grep libvirt
> /var/lib/libvirt/qemu/channel/target/domain-71-run-win7/org.qemu.guest_agent.0
> 8568953
> /run/libvirt/libvirt-sock
>
> $sudo socat
> unix-connect:/var/lib/libvirt/qemu/channel/target/domain-71-run-win7/org.qemu.guest_agent.0
> ${"execute":"guest-info"}
> // nothing shows
>
There's some synchronization needed first to reset agent's internal state:
https://gitlab.com/libvirt/libvirt/-/blob/master/src/qemu/qemu_agent.c?ref_type=heads#L858
>
> === invoke qmp commands using Python
> import subprocess
>
> cmd = '{"execute": "guest-info"}'
> p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
> result = p.communicate()[0]
>
There's libvirt_qemu module, why not use it?
import libvirt
import libvirt_qemu
conn = libvirt.open("qemu:///system")
dom = conn.lookupByName("fedora")
print(libvirt_qemu.qemuAgentCommand(dom, "{\"execute\":\"guest-info\"}",
libvirt_qemu.VIR_DOMAIN_QEMU_AGENT_COMMAND_DEFAULT, 0))
Or even better - majority of agent's APIs are exposed via libvirt's APIs - why
not use them instead? Are you perhaps running an API that's not wrapped?
Michal