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

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

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