From 4d099bc06c80f1f84025715ebf913c7a2d25b64c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Mon, 10 Jan 2011 12:12:32 +0100 Subject: [PATCH] qemu: add set_password and expire_password monitor commands --- AUTHORS | 1 + src/qemu/qemu_monitor.c | 77 ++++++++++++++++++++++++++++++++++++ src/qemu/qemu_monitor.h | 7 ++++ src/qemu/qemu_monitor_json.c | 56 ++++++++++++++++++++++++++ src/qemu/qemu_monitor_json.h | 7 ++++ src/qemu/qemu_monitor_text.c | 69 ++++++++++++++++++++++++++++++++ src/qemu/qemu_monitor_text.h | 7 ++++ 7 files changed, 224 insertions(+) diff --git a/AUTHORS b/AUTHORS index 721b8f827c..c704a41626 100644 --- a/AUTHORS +++ b/AUTHORS @@ -143,6 +143,7 @@ Patches have also been contributed by: Roopa Prabhu Paweł Krześniak Kay Schubert + Marc-André Lureau [....send patches to get your name here....] diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 055e7cee70..302673320b 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1097,6 +1097,83 @@ int qemuMonitorSetVNCPassword(qemuMonitorPtr mon, return ret; } +static const char* qemuMonitorTypeToProtocol(int type) +{ + switch (type) { + case VIR_DOMAIN_GRAPHICS_TYPE_VNC: + return "vnc"; + case VIR_DOMAIN_GRAPHICS_TYPE_SPICE: + return "spice"; + default: + qemuReportError(VIR_ERR_INVALID_ARG, + _("unsupported protocol type %s"), + virDomainGraphicsTypeToString(type)); + return NULL; + } +} + +/* Returns -2 if not supported with this monitor connection */ +int qemuMonitorSetPassword(qemuMonitorPtr mon, + int type, + const char *password, + const char *action_if_connected) +{ + const char *protocol = qemuMonitorTypeToProtocol(type); + int ret; + + if (!protocol) + return -1; + + DEBUG("mon=%p, protocol=%s, password=%p, action_if_connected=%s", + mon, protocol, password, action_if_connected); + + if (!mon) { + qemuReportError(VIR_ERR_INVALID_ARG, "%s", + _("monitor must not be NULL")); + return -1; + } + + if (!password) + password = ""; + + if (!action_if_connected) + action_if_connected = "keep"; + + if (mon->json) + ret = qemuMonitorJSONSetPassword(mon, protocol, password, action_if_connected); + else + ret = qemuMonitorTextSetPassword(mon, protocol, password, action_if_connected); + return ret; +} + +int qemuMonitorExpirePassword(qemuMonitorPtr mon, + int type, + const char *expire_time) +{ + const char *protocol = qemuMonitorTypeToProtocol(type); + int ret; + + if (!protocol) + return -1; + + DEBUG("mon=%p, protocol=%s, expire_time=%s", + mon, protocol, expire_time); + + if (!mon) { + qemuReportError(VIR_ERR_INVALID_ARG, "%s", + _("monitor must not be NULL")); + return -1; + } + + if (!expire_time) + expire_time = "now"; + + if (mon->json) + ret = qemuMonitorJSONExpirePassword(mon, protocol, expire_time); + else + ret = qemuMonitorTextExpirePassword(mon, protocol, expire_time); + return ret; +} int qemuMonitorSetBalloon(qemuMonitorPtr mon, unsigned long newmem) diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 718ea135bf..92c550bc18 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -195,6 +195,13 @@ int qemuMonitorGetBlockExtent(qemuMonitorPtr mon, int qemuMonitorSetVNCPassword(qemuMonitorPtr mon, const char *password); +int qemuMonitorSetPassword(qemuMonitorPtr mon, + int type, + const char *password, + const char *action_if_connected); +int qemuMonitorExpirePassword(qemuMonitorPtr mon, + int type, + const char *expire_time); int qemuMonitorSetBalloon(qemuMonitorPtr mon, unsigned long newmem); int qemuMonitorSetCPU(qemuMonitorPtr mon, int cpu, int online); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 7877731af8..7387089aff 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -1265,6 +1265,62 @@ int qemuMonitorJSONSetVNCPassword(qemuMonitorPtr mon, return ret; } +/* Returns -1 on error, -2 if not supported */ +int qemuMonitorJSONSetPassword(qemuMonitorPtr mon, + const char *protocol, + const char *password, + const char *action_if_connected) +{ + int ret; + virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("set_password", + "s:protocol", protocol, + "s:password", password, + "s:connected", action_if_connected, + NULL); + virJSONValuePtr reply = NULL; + if (!cmd) + return -1; + + ret = qemuMonitorJSONCommand(mon, cmd, &reply); + + if (ret == 0) { + if (qemuMonitorJSONHasError(reply, "CommandNotFound")) { + ret = -2; + goto cleanup; + } + + ret = qemuMonitorJSONCheckError(cmd, reply); + } + +cleanup: + virJSONValueFree(cmd); + virJSONValueFree(reply); + return ret; +} + +int qemuMonitorJSONExpirePassword(qemuMonitorPtr mon, + const char *protocol, + const char *expire_time) +{ + int ret; + virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("expire_password", + "s:protocol", protocol, + "s:time", expire_time, + NULL); + virJSONValuePtr reply = NULL; + if (!cmd) + return -1; + + ret = qemuMonitorJSONCommand(mon, cmd, &reply); + + if (ret == 0) + ret = qemuMonitorJSONCheckError(cmd, reply); + + virJSONValueFree(cmd); + virJSONValueFree(reply); + return ret; +} + /* * Returns: 0 if balloon not supported, +1 if balloon adjust worked * or -1 on failure diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 8d96146321..4c47f109db 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -63,6 +63,13 @@ int qemuMonitorJSONGetBlockExtent(qemuMonitorPtr mon, int qemuMonitorJSONSetVNCPassword(qemuMonitorPtr mon, const char *password); +int qemuMonitorJSONSetPassword(qemuMonitorPtr mon, + const char *protocol, + const char *password, + const char *action_if_connected); +int qemuMonitorJSONExpirePassword(qemuMonitorPtr mon, + const char *protocol, + const char *expire_time); int qemuMonitorJSONSetBalloon(qemuMonitorPtr mon, unsigned long newmem); int qemuMonitorJSONSetCPU(qemuMonitorPtr mon, int cpu, int online); diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c index 11a9391510..291d958135 100644 --- a/src/qemu/qemu_monitor_text.c +++ b/src/qemu/qemu_monitor_text.c @@ -768,6 +768,75 @@ int qemuMonitorTextSetVNCPassword(qemuMonitorPtr mon, return 0; } +/* Returns -1 on error, -2 if not supported */ +int qemuMonitorTextSetPassword(qemuMonitorPtr mon, + const char *protocol, + const char *password, + const char *action_if_connected) +{ + char *cmd = NULL; + char *reply = NULL; + int ret = -1; + + if (virAsprintf(&cmd, "set_password %s \"%s\" %s", + protocol, password, action_if_connected) < 0) { + virReportOOMError(); + goto cleanup; + } + + if (qemuMonitorCommand(mon, cmd, &reply) < 0) { + qemuReportError(VIR_ERR_OPERATION_FAILED, + "%s", _("setting password failed")); + goto cleanup; + } + + if (strstr(reply, "unknown command:")) { + ret = -2; + goto cleanup; + } + + ret = 0; + +cleanup: + VIR_FREE(reply); + VIR_FREE(cmd); + return ret; +} + +int qemuMonitorTextExpirePassword(qemuMonitorPtr mon, + const char *protocol, + const char *expire_time) +{ + char *cmd = NULL; + char *reply = NULL; + int ret = -1; + + if (virAsprintf(&cmd, "expire_password %s %s", + protocol, expire_time) < 0) { + virReportOOMError(); + goto cleanup; + } + + if (qemuMonitorCommand(mon, cmd, &reply) < 0) { + qemuReportError(VIR_ERR_OPERATION_FAILED, + "%s", _("expiring password failed")); + goto cleanup; + } + + if (strstr(reply, "unknown command:")) { + qemuReportError(VIR_ERR_NO_SUPPORT, + _("expiring password not supported by this qemu: %s"), reply); + goto cleanup; + } + + ret = 0; + +cleanup: + VIR_FREE(reply); + VIR_FREE(cmd); + return ret; +} + /* * Returns: 0 if balloon not supported, +1 if balloon adjust worked * or -1 on failure diff --git a/src/qemu/qemu_monitor_text.h b/src/qemu/qemu_monitor_text.h index 57d6e9b24a..b29dbcc846 100644 --- a/src/qemu/qemu_monitor_text.h +++ b/src/qemu/qemu_monitor_text.h @@ -61,6 +61,13 @@ int qemuMonitorTextGetBlockExtent(qemuMonitorPtr mon, int qemuMonitorTextSetVNCPassword(qemuMonitorPtr mon, const char *password); +int qemuMonitorTextSetPassword(qemuMonitorPtr mon, + const char *protocol, + const char *password, + const char *action_if_connected); +int qemuMonitorTextExpirePassword(qemuMonitorPtr mon, + const char *protocol, + const char *expire_time); int qemuMonitorTextSetBalloon(qemuMonitorPtr mon, unsigned long newmem); int qemuMonitorTextSetCPU(qemuMonitorPtr mon, int cpu, int online);