[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.