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 <[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
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 &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"

Works fine, fix the typos and push it please.

-- 
Richard Marko

Reply via email to