mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-21 20:15:17 +00:00
virsh: Expose virDomain{Get,Set}Time
These APIs are exposed under new virsh command 'domtime' which both gets and sets (not at the same time of course :)). Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
0abb369380
commit
222fdbfd2b
@ -1355,6 +1355,116 @@ cmdDomstate(vshControl *ctl, const vshCmd *cmd)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* "domtime" command
|
||||
*/
|
||||
static const vshCmdInfo info_domtime[] = {
|
||||
{.name = "help",
|
||||
.data = N_("domain time")
|
||||
},
|
||||
{.name = "desc",
|
||||
.data = N_("Gets or sets the domain's system time")
|
||||
},
|
||||
{.name = NULL}
|
||||
};
|
||||
|
||||
static const vshCmdOptDef opts_domtime[] = {
|
||||
{.name = "domain",
|
||||
.type = VSH_OT_DATA,
|
||||
.flags = VSH_OFLAG_REQ,
|
||||
.help = N_("domain name, id or uuid")
|
||||
},
|
||||
{.name = "now",
|
||||
.type = VSH_OT_BOOL,
|
||||
.help = N_("set to the time of the host running virsh")
|
||||
},
|
||||
{.name = "pretty",
|
||||
.type = VSH_OT_BOOL,
|
||||
.help = N_("print domain's time in human readable form")
|
||||
},
|
||||
{.name = "sync",
|
||||
.type = VSH_OT_BOOL,
|
||||
.help = N_("instead of setting given time, synchronize from domain's RTC"),
|
||||
},
|
||||
{.name = "time",
|
||||
.type = VSH_OT_INT,
|
||||
.help = N_("time to set")
|
||||
},
|
||||
{.name = NULL}
|
||||
};
|
||||
|
||||
static bool
|
||||
cmdDomTime(vshControl *ctl, const vshCmd *cmd)
|
||||
{
|
||||
virDomainPtr dom;
|
||||
bool ret = false;
|
||||
bool now = vshCommandOptBool(cmd, "now");
|
||||
bool pretty = vshCommandOptBool(cmd, "pretty");
|
||||
bool sync = vshCommandOptBool(cmd, "sync");
|
||||
long long seconds = 0;
|
||||
unsigned int nseconds = 0;
|
||||
unsigned int flags = 0;
|
||||
bool doSet = false;
|
||||
int rv;
|
||||
|
||||
VSH_EXCLUSIVE_OPTIONS("time", "now");
|
||||
VSH_EXCLUSIVE_OPTIONS("time", "sync");
|
||||
VSH_EXCLUSIVE_OPTIONS("now", "sync");
|
||||
|
||||
if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
|
||||
return false;
|
||||
|
||||
rv = vshCommandOptLongLong(cmd, "time", &seconds);
|
||||
|
||||
if (rv < 0) {
|
||||
/* invalid integer format */
|
||||
vshError(ctl, "%s",
|
||||
_("Unable to parse integer parameter to --time."));
|
||||
goto cleanup;
|
||||
} else if (rv > 0) {
|
||||
/* valid integer to set */
|
||||
doSet = true;
|
||||
}
|
||||
|
||||
if (doSet || now || sync) {
|
||||
if (now && ((seconds = time(NULL)) == (time_t) -1)) {
|
||||
vshError(ctl, _("Unable to get current time"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (sync)
|
||||
flags |= VIR_DOMAIN_TIME_SYNC;
|
||||
|
||||
if (virDomainSetTime(dom, seconds, nseconds, flags) < 0)
|
||||
goto cleanup;
|
||||
|
||||
} else {
|
||||
if (virDomainGetTime(dom, &seconds, &nseconds, flags) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (pretty) {
|
||||
char timestr[100];
|
||||
time_t cur_time = seconds;
|
||||
struct tm time_info;
|
||||
|
||||
if (!gmtime_r(&cur_time, &time_info)) {
|
||||
vshError(ctl, _("Unable to format time"));
|
||||
goto cleanup;
|
||||
}
|
||||
strftime(timestr, sizeof(timestr), "%Y-%m-%d %H:%M:%S", &time_info);
|
||||
|
||||
vshPrint(ctl, _("Time: %s"), timestr);
|
||||
} else {
|
||||
vshPrint(ctl, _("Time: %lld"), seconds);
|
||||
}
|
||||
}
|
||||
|
||||
ret = true;
|
||||
cleanup:
|
||||
virDomainFree(dom);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* "list" command
|
||||
*/
|
||||
@ -1911,6 +2021,12 @@ const vshCmdDef domMonitoringCmds[] = {
|
||||
.info = info_domstate,
|
||||
.flags = 0
|
||||
},
|
||||
{.name = "domtime",
|
||||
.handler = cmdDomTime,
|
||||
.opts = opts_domtime,
|
||||
.info = info_domtime,
|
||||
.flags = 0
|
||||
},
|
||||
{.name = "list",
|
||||
.handler = cmdList,
|
||||
.opts = opts_list,
|
||||
|
@ -1017,6 +1017,24 @@ Returns state of an interface to VMM used to control a domain. For
|
||||
states other than "ok" or "error" the command also prints number of
|
||||
seconds elapsed since the control interface entered its current state.
|
||||
|
||||
=item B<domtime> I<domain> { [I<--now>] [I<--pretty>] [I<--sync>]
|
||||
[I<--time> B<time>] }
|
||||
|
||||
Gets or sets the domain's system time. When run without any arguments
|
||||
(but I<domain>), the current domain's system time is printed out. The
|
||||
I<--pretty> modifier can be used to print the time in more human
|
||||
readable form.
|
||||
|
||||
When I<--time> B<time> is specified, the domain's time is
|
||||
not gotten but set instead. The I<--now> modifier acts like if it was
|
||||
an alias for I<--time> B<$now>, which means it sets the time that is
|
||||
currently on the host virsh is running at. In both cases (setting and
|
||||
getting), time is in seconds relative to Epoch of 1970-01-01 in UTC.
|
||||
The I<--sync> modifies the set behavior a bit: The time passed is
|
||||
ignored, but the time to set is read from domain's RTC instead. Please
|
||||
note, that some hypervisors may require a guest agent to be configured
|
||||
in order to get or set the guest time.
|
||||
|
||||
=item B<domxml-from-native> I<format> I<config>
|
||||
|
||||
Convert the file I<config> in the native guest configuration format
|
||||
|
Loading…
x
Reference in New Issue
Block a user