mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-22 04:25:18 +00:00
qemu: add set_password and expire_password monitor commands
This commit is contained in:
parent
094c6f4a24
commit
4d099bc06c
1
AUTHORS
1
AUTHORS
@ -143,6 +143,7 @@ Patches have also been contributed by:
|
||||
Roopa Prabhu <roprabhu@cisco.com>
|
||||
Paweł Krześniak <pawel.krzesniak@gmail.com>
|
||||
Kay Schubert <kayegypt@web.de>
|
||||
Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||
|
||||
[....send patches to get your name here....]
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user