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

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