From: Michael Roth <mdroth@linux.vnet.ibm.com>
To: "Daniel P. Berrange" <berrange@redhat.com>
Cc: bazulay@redhat.com, aliguori@us.ibm.com, qemu-devel@nongnu.org,
agl@us.ibm.com
Subject: Re: [Qemu-devel] [PATCH 0/2] [RFC] qemu-ga: add support for guest command execution
Date: Tue, 06 Dec 2011 10:43:42 -0600 [thread overview]
Message-ID: <4EDE463E.2000304@linux.vnet.ibm.com> (raw)
In-Reply-To: <20111206144417.GA8039@redhat.com>
On 12/06/2011 08:44 AM, Daniel P. Berrange wrote:
> On Tue, Dec 06, 2011 at 08:34:06AM -0600, Michael Roth wrote:
>> The code is still in rough shape, but while we're on the topic of guest agents
>> I wanted to put out a working example of how exec functionality can be added
>> to qemu-ga to provide a mechansim for building arbitrarilly high-level
>> interfaces.
>>
>> The hope is that by allowing qemu-ga to execute commands in the guest, paired
>> with file read/write access, we can instrument a guest "on the fly" to support
>> any type of hyperviser functionality, and do so without dramatically enlarging
>> the role qemu-ga plays as a small, QEMU-specific agent that is tightly
>> integrated with QEMU/QMP/libvirt.
>>
>> These patches add the following interfaces:
>>
>> guest-file-open-pipe
>> guest-exec
>> guest-exec-status
>>
>> The guest-file-open-pipe interface is analagous to the existing guest-file-open
>> interface (it might be best to roll it into it actually): it returns a handle
>> that can be handled via the existing guest-file-{read,write,flush,close}
>> interface. Internally it creates a FIFO pair that we can use to associate
>> handles to the stdin/stdout/stderr of a guest-exec spawned process. We can also
>> also use them to redirect output into other processes, giving us the basic
>> tools to build a basic shell (or a full-blown one if we add TTY support) using
>> a single qemu-ga.
>>
>> Theoretically we can even deploy other agents, including session-level agents,
>> and communicate with them via these same handles. Thus, ovirt could deploy and
>> run an agent via qemu-ga, Spice could deploy vdagent, etc. Since the interface
>> is somewhat tedious, I'm working on a wrapper script to try out some of
>> these scenarios, but a basic use case using the raw QMP interface is included
>> below.
>>
>> Any thoughts/comments on this approach are appreciated.
>>
>> EXAMPLE USAGE (execute `top -b -n1`):
>>
>> {'execute': 'guest-file-open-pipe'}
>> {'return': 6}
>>
>> {'execute': 'guest-exec', \
>> 'arguments': {'detach': True, \
>> 'handle_stdout': 6, \
>> 'params': [{'param': '-b'}, \
>> {'param': '-n1'}], \
>> 'path': 'top'}}
>
> This feels like a rather verbose way of specifying
> the ARGV. Why not just allow
>
> {'execute': 'guest-exec', \
> 'arguments': {'detach': True, \
> 'handle_stdout': 6, \
> 'params': ['-b', '-n1'], \
> 'path': 'top'}}
>
> Or even
>
>
> {'execute': 'guest-exec', \
> 'arguments': {'detach': True, \
> 'handle_stdout': 6, \
> 'argv': ['top', '-b', '-n1']}} \
>
Agreed, this would look way nicer and is what I was shooting for
initially. Unfortunately, the QAPI-generated QMP marshalling code, and
the visitor interfaces it uses, expects lists to be of structured types.
We might be able to special-case it for int and char* arrays though and
open-code it though...
The problem I ran into when I looked at it though is that the QMP
request is a QObject at that point that's contained inside a Visitor. So
to manipulate it we'd have to extract the QList and manipulate it
outside the visitor, which would be difficult since the Visitor is using
a stack to manage it's traversal of the QObject based on the visitor
calls we make, so it's difficult to pull it out of there...
Although, maybe we could just add a qmp_input_vistor_stack_top() that
gives us the top of the stack, then call it at the appropriate point in
the marshalling code and key into it to get qobj{'argv'} and whatnot.
It's kinda hacky, but it's QMP-specific, and useful, so it might be
worth it.
Alternatively, we could introduce another Visitor interface for handling
lists of int64_t and char*.
So maybe it's not so bad, I'll look into it more.
> and just use the first element of argv as the binary to
> execute. Also you might need to set env variables for
> some tools, so we'd want
>
> {'execute': 'guest-exec', \
> 'arguments': {'detach': True, \
> 'handle_stdout': 6, \
> 'argv': ['top', '-b', '-n1'], \
> 'env' : ['TMPDIR=/wibble']}}
>
> and perhaps also you might want to run as a non-root
> user, so allow a username/groupname ?
>
Good idea, this would open up a lot of potential use cases (X
session/display management, copy/paste, etc).
> Regards,
> Daniel
next prev parent reply other threads:[~2011-12-06 16:47 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-12-06 14:34 [Qemu-devel] [PATCH 0/2] [RFC] qemu-ga: add support for guest command execution Michael Roth
2011-12-06 14:34 ` [Qemu-devel] [PATCH 1/2] guest agent: add guest-file-open-pipe Michael Roth
2011-12-06 14:34 ` [Qemu-devel] [PATCH 2/2] guest agent: add guest-exec and guest-exec-status interfaces Michael Roth
2011-12-06 14:44 ` [Qemu-devel] [PATCH 0/2] [RFC] qemu-ga: add support for guest command execution Daniel P. Berrange
2011-12-06 16:43 ` Michael Roth [this message]
2011-12-18 12:56 ` Alon Levy
-- strict thread matches above, loose matches on Subject: below --
2013-10-07 14:06 srinath reddy
2013-10-08 21:12 ` Michael Roth
2013-10-08 21:19 ` Michael Roth
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4EDE463E.2000304@linux.vnet.ibm.com \
--to=mdroth@linux.vnet.ibm.com \
--cc=agl@us.ibm.com \
--cc=aliguori@us.ibm.com \
--cc=bazulay@redhat.com \
--cc=berrange@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.