[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2]xl: Add "xl uptime" command
v1->v2: 1.libxl_get_start_time() is apply to a vm so use libxl_vm_get_start_time instead. 2.replace unsigned long with uint32_t. =========================================================================== Add "xl uptime" command, a clone of "xm uptime". Signed-off-by: Yang Hongyang <yanghy@xxxxxxxxxxxxxx> diff -r d77a88f938c6 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue May 11 14:05:28 2010 +0100 +++ b/tools/libxl/libxl.c Fri May 14 02:27:59 2010 +0800 @@ -2629,3 +2629,23 @@ return rc; } + +uint32_t libxl_vm_get_start_time(struct libxl_ctx *ctx, uint32_t domid) +{ + char *dompath = libxl_xs_get_dompath(ctx, domid); + unsigned long s_time = 0; + char *start_time = NULL; + char *vm_path = NULL; + + vm_path = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/vm", dompath)); + start_time = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/start_time", vm_path)); + if (start_time == NULL) { + XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, -1, + "Can't get start time of domain '%d'", domid); + return -1; + } + s_time = strtoul(start_time, NULL, 10); + + return s_time; +} + diff -r d77a88f938c6 tools/libxl/libxl.h --- a/tools/libxl/libxl.h Tue May 11 14:05:28 2010 +0100 +++ b/tools/libxl/libxl.h Fri May 14 02:27:59 2010 +0800 @@ -481,5 +481,6 @@ struct libxl_sched_credit *scinfo); int libxl_send_trigger(struct libxl_ctx *ctx, uint32_t domid, char *trigger_name, uint32_t vcpuid); +uint32_t libxl_vm_get_start_time(struct libxl_ctx *ctx, uint32_t domid); #endif /* LIBXL_H */ diff -r d77a88f938c6 tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Tue May 11 14:05:28 2010 +0100 +++ b/tools/libxl/xl_cmdimpl.c Fri May 14 02:27:59 2010 +0800 @@ -3058,3 +3058,160 @@ exit(0); } + +static char *uptime_to_string(unsigned long time, int short_mode) +{ + int sec, min, hour, day; + char *time_string; + + day = (int)(time / 86400); + time -= (day * 86400); + hour = (int)(time / 3600); + time -= (hour * 3600); + min = (int)(time / 60); + time -= (min * 60); + sec = time; + + if (short_mode) + if (day > 1) + asprintf(&time_string, "%d days, %2d:%02d", day, hour, min); + else if (day == 1) + asprintf(&time_string, "%d day, %2d:%02d", day, hour, min); + else + asprintf(&time_string, "%2d:%02d", hour, min); + else + if (day > 1) + asprintf(&time_string, "%d days, %2d:%02d:%02d", day, hour, min, sec); + else if (day == 1) + asprintf(&time_string, "%d day, %2d:%02d:%02d", day, hour, min, sec); + else + asprintf(&time_string, "%2d:%02d:%02d", hour, min, sec); + + return time_string; +} + +static char *current_time_to_string(time_t now) +{ + char now_str[100]; + struct tm *tmp; + + tmp = localtime(&now); + if (tmp == NULL) { + fprintf(stderr, "Get localtime error"); + exit(-1); + } + if (strftime(now_str, sizeof(now_str), "%H:%M:%S", tmp) == 0) { + fprintf(stderr, "strftime returned 0"); + exit(-1); + } + return strdup(now_str); +} + +static void print_dom0_uptime(int short_mode, time_t now) +{ + int fd; + char buf[512]; + uint32_t uptime = 0; + + fd = open("/proc/uptime", 'r'); + if (fd == -1) + goto err; + + if (read(fd, buf, sizeof(buf)) == -1) { + close(fd); + goto err; + } + close(fd); + + strtok(buf, " "); + uptime = strtoul(buf, NULL, 10); + + if (short_mode) + printf(" %s up %s, %s (%d)\n", current_time_to_string(now), + uptime_to_string(uptime, 1), libxl_domid_to_name(&ctx, 0), 0); + else + printf("%-33s %4d %s\n", libxl_domid_to_name(&ctx, 0), + 0, uptime_to_string(uptime, 0)); + + return; +err: + fprintf(stderr, "Can not get Dom0 uptime.\n"); + exit(-1); +} + +static void print_domU_uptime(uint32_t domuid, int short_mode, time_t now) +{ + uint32_t s_time = 0; + uint32_t uptime = 0; + + s_time = libxl_vm_get_start_time(&ctx, domuid); + if (s_time == -1) + return; + uptime = now - s_time; + if (short_mode) + printf(" %s up %s, %s (%d)\n", current_time_to_string(now), + uptime_to_string(uptime, 1), + libxl_domid_to_name(&ctx, domuid), + domuid); + else + printf("%-33s %4d %s\n", libxl_domid_to_name(&ctx, domuid), + domuid, uptime_to_string(uptime, 0)); +} + +static void print_uptime(int short_mode, uint32_t doms[], int nb_doms) +{ + struct libxl_vminfo *info; + time_t now; + int nb_vm, i; + + now = time(NULL); + + if (!short_mode) + printf("%-33s %4s %s\n", "Name", "ID", "Uptime"); + + if (nb_doms == 0) { + print_dom0_uptime(short_mode, now); + info = libxl_list_vm(&ctx, &nb_vm); + for (i = 0; i < nb_vm; i++) + print_domU_uptime(info[i].domid, short_mode, now); + } else { + for (i = 0; i < nb_doms; i++) { + if (doms[i] == 0) + print_dom0_uptime(short_mode, now); + else + print_domU_uptime(doms[i], short_mode, now); + } + } +} + +int main_uptime(int argc, char **argv) +{ + char *dom = NULL; + int short_mode = 0; + uint32_t domains[100]; + int nb_doms = 0; + int opt; + + while ((opt = getopt(argc, argv, "hs")) != -1) { + switch (opt) { + case 's': + short_mode = 1; + break; + case 'h': + help("uptime"); + exit(0); + default: + fprintf(stderr, "option `%c' not supported.\n", opt); + break; + } + } + + for (;(dom = argv[optind]) != NULL; nb_doms++,optind++) { + find_domain(dom); + domains[nb_doms] = domid; + } + + print_uptime(short_mode, domains, nb_doms); + + exit(0); +} diff -r d77a88f938c6 tools/libxl/xl_cmdimpl.h --- a/tools/libxl/xl_cmdimpl.h Tue May 11 14:05:28 2010 +0100 +++ b/tools/libxl/xl_cmdimpl.h Fri May 14 02:27:59 2010 +0800 @@ -39,5 +39,6 @@ int main_domname(int argc, char **argv); int main_rename(int argc, char **argv); int main_trigger(int argc, char **argv); +int main_uptime(int argc, char **argv); void help(char *command); diff -r d77a88f938c6 tools/libxl/xl_cmdtable.c --- a/tools/libxl/xl_cmdtable.c Tue May 11 14:05:28 2010 +0100 +++ b/tools/libxl/xl_cmdtable.c Fri May 14 02:27:59 2010 +0800 @@ -172,6 +172,11 @@ "Send a trigger to a domain", "<Domain> <nmi|reset|init|power|sleep> [<VCPU>]", }, + { "uptime", + &main_uptime, + "Print uptime for all/some domains", + "[-s] [Domain]", + }, }; int cmdtable_len = sizeof(cmd_table)/sizeof(struct cmd_spec); -- Regards Yang Hongyang _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |