Jiri Moskovcak 00e81b4
Signed-off-by: Nikola Pajkovsky <npajkovs@redhat.com>
Jiri Moskovcak 00e81b4
---
Jiri Moskovcak 00e81b4
 src/cli/cli.c           |   31 ++++++++++-
Jiri Moskovcak 00e81b4
 src/cli/report.cpp      |  135 ++++++++++++++++++++++++++++++++++++++++-------
Jiri Moskovcak 00e81b4
 src/cli/report.h        |    4 +-
Jiri Moskovcak 00e81b4
 src/plugins/Makefile.am |    4 +-
Jiri Moskovcak 00e81b4
 4 files changed, 148 insertions(+), 26 deletions(-)
Jiri Moskovcak 00e81b4

Jiri Moskovcak 00e81b4
diff --git a/src/cli/cli.c b/src/cli/cli.c
Jiri Moskovcak 00e81b4
index 0c895a7..4e0042f 100644
Jiri Moskovcak 00e81b4
--- a/src/cli/cli.c
Jiri Moskovcak 00e81b4
+++ b/src/cli/cli.c
Jiri Moskovcak 00e81b4
@@ -360,6 +360,9 @@ int main(int argc, char** argv)
Jiri Moskovcak 00e81b4
         print_usage_and_die(argv[0]);
Jiri Moskovcak 00e81b4
     }
Jiri Moskovcak 00e81b4
 
Jiri Moskovcak 00e81b4
+    /* Get settings */
Jiri Moskovcak 00e81b4
+    load_event_config_data();
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
     /* Do the selected operation. */
Jiri Moskovcak 00e81b4
     int exitcode = 0;
Jiri Moskovcak 00e81b4
     switch (op)
Jiri Moskovcak 00e81b4
@@ -409,15 +412,37 @@ int main(int argc, char** argv)
Jiri Moskovcak 00e81b4
         }
Jiri Moskovcak 00e81b4
         case OPT_INFO:
Jiri Moskovcak 00e81b4
         {
Jiri Moskovcak 00e81b4
-            if (run_analyze_event(dump_dir_name) != 0)
Jiri Moskovcak 00e81b4
-                return 1;
Jiri Moskovcak 00e81b4
-
Jiri Moskovcak 00e81b4
             /* Load crash_data from (possibly updated by analyze) dump dir */
Jiri Moskovcak 00e81b4
             struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
Jiri Moskovcak 00e81b4
             if (!dd)
Jiri Moskovcak 00e81b4
                 return -1;
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+            char *analyze_events_as_lines = list_possible_events(dd, NULL, "analyze");
Jiri Moskovcak 00e81b4
+            dd_close(dd);
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+            if (analyze_events_as_lines && *analyze_events_as_lines)
Jiri Moskovcak 00e81b4
+            {
Jiri Moskovcak 00e81b4
+                GList *list_analyze_events = str_to_glist(analyze_events_as_lines, '\n');
Jiri Moskovcak 00e81b4
+                free(analyze_events_as_lines);
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+                char *event = select_event_option(list_analyze_events);
Jiri Moskovcak 00e81b4
+                list_free_with_free(list_analyze_events);
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+                int analyzer_result = run_analyze_event(dump_dir_name, event);
Jiri Moskovcak 00e81b4
+                free(event);
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+                if (analyzer_result != 0)
Jiri Moskovcak 00e81b4
+                    return 1;
Jiri Moskovcak 00e81b4
+            }
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+            /* Load crash_data from (possibly updated by analyze) dump dir */
Jiri Moskovcak 00e81b4
+            dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
Jiri Moskovcak 00e81b4
+            if (!dd)
Jiri Moskovcak 00e81b4
+                return -1;
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
             crash_data_t *crash_data = create_crash_data_from_dump_dir(dd);
Jiri Moskovcak 00e81b4
             dd_close(dd);
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
             add_to_crash_data_ext(crash_data, CD_DUMPDIR, dump_dir_name,
Jiri Moskovcak 00e81b4
                                   CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE);
Jiri Moskovcak 00e81b4
 
Jiri Moskovcak 00e81b4
diff --git a/src/cli/report.cpp b/src/cli/report.cpp
Jiri Moskovcak 00e81b4
index da37bea..7181fe3 100644
Jiri Moskovcak 00e81b4
--- a/src/cli/report.cpp
Jiri Moskovcak 00e81b4
+++ b/src/cli/report.cpp
Jiri Moskovcak 00e81b4
@@ -15,9 +15,9 @@
Jiri Moskovcak 00e81b4
     with this program; if not, write to the Free Software Foundation, Inc.,
Jiri Moskovcak 00e81b4
     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Jiri Moskovcak 00e81b4
 */
Jiri Moskovcak 00e81b4
-#include "report.h"
Jiri Moskovcak 00e81b4
-#include "run-command.h"
Jiri Moskovcak 00e81b4
 #include "abrtlib.h"
Jiri Moskovcak 00e81b4
+#include "run-command.h"
Jiri Moskovcak 00e81b4
+#include "report.h"
Jiri Moskovcak 00e81b4
 
Jiri Moskovcak 00e81b4
 /* Field separator for the crash report file that is edited by user. */
Jiri Moskovcak 00e81b4
 #define FIELD_SEP "%----"
Jiri Moskovcak 00e81b4
@@ -553,7 +553,8 @@ static int run_events(const char *dump_dir_name,
Jiri Moskovcak 00e81b4
         int r = run_event_on_dir_name(run_state, dump_dir_name, event.c_str());
Jiri Moskovcak 00e81b4
         if (r == 0 && run_state->children_count == 0)
Jiri Moskovcak 00e81b4
         {
Jiri Moskovcak 00e81b4
-            l_state.last_line = xasprintf("Error: no processing is specified for event '%s'", event.c_str());
Jiri Moskovcak 00e81b4
+            l_state.last_line = xasprintf("Error: no processing is specified for event '%s'",
Jiri Moskovcak 00e81b4
+                                          event.c_str());
Jiri Moskovcak 00e81b4
             r = -1;
Jiri Moskovcak 00e81b4
         }
Jiri Moskovcak 00e81b4
         if (r == 0)
Jiri Moskovcak 00e81b4
@@ -585,31 +586,128 @@ static char *do_log(char *log_line, void *param)
Jiri Moskovcak 00e81b4
     log("%s", log_line);
Jiri Moskovcak 00e81b4
     return log_line;
Jiri Moskovcak 00e81b4
 }
Jiri Moskovcak 00e81b4
-int run_analyze_event(const char *dump_dir_name)
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+int run_analyze_event(const char *dump_dir_name, const char *analyzer)
Jiri Moskovcak 00e81b4
 {
Jiri Moskovcak 00e81b4
     VERB2 log("run_analyze_event('%s')", dump_dir_name);
Jiri Moskovcak 00e81b4
 
Jiri Moskovcak 00e81b4
     struct run_event_state *run_state = new_run_event_state();
Jiri Moskovcak 00e81b4
     run_state->logging_callback = do_log;
Jiri Moskovcak 00e81b4
-    int res = run_event_on_dir_name(run_state, dump_dir_name, "analyze_LocalGDB");
Jiri Moskovcak 00e81b4
+    int res = run_event_on_dir_name(run_state, dump_dir_name, analyzer);
Jiri Moskovcak 00e81b4
     free_run_event_state(run_state);
Jiri Moskovcak 00e81b4
     return res;
Jiri Moskovcak 00e81b4
 }
Jiri Moskovcak 00e81b4
 
Jiri Moskovcak 00e81b4
+/* show even description? */
Jiri Moskovcak 00e81b4
+char *select_event_option(GList *list_options)
Jiri Moskovcak 00e81b4
+{
Jiri Moskovcak 00e81b4
+    if (!list_options)
Jiri Moskovcak 00e81b4
+        return NULL;
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+    unsigned count = g_list_length(list_options) - 1;
Jiri Moskovcak 00e81b4
+    if (!count)
Jiri Moskovcak 00e81b4
+        return NULL;
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+    int pos = -1;
Jiri Moskovcak 00e81b4
+    fprintf(stdout, _("Select how you would like to analyze the problem:\n"));
Jiri Moskovcak 00e81b4
+    for (GList *li = list_options; li; li = li->next)
Jiri Moskovcak 00e81b4
+    {
Jiri Moskovcak 00e81b4
+        char *opt = (char*)li->data;
Jiri Moskovcak 00e81b4
+        event_config_t *config = get_event_config(opt);
Jiri Moskovcak 00e81b4
+        if (config)
Jiri Moskovcak 00e81b4
+        {
Jiri Moskovcak 00e81b4
+            ++pos;
Jiri Moskovcak 00e81b4
+            printf(" %i) %s\n", pos, config->screen_name);
Jiri Moskovcak 00e81b4
+        }
Jiri Moskovcak 00e81b4
+    }
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+    unsigned picked;
Jiri Moskovcak 00e81b4
+    unsigned ii;
Jiri Moskovcak 00e81b4
+    for (ii = 0; ii < 3; ++ii)
Jiri Moskovcak 00e81b4
+    {
Jiri Moskovcak 00e81b4
+        fprintf(stdout, _("Choose option [0 - %u]: "), count);
Jiri Moskovcak 00e81b4
+        fflush(NULL);
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+        char answer[16];
Jiri Moskovcak 00e81b4
+        if (!fgets(answer, sizeof(answer), stdin))
Jiri Moskovcak 00e81b4
+            continue;
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+        answer[strlen(answer) - 1] = '\0';
Jiri Moskovcak 00e81b4
+        if (!*answer)
Jiri Moskovcak 00e81b4
+            continue;
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+        picked = xatou(answer);
Jiri Moskovcak 00e81b4
+        if (picked > count)
Jiri Moskovcak 00e81b4
+        {
Jiri Moskovcak 00e81b4
+            fprintf(stdout, _("You have chosen number out of range"));
Jiri Moskovcak 00e81b4
+            continue;
Jiri Moskovcak 00e81b4
+        }
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+        break;
Jiri Moskovcak 00e81b4
+    }
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+    if (ii == 3)
Jiri Moskovcak 00e81b4
+        error_msg_and_die(_("Invalid input, program exiting..."));
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+    GList *choosen = g_list_nth(list_options, picked);
Jiri Moskovcak 00e81b4
+    return xstrdup((char*)choosen->data);
Jiri Moskovcak 00e81b4
+}
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+GList *str_to_glist(char *str, int delim)
Jiri Moskovcak 00e81b4
+{
Jiri Moskovcak 00e81b4
+    GList *list = NULL;
Jiri Moskovcak 00e81b4
+    while (*str)
Jiri Moskovcak 00e81b4
+    {
Jiri Moskovcak 00e81b4
+        char *end = strchrnul(str, delim);
Jiri Moskovcak 00e81b4
+        char *tmp = xstrndup(str, end - str);
Jiri Moskovcak 00e81b4
+        if (*tmp)
Jiri Moskovcak 00e81b4
+            list = g_list_append(list, tmp);
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+        str = end;
Jiri Moskovcak 00e81b4
+        if (!*str)
Jiri Moskovcak 00e81b4
+            break;
Jiri Moskovcak 00e81b4
+        str++;
Jiri Moskovcak 00e81b4
+    }
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+    if (!list && !g_list_length(list))
Jiri Moskovcak 00e81b4
+        return NULL;
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+    return list;
Jiri Moskovcak 00e81b4
+}
Jiri Moskovcak 00e81b4
 
Jiri Moskovcak 00e81b4
 /* Report the crash */
Jiri Moskovcak 00e81b4
 int report(const char *dump_dir_name, int flags)
Jiri Moskovcak 00e81b4
 {
Jiri Moskovcak 00e81b4
-    if (run_analyze_event(dump_dir_name) != 0)
Jiri Moskovcak 00e81b4
-	return 1;
Jiri Moskovcak 00e81b4
-
Jiri Moskovcak 00e81b4
     /* Load crash_data from (possibly updated by analyze) dump dir */
Jiri Moskovcak 00e81b4
     struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
Jiri Moskovcak 00e81b4
     if (!dd)
Jiri Moskovcak 00e81b4
 	return -1;
Jiri Moskovcak 00e81b4
 
Jiri Moskovcak 00e81b4
+    char *analyze_events_as_lines = list_possible_events(dd, NULL, "analyze");
Jiri Moskovcak 00e81b4
+    dd_close(dd);
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+    if (analyze_events_as_lines && *analyze_events_as_lines)
Jiri Moskovcak 00e81b4
+    {
Jiri Moskovcak 00e81b4
+        GList *list_analyze_events = str_to_glist(analyze_events_as_lines, '\n');
Jiri Moskovcak 00e81b4
+        free(analyze_events_as_lines);
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+        char *event = select_event_option(list_analyze_events);
Jiri Moskovcak 00e81b4
+        list_free_with_free(list_analyze_events);
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+        int analyzer_result = run_analyze_event(dump_dir_name, event);
Jiri Moskovcak 00e81b4
+        free(event);
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+        if (analyzer_result != 0)
Jiri Moskovcak 00e81b4
+            return 1;
Jiri Moskovcak 00e81b4
+    }
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+    /* Load crash_data from (possibly updated by analyze) dump dir */
Jiri Moskovcak 00e81b4
+    dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
Jiri Moskovcak 00e81b4
+    if (!dd)
Jiri Moskovcak 00e81b4
+	return -1;
Jiri Moskovcak 00e81b4
+
Jiri Moskovcak 00e81b4
+    char *report_events_as_lines = list_possible_events(dd, NULL, "report");
Jiri Moskovcak 00e81b4
     crash_data_t *crash_data = create_crash_data_from_dump_dir(dd);
Jiri Moskovcak 00e81b4
-    char *events_as_lines = list_possible_events(dd, NULL, "");
Jiri Moskovcak 00e81b4
     dd_close(dd);
Jiri Moskovcak 00e81b4
 
Jiri Moskovcak 00e81b4
     if (!(flags & CLI_REPORT_BATCH))
Jiri Moskovcak 00e81b4
@@ -620,7 +718,7 @@ int report(const char *dump_dir_name, int flags)
Jiri Moskovcak 00e81b4
         if (result != 0)
Jiri Moskovcak 00e81b4
         {
Jiri Moskovcak 00e81b4
             free_crash_data(crash_data);
Jiri Moskovcak 00e81b4
-            free(events_as_lines);
Jiri Moskovcak 00e81b4
+            free(report_events_as_lines);
Jiri Moskovcak 00e81b4
             return 1;
Jiri Moskovcak 00e81b4
         }
Jiri Moskovcak 00e81b4
         /* Save comment, backtrace */
Jiri Moskovcak 00e81b4
@@ -639,26 +737,24 @@ int report(const char *dump_dir_name, int flags)
Jiri Moskovcak 00e81b4
     }
Jiri Moskovcak 00e81b4
 
Jiri Moskovcak 00e81b4
     /* Get possible reporters associated with this particular crash */
Jiri Moskovcak 00e81b4
+    /* TODO: npajkovs: remove this annoying c++ vector_string_t */
Jiri Moskovcak 00e81b4
     vector_string_t report_events;
Jiri Moskovcak 00e81b4
-    if (events_as_lines)
Jiri Moskovcak 00e81b4
+    if (report_events_as_lines && *report_events_as_lines)
Jiri Moskovcak 00e81b4
     {
Jiri Moskovcak 00e81b4
-        char *events = events_as_lines;
Jiri Moskovcak 00e81b4
+        char *events = report_events_as_lines;
Jiri Moskovcak 00e81b4
         while (*events)
Jiri Moskovcak 00e81b4
         {
Jiri Moskovcak 00e81b4
             char *end = strchrnul(events, '\n');
Jiri Moskovcak 00e81b4
-            if (strncmp(events, "report", 6) == 0
Jiri Moskovcak 00e81b4
-             && (events[6] == '\0' || events[6] == '_')
Jiri Moskovcak 00e81b4
-            ) {
Jiri Moskovcak 00e81b4
-                char *tmp = xstrndup(events, end - events);
Jiri Moskovcak 00e81b4
-                report_events.push_back(tmp);
Jiri Moskovcak 00e81b4
-                free(tmp);
Jiri Moskovcak 00e81b4
-            }
Jiri Moskovcak 00e81b4
+            char *tmp = xstrndup(events, end - events);
Jiri Moskovcak 00e81b4
+            report_events.push_back(tmp);
Jiri Moskovcak 00e81b4
+            free(tmp);
Jiri Moskovcak 00e81b4
             events = end;
Jiri Moskovcak 00e81b4
             if (!*events)
Jiri Moskovcak 00e81b4
                 break;
Jiri Moskovcak 00e81b4
             events++;
Jiri Moskovcak 00e81b4
         }
Jiri Moskovcak 00e81b4
     }
Jiri Moskovcak 00e81b4
+    free(report_events_as_lines);
Jiri Moskovcak 00e81b4
 
Jiri Moskovcak 00e81b4
     /* Get settings */
Jiri Moskovcak 00e81b4
     load_event_config_data();
Jiri Moskovcak 00e81b4
@@ -723,6 +819,5 @@ int report(const char *dump_dir_name, int flags)
Jiri Moskovcak 00e81b4
 
Jiri Moskovcak 00e81b4
     printf(_("Crash reported via %d report events (%d errors)\n"), plugins, errors);
Jiri Moskovcak 00e81b4
     free_crash_data(crash_data);
Jiri Moskovcak 00e81b4
-    free(events_as_lines);
Jiri Moskovcak 00e81b4
     return errors;
Jiri Moskovcak 00e81b4
 }
