From: Marc-Andrà Lureau <marcandre.lureau@xxxxxxxxxx> --- 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 ++++ 6 files changed, 223 insertions(+), 0 deletions(-) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 85d0d0f..4830e98 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 41b3135..6b0320d 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 ec6b720..ff7c0c2 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 c78ee24..e4e1ec5 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 64ec57b..5dcb443 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 983f402..f4c863f 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); -- 1.7.3.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list