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

Reply via email to