Jiri Moskovcak 00e81b4
diff --git a/src/cli/report.h b/src/cli/report.h
Jiri Moskovcak 00e81b4
index 58b8c25..a393784 100644
Jiri Moskovcak 00e81b4
--- a/src/cli/report.h
Jiri Moskovcak 00e81b4
+++ b/src/cli/report.h
Jiri Moskovcak 00e81b4
@@ -22,7 +22,9 @@
Jiri Moskovcak 00e81b4
 extern "C" {
Jiri Moskovcak 00e81b4
 #endif
Jiri Moskovcak 00e81b4
 
Jiri Moskovcak 00e81b4
-int run_analyze_event(const char *dump_dir_name);
Jiri Moskovcak 00e81b4
+int run_analyze_event(const char *dump_dir_name, const char *analyzer);
Jiri Moskovcak 00e81b4
+char *select_event_option(GList *list_options);
Jiri Moskovcak 00e81b4
+GList *str_to_glist(char *str, int delim);
Jiri Moskovcak 00e81b4
 
Jiri Moskovcak 00e81b4
 /* Report the crash */
Jiri Moskovcak 00e81b4
 enum {
Jiri Moskovcak 00e81b4
diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am
Jiri Moskovcak 00e81b4
index 5344cdb..7468188 100644
Jiri Moskovcak 00e81b4
--- a/src/plugins/Makefile.am
Jiri Moskovcak 00e81b4
+++ b/src/plugins/Makefile.am
Jiri Moskovcak 00e81b4
@@ -65,8 +65,8 @@ $(DESTDIR)/$(DEBUG_INFO_DIR):
Jiri Moskovcak 00e81b4
 	$(mkdir_p) '$@'
Jiri Moskovcak 00e81b4
 
Jiri Moskovcak 00e81b4
 install-data-hook: $(DESTDIR)/$(DEBUG_INFO_DIR)
Jiri Moskovcak 00e81b4
-	$(LN_S) analyze_RetraceServer.xml $(DESTDIR)$(eventsdir)/reanalyze_RetraceServer.xml
Jiri Moskovcak 00e81b4
-	$(LN_S) analyze_LocalGDB.xml $(DESTDIR)$(eventsdir)/reanalyze_LocalGDB.xml
Jiri Moskovcak 00e81b4
+	$(LN_S) -f analyze_RetraceServer.xml $(DESTDIR)$(eventsdir)/reanalyze_RetraceServer.xml
Jiri Moskovcak 00e81b4
+	$(LN_S) -f analyze_LocalGDB.xml $(DESTDIR)$(eventsdir)/reanalyze_LocalGDB.xml
Jiri Moskovcak 00e81b4
 
Jiri Moskovcak 00e81b4
 abrt_dump_oops_SOURCES = \
Jiri Moskovcak 00e81b4
     abrt-dump-oops.c
Jiri Moskovcak 00e81b4
-- 
Jiri Moskovcak 00e81b4
1.7.1
Jiri Moskovcak 00e81b4

Jiri Moskovcak 00e81b4
_______________________________________________
Jiri Moskovcak 00e81b4
Crash-catcher mailing list
Jiri Moskovcak 00e81b4
Crash-catcher@lists.fedorahosted.org
Jiri Moskovcak 00e81b4
https://fedorahosted.org/mailman/listinfo/crash-catcher