mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06: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;
|
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
|
* "list" command
|
||||||
*/
|
*/
|
||||||
@ -1911,6 +2021,12 @@ const vshCmdDef domMonitoringCmds[] = {
|
|||||||
.info = info_domstate,
|
.info = info_domstate,
|
||||||
.flags = 0
|
.flags = 0
|
||||||
},
|
},
|
||||||
|
{.name = "domtime",
|
||||||
|
.handler = cmdDomTime,
|
||||||
|
.opts = opts_domtime,
|
||||||
|
.info = info_domtime,
|
||||||
|
.flags = 0
|
||||||
|
},
|
||||||
{.name = "list",
|
{.name = "list",
|
||||||
.handler = cmdList,
|
.handler = cmdList,
|
||||||
.opts = opts_list,
|
.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
|
states other than "ok" or "error" the command also prints number of
|
||||||
seconds elapsed since the control interface entered its current state.
|
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>
|
=item B<domxml-from-native> I<format> I<config>
|
||||||
|
|
||||||
Convert the file I<config> in the native guest configuration format
|
Convert the file I<config> in the native guest configuration format
|
||||||
|
Loading…
Reference in New Issue
Block a user