lttngtop without arguments starts a local live trace
[lttngtop.git] / src / lttng-session.c
index 29676f31dca8fbaf98bf79add6496f7f9f291327..8b0f6414539eb5b20f52d4c0b0af18f004736e06 100644 (file)
@@ -5,6 +5,7 @@
 #include <stdio.h>
 #include <stdint.h>
 #include <inttypes.h>
+#include <string.h>
 
 #define event_list "lttng_statedump_start,lttng_statedump_end," \
        "lttng_statedump_process_state,lttng_statedump_file_descriptor," \
@@ -32,6 +33,13 @@ int check_or_start_sessiond()
                        ret = -1;
                        goto end;
                }
+               ret = system("sudo -l lttng >/dev/null");
+               if (ret < 0) {
+                       fprintf(stderr, "[error] You are not root and not "
+                                       "allowed by sudo to use lttng\n");
+                       ret = -1;
+                       goto end;
+               }
                sudo = 1;
        }
 
@@ -236,7 +244,30 @@ end:
 }
 
 static
-int enable_event(char *name, int sudo)
+int live_local_session(char *name, int sudo)
+{
+       int ret;
+       char cmd[1024];
+
+       ret = sprintf(cmd, "%s lttng create %s --live 1000000 -U net://localhost >/dev/null",
+                       (sudo) ? "sudo" : " ", name);
+       if (ret < 0) {
+               fprintf(stderr, "Allocating cmd\n");
+               goto end;
+       }
+       ret = (system(cmd));
+       if (ret != 0) {
+               fprintf(stderr, "Error: creating the session\n");
+               ret = -1;
+               goto end;
+       }
+
+end:
+       return ret;
+}
+
+static
+int enable_events(char *name, int sudo)
 {
        int ret;
        char cmd[1024];
@@ -284,7 +315,7 @@ end:
 }
 
 static
-int start(char *name, int sudo)
+int start(char *name, int sudo, int local, int print)
 {
        int ret;
        char cmd[1024];
@@ -303,13 +334,22 @@ int start(char *name, int sudo)
                goto end;
        }
 
-       ret = sprintf(cmd, "%s lttng list|grep %s|cut -d'(' -f2|cut -d ')' -f1",
-                       (sudo) ? "sudo" : " ", name);
+       if (!print)
+               goto end;
+
+       if (local) {
+               ret = sprintf(cmd, "%s lttng list|grep %s|cut -d'(' -f2|cut -d ')' -f1",
+                               (sudo) ? "sudo" : " ", name);
+       } else {
+               ret = sprintf(cmd, "babeltrace -i lttng-live net://localhost|grep %s|cut -d' ' -f1",
+                               name);
+       }
        if (ret < 0) {
                fprintf(stderr, "allocating cmd\n");
                goto end;
        }
-       fprintf(stderr, "Local session started in ");
+       fprintf(stderr, "%s session started : ",
+                       (local) ? "Local" : "Live");
        ret = (system(cmd));
        if (ret != 0) {
                fprintf(stderr, "error: listing the sessions\n");
@@ -322,11 +362,57 @@ end:
 }
 
 static
-int destroy(char *name, int sudo)
+char *live_path(char *name)
+{
+       FILE *fp;
+       int ret;
+       char path[1035];
+       char cmd[1024];
+       char *out = NULL;
+
+       ret = sprintf(cmd, "lttngtop -r net://localhost|grep %s|cut -d' ' -f1",
+                       name);
+       if (ret < 0) {
+               fprintf(stderr, "allocating cmd\n");
+               goto end;
+       }
+
+       fp = popen(cmd, "r");
+       if (fp == NULL) {
+               printf("Failed to run command\n" );
+               goto end;
+       }
+
+       /* Read the output a line at a time - output it. */
+       out = fgets(path, sizeof(path)-1, fp);
+       if (out)
+               out = strdup(path);
+
+       /* close */
+       pclose(fp);
+
+end:
+       return out;
+}
+
+static
+int destroy(char *name)
 {
        int ret;
+       int sudo = 0;
        char cmd[1024];
 
+       if (getuid() != 0) {
+               ret = system("sudo -l lttng >/dev/null");
+               if (ret < 0) {
+                       fprintf(stderr, "[error] You are not root and not "
+                                       "allowed by sudo to use lttng\n");
+                       ret = -1;
+                       goto end;
+               }
+               sudo = 1;
+       }
+
        ret = sprintf(cmd, "%s lttng destroy %s >/dev/null",
                        (sudo) ? "sudo" : " ", name);
        if (ret < 0) {
@@ -369,7 +455,7 @@ int create_local_session()
                goto end_free;
        }
 
-       ret = enable_event(name, sudo);
+       ret = enable_events(name, sudo);
        if (ret < 0) {
                goto end_free;
        }
@@ -379,7 +465,7 @@ int create_local_session()
                goto end_free;
        }
 
-       ret = start(name, sudo);
+       ret = start(name, sudo, 1, 1);
        if (ret < 0) {
                goto end_free;
        }
@@ -390,12 +476,59 @@ end:
        return ret;
 }
 
-int destroy_local_session(char *name, int sudo)
+int destroy_live_local_session(char *name)
 {
-       return destroy(name, sudo);
+       return destroy(name);
 }
 
-/*
-int create_live_local_session();
-int destroy_live_local_session();
-*/
+int create_live_local_session(char **session_path, char **session_name, int print)
+{
+       int ret;
+       char *name;
+       int sudo = 0;
+
+       ret = check_requirements(&sudo);
+
+       name = random_session_name();
+       if (!name) {
+               ret = -1;
+               goto end;
+       }
+
+       ret = check_session_name(name, sudo);
+       if (ret < 0) {
+               goto end_free;
+       }
+
+       ret = live_local_session(name, sudo);
+       if (ret < 0) {
+               goto end_free;
+       }
+
+       ret = enable_events(name, sudo);
+       if (ret < 0) {
+               goto end_free;
+       }
+
+       ret = add_contexts(name, sudo);
+       if (ret < 0) {
+               goto end_free;
+       }
+
+       ret = start(name, sudo, 0, print);
+       if (ret < 0) {
+               goto end_free;
+       }
+
+       if (session_path)
+               *session_path = live_path(name);
+       if (session_name) {
+               *session_name = name;
+               goto end;
+       }
+
+end_free:
+       free(name);
+end:
+       return ret;
+}
This page took 0.035339 seconds and 4 git commands to generate.