# 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
|