[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] xl: Add "xl uptime" command, a clone of "xm uptime".
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1273820511 -3600 # Node ID b21b9dd9d1e3b4884100eb96c36c663f4463b5a3 # Parent d8afa50f7b11f6d9a6c42c82dd1b21f8b3912025 xl: Add "xl uptime" command, a clone of "xm uptime". Signed-off-by: Yang Hongyang <yanghy@xxxxxxxxxxxxxx> --- tools/libxl/libxl.c | 18 +++++ tools/libxl/libxl.h | 2 tools/libxl/xl_cmdimpl.c | 157 ++++++++++++++++++++++++++++++++++++++++++++++ tools/libxl/xl_cmdimpl.h | 1 tools/libxl/xl_cmdtable.c | 5 + 5 files changed, 183 insertions(+) diff -r d8afa50f7b11 -r b21b9dd9d1e3 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Fri May 14 07:56:43 2010 +0100 +++ b/tools/libxl/libxl.c Fri May 14 08:01:51 2010 +0100 @@ -2807,3 +2807,21 @@ int libxl_send_sysrq(struct libxl_ctx *c return 0; } +uint32_t libxl_vm_get_start_time(struct libxl_ctx *ctx, uint32_t domid) +{ + char *dompath = libxl_xs_get_dompath(ctx, domid); + char *vm_path, *start_time; + + 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; + } + + return strtoul(start_time, NULL, 10); +} + diff -r d8afa50f7b11 -r b21b9dd9d1e3 tools/libxl/libxl.h --- a/tools/libxl/libxl.h Fri May 14 07:56:43 2010 +0100 +++ b/tools/libxl/libxl.h Fri May 14 08:01:51 2010 +0100 @@ -511,5 +511,7 @@ int libxl_send_trigger(struct libxl_ctx int libxl_send_trigger(struct libxl_ctx *ctx, uint32_t domid, char *trigger_name, uint32_t vcpuid); int libxl_send_sysrq(struct libxl_ctx *ctx, uint32_t domid, char sysrq); +uint32_t libxl_vm_get_start_time(struct libxl_ctx *ctx, uint32_t domid); + #endif /* LIBXL_H */ diff -r d8afa50f7b11 -r b21b9dd9d1e3 tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Fri May 14 07:56:43 2010 +0100 +++ b/tools/libxl/xl_cmdimpl.c Fri May 14 08:01:51 2010 +0100 @@ -3510,3 +3510,160 @@ int main_blockdetach(int argc, char **ar } 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 d8afa50f7b11 -r b21b9dd9d1e3 tools/libxl/xl_cmdimpl.h --- a/tools/libxl/xl_cmdimpl.h Fri May 14 07:56:43 2010 +0100 +++ b/tools/libxl/xl_cmdimpl.h Fri May 14 08:01:51 2010 +0100 @@ -48,5 +48,6 @@ int main_blockattach(int argc, char **ar int main_blockattach(int argc, char **argv); int main_blocklist(int argc, char **argv); int main_blockdetach(int argc, char **argv); +int main_uptime(int argc, char **argv); void help(char *command); diff -r d8afa50f7b11 -r b21b9dd9d1e3 tools/libxl/xl_cmdtable.c --- a/tools/libxl/xl_cmdtable.c Fri May 14 07:56:43 2010 +0100 +++ b/tools/libxl/xl_cmdtable.c Fri May 14 08:01:51 2010 +0100 @@ -219,6 +219,11 @@ struct cmd_spec cmd_table[] = { "Destroy a domain's virtual block device", "<Domain> <DevId>", }, + { "uptime", + &main_uptime, + "Print uptime for all/some domains", + "[-s] [Domain]", + }, }; int cmdtable_len = sizeof(cmd_table)/sizeof(struct cmd_spec); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |