mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06: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>
|
Roopa Prabhu <roprabhu@cisco.com>
|
||||||
Paweł Krześniak <pawel.krzesniak@gmail.com>
|
Paweł Krześniak <pawel.krzesniak@gmail.com>
|
||||||
Kay Schubert <kayegypt@web.de>
|
Kay Schubert <kayegypt@web.de>
|
||||||
|
Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
|
||||||
[....send patches to get your name here....]
|
[....send patches to get your name here....]
|
||||||
|
|
||||||
|
@ -1097,6 +1097,83 @@ int qemuMonitorSetVNCPassword(qemuMonitorPtr mon,
|
|||||||
return ret;
|
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,
|
int qemuMonitorSetBalloon(qemuMonitorPtr mon,
|
||||||
unsigned long newmem)
|
unsigned long newmem)
|
||||||
|
@ -195,6 +195,13 @@ int qemuMonitorGetBlockExtent(qemuMonitorPtr mon,
|
|||||||
|
|
||||||
int qemuMonitorSetVNCPassword(qemuMonitorPtr mon,
|
int qemuMonitorSetVNCPassword(qemuMonitorPtr mon,
|
||||||
const char *password);
|
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,
|
int qemuMonitorSetBalloon(qemuMonitorPtr mon,
|
||||||
unsigned long newmem);
|
unsigned long newmem);
|
||||||
int qemuMonitorSetCPU(qemuMonitorPtr mon, int cpu, int online);
|
int qemuMonitorSetCPU(qemuMonitorPtr mon, int cpu, int online);
|
||||||
|
@ -1265,6 +1265,62 @@ int qemuMonitorJSONSetVNCPassword(qemuMonitorPtr mon,
|
|||||||
return ret;
|
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
|
* Returns: 0 if balloon not supported, +1 if balloon adjust worked
|
||||||
* or -1 on failure
|
* or -1 on failure
|
||||||
|
@ -63,6 +63,13 @@ int qemuMonitorJSONGetBlockExtent(qemuMonitorPtr mon,
|
|||||||
|
|
||||||
int qemuMonitorJSONSetVNCPassword(qemuMonitorPtr mon,
|
int qemuMonitorJSONSetVNCPassword(qemuMonitorPtr mon,
|
||||||
const char *password);
|
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,
|
int qemuMonitorJSONSetBalloon(qemuMonitorPtr mon,
|
||||||
unsigned long newmem);
|
unsigned long newmem);
|
||||||
int qemuMonitorJSONSetCPU(qemuMonitorPtr mon, int cpu, int online);
|
int qemuMonitorJSONSetCPU(qemuMonitorPtr mon, int cpu, int online);
|
||||||
|
@ -768,6 +768,75 @@ int qemuMonitorTextSetVNCPassword(qemuMonitorPtr mon,
|
|||||||
return 0;
|
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
|
* Returns: 0 if balloon not supported, +1 if balloon adjust worked
|
||||||
* or -1 on failure
|
* or -1 on failure
|
||||||
|
@ -61,6 +61,13 @@ int qemuMonitorTextGetBlockExtent(qemuMonitorPtr mon,
|
|||||||
|
|
||||||
int qemuMonitorTextSetVNCPassword(qemuMonitorPtr mon,
|
int qemuMonitorTextSetVNCPassword(qemuMonitorPtr mon,
|
||||||
const char *password);
|
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,
|
int qemuMonitorTextSetBalloon(qemuMonitorPtr mon,
|
||||||
unsigned long newmem);
|
unsigned long newmem);
|
||||||
int qemuMonitorTextSetCPU(qemuMonitorPtr mon, int cpu, int online);
|
int qemuMonitorTextSetCPU(qemuMonitorPtr mon, int cpu, int online);
|
||||||
|
Loading…
Reference in New Issue
Block a user