On 09/13/2012 12:02 PM, Jakub Filak wrote:
- 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 <jfilak(a)redhat.com>
---
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
typo:
successfuly
+ 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)."))
typo:
locally
+
+ 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
typo: doens't
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
<a
href="https://fedorahosted.org/abrt/wiki/AbrtRetraceServerInsecureCo...
>(warning)</a></_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"
Works fine, fix the typos and push it please.
--
Richard Marko