[libvirt] [PATCH 1/2] qemu: add set_password and expire_password monitor commands

Marc-André Lureau marcandre.lureau at gmail.com
Fri Jan 7 19:50:07 UTC 2011


From: Marc-André Lureau <marcandre.lureau at redhat.com>

---
 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




More information about the libvir-list mailing list