Blame src/plugins/abrt-action-perform-ccpp-analysis.in

Packit 8ea169
#!/usr/bin/python3 -u
Packit 8ea169
"""This module provides a function for executing of disjunction of analyze
Packit 8ea169
events.
Packit 8ea169
"""
Packit 8ea169
Packit 8ea169
import sys
Packit 8ea169
import os
Packit 8ea169
from argparse import ArgumentParser
Packit 8ea169
import locale
Packit 8ea169
import gettext
Packit 8ea169
from subprocess import Popen
Packit 8ea169
Packit 8ea169
import report
Packit 8ea169
from reportclient import (ask_yes_no_yesforever,
Packit 8ea169
                          ask_yes_no_save_result,
Packit 8ea169
                          RETURN_OK,
Packit 8ea169
                          RETURN_CANCEL_BY_USER,
Packit 8ea169
                          RETURN_FAILURE)
Packit 8ea169
Packit 8ea169
GETTEXT_PROGNAME = "abrt"
Packit 8ea169
Packit 8ea169
_ = gettext.gettext
Packit 8ea169
Packit 8ea169
def handle_event(event_name, problem_dir):
Packit 8ea169
    """Helper function handling a single event
Packit 8ea169
Packit 8ea169
    Keyword arguments:
Packit 8ea169
    envet_name -- a name of handled event
Packit 8ea169
    problem_dir -- a path to problem directory
Packit 8ea169
Packit 8ea169
    Returns True if the handled event was successfully executed; otherwise
Packit 8ea169
    returns False.
Packit 8ea169
Packit 8ea169
    """
Packit 8ea169
Packit 8ea169
    state, ret = report.run_event_on_problem_dir(problem_dir, event_name)
Packit 8ea169
Packit 8ea169
    if ret == 0 and state.children_count == 0:
Packit 8ea169
        print("No actions are found for event '%s'" % event_name)
Packit 8ea169
        return RETURN_FAILURE
Packit 8ea169
Packit 8ea169
    return ret
Packit 8ea169
Packit 8ea169
Packit 8ea169
def run_analyze_smart(problem_dir):
Packit 8ea169
    """Runs analyze_RetraceServer event or analyze_LocalGB event.
Packit 8ea169
Packit 8ea169
    At first runs analyze_RetraceServer. If user dismisses
Packit 8ea169
    analyze_RetraceServer event or if the run fails the analyze_LocalGDB event
Packit 8ea169
    will be run.
Packit 8ea169
Packit 8ea169
    Keyword arguments:
Packit 8ea169
    problem_dir -- a path to problem directory
Packit 8ea169
Packit 8ea169
    Returns True if any of the events was successfully performed; otherwise
Packit 8ea169
    returns False.
Packit 8ea169
Packit 8ea169
    """
Packit 8ea169
Packit 8ea169
    retval = RETURN_CANCEL_BY_USER
Packit 8ea169
    allowed = ask_yes_no_save_result("abrt_analyze_upload_coredump",
Packit 8ea169
                _("Ok to upload core dump? (It may contain sensitive data). "\
Packit 8ea169
                  "If your answer is 'No', a stack trace will be generated locally. "\
Packit 8ea169
                  "(It may download a huge amount of data)."))
Packit 8ea169
Packit 8ea169
    if allowed:
Packit 8ea169
        retval = handle_event("analyze_RetraceServer", problem_dir)
Packit 8ea169
Packit 8ea169
    # temporary helper variables for better readability
Packit 8ea169
    option = "abrt_analyze_smart_ask_perform_local_analysis"
Packit 8ea169
    question = _("Do you want to generate a stack trace locally? "\
Packit 8ea169
                 "(It may download a huge amount of data but reporting "\
Packit 8ea169
                 "can't continue without stack trace).")
Packit 8ea169
Packit 8ea169
    # run local GDB if the retrace event was dismissed
Packit 8ea169
    # or if the retrace event failed and user gave us permission to run local GDB
Packit 8ea169
    #
Packit 8ea169
    # don't change the retval to RETURN_CANCEL_BY_USER if ask_yes_no_yesforever() is False
Packit 8ea169
    # we want to catch errors produced by Retrace Server
Packit 8ea169
    if not allowed or (retval != RETURN_OK and ask_yes_no_yesforever(option, question)):
Packit 8ea169
        retval = handle_event("analyze_LocalGDB", problem_dir)
Packit 8ea169
Packit 8ea169
    return retval
Packit 8ea169
Packit 8ea169
Packit 8ea169
if __name__ == "__main__":
Packit 8ea169
    try:
Packit 8ea169
        locale.setlocale(locale.LC_ALL, "")
Packit 8ea169
    except locale.Error:
Packit 8ea169
        os.environ['LC_ALL'] = 'C'
Packit 8ea169
        locale.setlocale(locale.LC_ALL, "")
Packit 8ea169
Packit 8ea169
    # Defeat "AttributeError: 'module' object has no attribute 'nl_langinfo'"
Packit 8ea169
    try:
Packit 8ea169
        gettext.bind_textdomain_codeset(GETTEXT_PROGNAME,
Packit 8ea169
                                        locale.nl_langinfo(locale.CODESET))
Packit 8ea169
    except AttributeError:
Packit 8ea169
        pass
Packit 8ea169
Packit 8ea169
    gettext.bindtextdomain(GETTEXT_PROGNAME, '/usr/share/locale')
Packit 8ea169
    gettext.textdomain(GETTEXT_PROGNAME)
Packit 8ea169
Packit 8ea169
    CMDARGS = ArgumentParser(description = _('Smartly runs analyze events'))
Packit 8ea169
    CMDARGS.add_argument('-d', '--problem-dir', type=str,
Packit 8ea169
                         default='.', help=_('Problem directory'))
Packit 8ea169
Packit 8ea169
    OPTIONS = CMDARGS.parse_args()
Packit 8ea169
Packit 8ea169
    sys.exit(run_analyze_smart(vars(OPTIONS)['problem_dir']))