- the event takes care about asking user for permission to do something
  which needs user's permission (upload coredump, run local analysis)
- the event starts the local analysis if the remote analysis fails or if
  the remote analysis was rejected by user

Signed-off-by: Jakub Filak <[email protected]>
---
 abrt.spec.in                             |   2 +
 po/POTFILES.in                           |   2 +
 src/plugins/Makefile.am                  |   9 +++
 src/plugins/abrt-action-analyze-smart.in | 117 +++++++++++++++++++++++++++++++
 src/plugins/analyze_Smart.xml.in         |  41 +++++++++++
 src/plugins/ccpp_event.conf              |   5 +-
 6 files changed, 175 insertions(+), 1 deletion(-)
 create mode 100644 src/plugins/abrt-action-analyze-smart.in
 create mode 100644 src/plugins/analyze_Smart.xml.in

diff --git a/abrt.spec.in b/abrt.spec.in
index a1c00ba..ebb81a0 100644
--- a/abrt.spec.in
+++ b/abrt.spec.in
@@ -467,12 +467,14 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor 
&>/dev/null || :
 %{_bindir}/abrt-handle-upload
 %{_bindir}/abrt-action-save-package-data
 %{_bindir}/abrt-watch-log
+%{_bindir}/abrt-action-analyze-smart
 %config(noreplace) %{_sysconfdir}/%{name}/abrt.conf
 %config(noreplace) %{_sysconfdir}/%{name}/abrt-action-save-package-data.conf
 %config(noreplace) %{_sysconfdir}/%{name}/gpg_keys
 %config(noreplace) %{_sysconfdir}/libreport/events.d/abrt_event.conf
 %config(noreplace) %{_sysconfdir}/libreport/events.d/smart_event.conf
 %config(noreplace) %{_sysconfdir}/libreport/events.d/smolt_event.conf
+%config(noreplace) %{_sysconfdir}/libreport/events/analyze_Smart.xml
 %dir %attr(0755, abrt, abrt) %{_localstatedir}/spool/%{name}
 %dir %attr(0700, abrt, abrt) %{_localstatedir}/spool/%{name}-upload
 # abrtd runs as root
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 3bd7a1b..095aef2 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -17,6 +17,7 @@ src/plugins/abrt-action-analyze-backtrace.c
 src/plugins/abrt-action-analyze-c.c
 src/plugins/abrt-action-analyze-oops.c
 src/plugins/abrt-action-analyze-python.c
+src/plugins/abrt-action-analyze-smart.in
 src/plugins/abrt-action-analyze-vmcore.in
 src/plugins/abrt-action-generate-backtrace.c
 src/plugins/abrt-action-generate-core-backtrace.c
@@ -35,6 +36,7 @@ src/plugins/bodhi.c
 
 src/cli/abrt-cli.c
 src/cli/list.c
+src/plugins/analyze_Smart.xml.in
 src/plugins/analyze_VMcore.xml.in
 src/plugins/collect_GConf.xml.in
 src/plugins/collect_Smolt.xml.in
diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am
index 675b1a7..7d1f523 100644
--- a/src/plugins/Makefile.am
+++ b/src/plugins/Makefile.am
@@ -3,6 +3,7 @@
 bin_SCRIPTS = \
     abrt-action-install-debuginfo \
     abrt-action-analyze-core \
+    abrt-action-analyze-smart \
     abrt-action-analyze-vmcore \
     abrt-action-list-dsos
 
@@ -30,6 +31,7 @@ eventsdir = $(EVENTS_DIR)
 dist_events_DATA = \
     analyze_LocalGDB.xml \
     analyze_RetraceServer.xml \
+    analyze_Smart.xml \
     analyze_VMcore.xml \
     collect_xsession_errors.xml \
     collect_Smolt.xml \
@@ -59,6 +61,7 @@ PYTHON_FILES = \
     abrt-action-install-debuginfo.in \
     abrt-action-list-dsos \
     abrt-action-analyze-core \
+    abrt-action-analyze-smart.in \
     abrt-action-analyze-vmcore.in
 
 EXTRA_DIST = \
