Mr. Daniel.
I rewrote the patch for libvirt-0.9.13 to move some codes to
libvirt-qemu as you suggested.
But I am sorry for unusing git, because my joining company is very
elegant for network security. So, I have an only way via http to get
libvirt's source code...
Regards
MATSUDA Daiki
virsh # help
....
QEMU Guest Agent (help keyword 'guestagent'):
qemu-agent-command Qemu Guest Agent Command
Virsh itself (help keyword 'virsh'):
cd change the current directory
echo echo arguments
exit quit this interactive terminal
help print help
pwd print the current directory
quit quit this interactive terminal
virsh # help qemu-agent-command
NAME
qemu-agent-command - Qemu Guest Agent Command
SYNOPSIS
qemu-agent-command <domain> {[--cmd] <string>}...
DESCRIPTION
Qemu Guest Agent Command
OPTIONS
[--domain] <string> domain name, id or uuid
[--cmd] <string> command
virsh # qemu-agent-command RHEL58_64 guest-info
{"return":{"version":"1.1.50","supported_commands":[{"enabled":true,"name":"guest-network-get-interfaces"},{"enabled":true,"name":"guest-suspend-hybrid"},{"enabled":true,"name":"guest-suspend-ram"},{"enabled":true,"name":"guest-suspend-disk"},{"enabled":true,"name":"guest-fsfreeze-thaw"},{"enabled":true,"name":"guest-fsfreeze-freeze"},{"enabled":true,"name":"guest-fsfreeze-status"},{"enabled":true,"name":"guest-file-flush"},{"enabled":true,"name":"guest-file-seek"},{"enabled":true,"name":"guest-file-write"},{"enabled":true,"name":"guest-file-read"},{"enabled":true,"name":"guest-file-close"},{"enabled":true,"name":"guest-file-open"},{"enabled":true,"name":"guest-shutdown"},{"enabled":true,"name":"guest-info"},{"enabled":true,"name":"guest-ping"},{"enabled":true,"name":"guest-sync"},{"enabled":true,"name":"guest-sync-delimited"}]}}
On Fri, Jun 29, 2012 at 01:58:05PM +0900, MATSUDA, Daiki wrote:
> diff -uNrp libvirt-0.9.13.orig/daemon/remote.c libvirt-0.9.13/daemon/remote.c
> --- libvirt-0.9.13.orig/daemon/remote.c 2012-06-25 16:06:18.000000000 +0900
> +++ libvirt-0.9.13/daemon/remote.c 2012-06-29 12:50:03.752806682 +0900
> @@ -3923,6 +3923,42 @@ cleanup:
> return rv;
> }
>
> +
> +static int
> +remoteDispatchDomainQemuAgentCommand(virNetServerPtr server ATTRIBUTE_UNUSED,
> + virNetServerClientPtr client ATTRIBUTE_UNUSED,
> + virNetMessagePtr msg ATTRIBUTE_UNUSED,
> + virNetMessageErrorPtr rerr,
> + remote_domain_qemu_agent_command_args *args,
> + remote_domain_qemu_agent_command_ret *ret)
> +{
> + virDomainPtr dom = NULL;
> + int rv = -1;
> + struct daemonClientPrivate *priv =
> + virNetServerClientGetPrivateData(client);
> +
> + if (!priv->conn) {
> + virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not
open"));
> + goto cleanup;
> + }
> +
> + if (!(dom = get_nonnull_domain(priv->conn, args->dom)))
> + goto cleanup;
> +
> + if (virDomainQemuAgentCommand(dom, args->cmd, &ret->result,
args->flags) <0) {
> + virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("Guest Agent
Error"));
> + goto cleanup;
> + }
> +
> + rv = 0;
> +cleanup:
> + if (rv < 0)
> + virNetMessageSaveError(rerr);
> + if (dom)
> + virDomainFree(dom);
> + return rv;
> +}
> +
> /*----- Helpers. -----*/
>
> /* get_nonnull_domain and get_nonnull_network turn an on-wire
> diff -uNrp libvirt-0.9.13.orig/daemon/remote_dispatch.h
libvirt-0.9.13/daemon/remote_dispatch.h
> --- libvirt-0.9.13.orig/daemon/remote_dispatch.h 2012-06-25 19:48:08.000000000 +0900
> +++ libvirt-0.9.13/daemon/remote_dispatch.h 2012-06-29 10:21:21.460454579 +0900
> @@ -12889,6 +12889,28 @@ static int remoteDispatchSupportsFeature
>
>
>
> +static int remoteDispatchDomainQemuAgentCommand(
> + virNetServerPtr server,
> + virNetServerClientPtr client,
> + virNetMessagePtr msg,
> + virNetMessageErrorPtr rerr,
> + remote_domain_qemu_agent_command_args *args,
> + remote_domain_qemu_agent_command_ret *ret);
> +static int remoteDispatchDomainQemuAgentCommandHelper(
> + virNetServerPtr server,
> + virNetServerClientPtr client,
> + virNetMessagePtr msg,
> + virNetMessageErrorPtr rerr,
> + void *args,
> + void *ret)
> +{
> + VIR_DEBUG("server=%p client=%p msg=%p rerr=%p args=%p ret=%p", server,
client, msg, rerr, args, ret);
> + return remoteDispatchDomainQemuAgentCommand(server, client, msg, rerr, args,
ret);
> +}
> +/* remoteDispatchDomainQemuAgentCommand body has to be implemented manually */
> +
> +
> +
> virNetServerProgramProc remoteProcs[] = {
> { /* Unused 0 */
> NULL,
> @@ -15374,5 +15396,14 @@ virNetServerProgramProc remoteProcs[] =
> true,
> 1
> },
> +{ /* Method DomainQemuAgentCommand => 276 */
> + remoteDispatchDomainQemuAgentCommandHelper,
> + sizeof(remote_domain_qemu_agent_command_args),
> + (xdrproc_t)xdr_remote_qemu_agent_command_args,
> + sizeof(remote_domain_qemu_agent_command_ret),
> + (xdrproc_t)remote_domain_qemu_agent_command_ret,
> + true,
> + 0
> +},
> };
> size_t remoteNProcs = ARRAY_CARDINALITY(remoteProcs);
This is an auto-generated file. Instead of doing a diff against
two unpacked tar.gz archives, developer against a git checkout,
and use GIT to produce the patch without the auto-generated
cruft.
> diff -uNrp libvirt-0.9.13.orig/include/libvirt/libvirt.h.in
libvirt-0.9.13/include/libvirt/libvirt.h.in
> --- libvirt-0.9.13.orig/include/libvirt/libvirt.h.in 2012-06-25 21:42:32.000000000
+0900
> +++ libvirt-0.9.13/include/libvirt/libvirt.h.in 2012-06-29 11:22:38.113455058 +0900
> @@ -4132,6 +4132,9 @@ typedef struct _virTypedParameter virMem
> */
> typedef virMemoryParameter *virMemoryParameterPtr;
>
> +int virDomainQemuAgentCommand(virDomainPtr domain, const char *cmd,
> + char **result, unsigned int flags);
> +
> #ifdef __cplusplus
> }
> #endif
This should be in libvirt-qemu.h
> diff -uNrp libvirt-0.9.13.orig/src/libvirt.c libvirt-0.9.13/src/libvirt.c
> --- libvirt-0.9.13.orig/src/libvirt.c 2012-06-28 12:05:04.000000000 +0900
> +++ libvirt-0.9.13/src/libvirt.c 2012-06-29 12:51:51.336454508 +0900
> @@ -18973,3 +18973,44 @@ error:
> virDispatchError(dom->conn);
> return -1;
> }
> +
> +/**
> + * virDomainQemuAgentCommand:
> + * @domain: a domain object
> + * @cmd: execution command on domain's guest agent
> + * @result: returning strings
> + * @flags: execution flags
> + *
> + * Provide a list of Guest Agent's support command.
> + * Returns 0 if succeeded, -1 in failing.
> + */
> +int
> +virDomainQemuAgentCommand(virDomainPtr domain,
> + const char *cmd,
> + char **result,
> + unsigned int flags)
> +{
> + virConnectPtr conn;
> + int ret = -1;
> +
> + if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
> + virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
> + return ret;
> + }
> +
> + conn = domain->conn;
> +
> + if (conn->driver->domainQemuAgentCommand) {
> + ret = conn->driver->domainQemuAgentCommand(domain, cmd, result,
flags);
> + if (ret < 0)
> + goto error;
> + return ret;
> + }
> +
> + virLibDomainError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
> +
> +error:
> + /* Copy to connection error object for back compatability */
> + virDispatchError(domain->conn);
> + return ret;
> +}
Should be in libvirt-qemu.c
> diff -uNrp libvirt-0.9.13.orig/src/libvirt_public.syms
libvirt-0.9.13/src/libvirt_public.syms
> --- libvirt-0.9.13.orig/src/libvirt_public.syms 2012-06-25 16:06:18.000000000 +0900
> +++ libvirt-0.9.13/src/libvirt_public.syms 2012-06-29 09:07:00.357580129 +0900
> @@ -542,6 +542,7 @@ LIBVIRT_0.9.13 {
> virDomainSnapshotIsCurrent;
> virDomainSnapshotListAllChildren;
> virDomainSnapshotRef;
> + virDomainQemuAgentCommand;
> } LIBVIRT_0.9.11;
>
Should be in libvirt_qemu.syms
> static virNetworkDriver network_driver = {
> diff -uNrp libvirt-0.9.13.orig/src/remote/remote_protocol.x
libvirt-0.9.13/src/remote/remote_protocol.x
> --- libvirt-0.9.13.orig/src/remote/remote_protocol.x 2012-06-25 16:06:18.000000000
+0900
> +++ libvirt-0.9.13/src/remote/remote_protocol.x 2012-06-29 12:55:43.752580212 +0900
> @@ -2513,6 +2513,16 @@ struct remote_connect_list_all_domains_r
> unsigned int ret;
> };
>
> +struct remote_domain_qemu_agent_command_args {
> + remote_nonnull_domain dom;
> + remote_nonnull_string cmd;
> + u_int flags;
> +};
> +
> +struct remote_domain_qemu_agent_command_ret {
> + remote_nonnull_string result;
> +};
> +
>
> /*----- Protocol. -----*/
>
> @@ -2838,7 +2848,8 @@ enum remote_procedure {
> REMOTE_PROC_DOMAIN_SNAPSHOT_HAS_METADATA = 272, /* autogen autogen */
> REMOTE_PROC_CONNECT_LIST_ALL_DOMAINS = 273, /* skipgen skipgen priority:high
*/
> REMOTE_PROC_DOMAIN_LIST_ALL_SNAPSHOTS = 274, /* skipgen skipgen priority:high
*/
> - REMOTE_PROC_DOMAIN_SNAPSHOT_LIST_ALL_CHILDREN = 275 /* skipgen skipgen
priority:high */
> + REMOTE_PROC_DOMAIN_SNAPSHOT_LIST_ALL_CHILDREN = 275, /* skipgen skipgen
priority:high */
> + REMOTE_PROC_DOMAIN_QEMU_AGENT_COMMAND = 276 /* skipgen skipgen */
>
> /*
> * Notice how the entries are grouped in sets of 10 ?
This should bein qemu_protocol.x
Regards,
Daniel