From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41963) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YxVRr-0004JO-9S for qemu-devel@nongnu.org; Wed, 27 May 2015 03:08:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YxVRq-00056v-0Z for qemu-devel@nongnu.org; Wed, 27 May 2015 03:08:19 -0400 Received: from relay.parallels.com ([195.214.232.42]:46429) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YxVRp-00056j-P2 for qemu-devel@nongnu.org; Wed, 27 May 2015 03:08:17 -0400 Received: from [10.67.48.55] (helo=MSK-EXCH1.sw.swsoft.com) by relay.parallels.com with esmtps (TLSv1.2:AES256-SHA:256) (Exim 4.85) (envelope-from ) id 1YxVRp-0002ZW-2U for qemu-devel@nongnu.org; Wed, 27 May 2015 10:08:17 +0300 Message-ID: <55656D57.2050702@openvz.org> Date: Wed, 27 May 2015 10:08:07 +0300 From: "Denis V. Lunev" MIME-Version: 1.0 References: <1432187369-28020-1-git-send-email-den@openvz.org> In-Reply-To: <1432187369-28020-1-git-send-email-den@openvz.org> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v3 0/6] qemu: guest agent: implement guest-exec command List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Olga Krishtal , qemu-devel@nongnu.org On 21/05/15 08:49, Denis V. Lunev wrote: > These patches for guest-agent add the functionality to execute commands on > a guest UNIX machine. > > These patches add the following interfaces: > > guest-pipe-open > guest-exec > guest-exec-status > > With these interfaces it's possible to: > > * Open an anonymous pipe and work with it as with a file using already > implemented interfaces guest-file-{read,write,flush,close}. > > * Execute a binary or a script on a guest machine. > We can pass arbitrary arguments and environment to a new child process. > > * Pass redirected IO from/to stdin, stdout, stderr from a child process to a > local file or an anonymous pipe. > > * Check the status of a child process, get its exit status if it exited or get > signal number if it was killed. > > We plan to add support for Windows in the near future using the same interfaces > we introduce here. > > Example of usage: > > {"execute": "guest-pipe-open", "arguments":{"mode": "r"}} > {'return': 1000} > > {"execute":"guest-exec", "arguments":{ "path": "id", "params": ["user"], > "env": ["MYENV=myvalue"], "handle_stdout": 1000 }}' > {"return": 2636} > > {"execute": "guest-exec-status", "arguments": {"pid": 2636}} > {"return":{"exit":0,"handle_stderr":-1,"handle_stdin":-1,"handle_stdout":1000,"signal":-1}} > > {"execute": "guest-file-read", "arguments": {"handle": 1000, "count":128}} > {"return":{"count":58,"buf-b64":"dWlk...","eof":true}} > > {"execute": "guest-file-close", "arguments": {"handle": 1000}} > {"return":{}} > > > These patches are based on the patches proposed by Michael Roth in 2011: > http://lists.gnu.org/archive/html/qemu-devel/2011-12/msg00722.html > > We made several modifications to the interfaces proposed by Michael to simplify > their usage and we also added several new functions: > > * Arguments to an executable file are passed as an array of strings. > > Before that we had to pass parameters like this: > 'params': [ {'param': '-b'}, {'param': '-n1'} ] > > Now we may pass them just as an array of strings: > 'params': [ '-b', '-n1' ] > > * Environment can be passed to a child process. > > "env": ["MYENV=myvalue"] > > * Removed "detach" argument from "guest-exec" - it never waits for a child > process to signal. With this change it's possible to return just PID from > "guest-exec", a user must call "guest-exec-status" to get the status of a child. > > * Removed "wait" argument from "guest-exec-status" - waiting for a child process > to signal is dangerous, because it may block the whole qemu-ga. Instead, the > command polls just once a status of a child. > > * "guest-exec-status" returns exit status of a child process or a signal number, > in case a process was killed. > > * Simplified the command "guest-pipe-open" - the way how it stores the pipe > fd's. No additional logic is needed about which end of pipe should be closed > with "guest-file-close". This way we avoid modifying the interface of the > existing "guest-file-close". > > In the conversation about the original patches there was a suggestion to merge > "path" and "params" into one single list. But we didn't do so, because having > separate "path" is similar to exec*() family functions in UNIX. That way it > looks more consistent. > > Changes from v2: > - return code of commands changed to dictionary > - ported to current HEAD > - new way for moving pipe to non-blocking state (universal) > > Changes from v1: > - Windows version of the patchset is added > - SIGPIPE processing is added for Unix version of the patchset > - added guest_exec_file_busy() to prevent GuestFileHandle* object from being > deleted in case it's used in guest-exec command. > > Signed-off-by: Olga Krishtal > Signed-off-by: Denis V. Lunev > > P.S. Michael, this is a working version and could we consider it for merging > into 2.4? If you still want to use universal GLIB code, we could > re-write this later using standard refactoring way. > ping