On 21.05.2015 12:33, Umer Khan wrote:
Hi all,
I am new to libvirt, I am trying to execute some commands inside guest
domains from my host machine using libvirt-Python API. So far I have been
able to open up a stream but I am not sure how to send commands on the
stream (through virDomainOpenConsole). After hours of searching through
different forums I found out that there is a utlity called qemu-guest agent
which can solve my problem. But I am not sure how to enable this agent on
host and domain, and how this will be used to communicate to guest domains.
Any help in this matter will be really appreciated.
Thanks
http://wiki.libvirt.org/page/Qemu_guest_agent
After you've set up the guest agent (both in libvirt and in guest), you
can passtrhough an arbitrary guest agent commands too:
http://git.qemu.org/?p=qemu.git;a=blob;f=qga/qapi-schema.json;h=b446dc729...
Although I should warn you that qemu-ga does not allow arbitrary OS
command execution. To do that you'd need to use a console. I think virsh
is a good example on that:
http://libvirt.org/git/?p=libvirt.git;a=blob;f=tools/virsh-console.c;h=f0...
Long story short, you create a new stream @st by calling virStreamNew().
Then you open a console and connect the stream onto it:
virDomainOpenConsole(dom, dev_name, st, flags); then you register two
events into the event loop, one to watch if STDIN is readable (= has
some data to send = somebody typed something), the other to watch if
STDOUT is writable (it can be redirected to a file or whatever, which is
not necessarily always writable). The third event you register is to
handle the stream. This is the idea:
streamEvent() {
if (stream_readable) {
read data from stream into terminal buffer
make STDOUT handler listen to writable event
}
if (stream_writable and stream buffer != empty) {
send data to stream from stream buffer
}
if (terminal buffer == empty)
make stream handler listen to readable event
}
stdin_event() {
read data from STDIN into stream buffer
make stream handler listen to readable | writable event
}
stdout_event() {
write data from terminal buffer to STDOUT
if (terminal buffer == empty)
temporarily disable stdout handler
}
I hope this makes it something clearer.
Michal