@@ -70,6 +73,7 @@ EXTRA_DIST = \
     collect_vimrc_system.xml.in \
     analyze_LocalGDB.xml.in \
     analyze_RetraceServer.xml.in \
+    analyze_Smart.xml.in \
     analyze_VMcore.xml.in \
     abrt-action-analyze-vmcore \
     https-utils.h \
@@ -266,3 +270,8 @@ abrt_bodhi_SOURCES = \
 
 
 DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@
+
+
+abrt-action-analyze-smart: abrt-action-analyze-smart.in
+       sed -e s,\@libexecdir\@,$(libexecdir),g \
+        $< >$@
diff --git a/src/plugins/abrt-action-analyze-smart.in 
b/src/plugins/abrt-action-analyze-smart.in
new file mode 100644
index 0000000..399b349
--- /dev/null
+++ b/src/plugins/abrt-action-analyze-smart.in
@@ -0,0 +1,117 @@
+#!/usr/bin/env python
+"""This module provides a function for executing of disjunction of analyze
+events.
+"""
+
+import sys
+import os
+from argparse import ArgumentParser
+import locale
+import gettext
+from subprocess import Popen
+
+
+GETTEXT_PROGNAME = "abrt-action-analyze-smart"
+
+_ = gettext.lgettext
+
+def ask_yes_no_save_result(option_name, question):
+    """Asks user for answer to yes/no/yesforever question.
+
+    Keyword arguments:
+    option_name -- a key for configuration to store the yesforever answer
+    question -- a displayed question
+
+    Returns True if user's answer is yes or yes forever; otherwise returns
+    False.
+
+    """
+
+    sys.stdout.write("ASK_YES_NO_YESFOREVER {0} {1}\n"
+                        .format(option_name, question))
+    sys.stdout.flush()
+    return sys.stdin.readline()  == "yes\n"
+
+def handle_event(event_name, problem_dir):
+    """Helper function handling a single event
+
+    Keyword arguments:
+    envet_name -- a name of handled event
+    problem_dir -- a path to problem directory
+
+    Returns True if the handled event was successfully executed; otherwise
+    returns False.
+
+    """
+
+    executable = "@libexecdir@/abrt-handle-event"
+    try:
+        proc = Popen([executable, "-e", event_name, "--", problem_dir])
+        return proc.wait() == 0
+    except OSError as e:
+        sys.stderr.write("Can't run '{0}': {1}\n".format(executable, e))
+        sys.exit(1)
+
+
+def run_analyze_smart(problem_dir):
+    """Runs analyze_RetraceServer event or analyze_LocalGB event.
+
+    At first runs analyze_RetraceServer. If user dismisses
+    analyze_RetraceServer event or if the run fails the analyze_LocalGDB event
+    will be run.
+
+    Keyword arguments:
+    problem_dir -- a path to problem directory
+
+    Returns True if any of the events was successfuly performed; otherwise
+    returns False.
+
+    """
+
+    analyzed = False
+    allowed = ask_yes_no_save_result("abrt_analyze_smart_ask_upload_coredump",
+                _("Ok to upload core dump? (It may contain sensitive data). "\
+                  "If your answer is 'No', a stack trace will be generated 
localy. "\
+                  "(It may download a huge amount of data)."))
+
+    if allowed:
+        analyzed = handle_event("analyze_RetraceServer", problem_dir)
+
+    # temporary helper variables for better readability
+    option = "abrt_analyze_smart_ask_perform_local_analysis"
+    question = _("Do you want to generate a stack trace localy? "\
+                 "(It may download a huge amount of data but reporting "\
+                 "can't continue without stack trace).")
+
+    # run local GDB if the retrace event was dismissed
+    # or if the retrace event failed and user gave us permission to run local 
GDB
+    if not allowed or (not analyzed and ask_yes_no_save_result(option, 
question)):
+        analyzed = handle_event("analyze_LocalGDB", problem_dir)
+
+    return analyzed
+
+
+if __name__ == "__main__":
+    try:
+        locale.setlocale(locale.LC_ALL, "")
+    except locale.Error:
+        os.environ['LC_ALL'] = 'C'
+        locale.setlocale(locale.LC_ALL, "")
+
+    # Defeat "AttributeError: 'module' object has no attribute 'nl_langinfo'"
+    try:
+        gettext.bind_textdomain_codeset(GETTEXT_PROGNAME,
+                                        locale.nl_langinfo(locale.CODESET))
+    except AttributeError:
+        pass
+
+    gettext.bindtextdomain(GETTEXT_PROGNAME, '/usr/share/locale')
+    gettext.textdomain(GETTEXT_PROGNAME)
+
+    CMDARGS = ArgumentParser(description = _('Smartly runs analyze events'))
+    CMDARGS.add_argument('-d', '--problem-dir', type=str,
+                         default='.', help=_('Problem directory'))
+
+    OPTIONS = CMDARGS.parse_args()
+
+    sys.exit(0 if run_analyze_smart(vars(OPTIONS)['problem_dir']) else 1)
diff --git a/src/plugins/analyze_Smart.xml.in b/src/plugins/analyze_Smart.xml.in
new file mode 100644
index 0000000..2d4aa3b
--- /dev/null
+++ b/src/plugins/analyze_Smart.xml.in
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<event>
+    <name>Smart Analyze Event</name>
+    <_description>Send core dump to remote retrace server for analysis or 
perform local analysis if the remote analysis fails</_description>
+    <_long-description>Uploads coredump to a server, which generates backtrace 
and returns it. If user doens't want to upload his coredump to anywhere the 
event performs local analysis. Local analysis is run event if remote analysis 
fails.
+    Pros: no need for debuginfo downloads. Retrace server's database of 
debuginfos is more complete. Retrace server may generate better backtraces.
+    Cons: coredump you upload contains all the data from the crashed program, 
including your private data, if any.
+    </_long-description>
+    <creates-items>backtrace</creates-items>
+    <gui-review-elements>no</gui-review-elements>
+
+    <!-- The event shows a message about sensitive data on its own.
+         It has to ask user on its own because other tools interrupts
+         processing at all if user rejects sending of sensitive data.
+         The second result for showing the question on its own is that the
+         event implementation automatically runs the analyze_LocalGDB event if
+         user dismisses the analyze_RetraceServer event. -->
+    <sending-sensitive-data>no</sending-sensitive-data>
+
+    <!-- The following options are taken from analyze_RetraceServer
+         event configuration because the analyze smart event internally runs
+         the analyze_RetraceServer.  The current implementation of the event
+         and libreport's run event framework can't load configuration of an
+         internally executed event.  This causes that user can be forced to
+         configure remote analysis on two different places. -->
+    <options>
+        <option type="text" name="RETRACE_SERVER_URL">
+           <_label>Retrace server URL</_label>
+           <default-value>retrace.fedoraproject.org</default-value>
+           <allow-empty>no</allow-empty>
+           <_description>Address of the retrace server</_description>
+       </option>
+       <option type="text" name="RETRACE_SERVER_INSECURE">
+           <_label>Insecure</_label>
+           <allow-empty>yes</allow-empty>
+           <_description>Whether or not to use insecure 
connection</_description>
+           <_note-html>Write "insecure" to allow insecure connection &lt;a 
href="https://fedorahosted.org/abrt/wiki/AbrtRetraceServerInsecureConnection"; 
&gt;(warning)&lt;/a&gt;</_note-html>
+       </option>
+
+    </options>
+</event>
diff --git a/src/plugins/ccpp_event.conf b/src/plugins/ccpp_event.conf
index 81b14d2..0d6300e 100644
--- a/src/plugins/ccpp_event.conf
+++ b/src/plugins/ccpp_event.conf
@@ -56,6 +56,9 @@ EVENT=report_uReport analyzer=CCpp
 EVENT=post_report analyzer=CCpp
         reporter-ureport -r
 
+EVENT=analyze_Smart analyzer=CCpp
+        abrt-action-analyze-smart
+
 # Reporting of C/Cpp problems
 EVENT=report-gui analyzer=CCpp
-        report-gtk -e report_uReport -e analyze_RetraceServer -e 
report_Bugzilla -e post_report -- "$DUMP_DIR"
+        report-gtk -e report_uReport -e analyze_Smart -e report_Bugzilla -e 
post_report -- "$DUMP_DIR"
-- 
1.7.11.4

Reply via email to