Blob Blame History Raw
#!/usr/bin/python3 -u
"""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

import report
from reportclient import (ask_yes_no_yesforever,
                          ask_yes_no_save_result,
                          RETURN_OK,
                          RETURN_CANCEL_BY_USER,
                          RETURN_FAILURE)

GETTEXT_PROGNAME = "abrt"

_ = gettext.gettext

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.

    """

    state, ret = report.run_event_on_problem_dir(problem_dir, event_name)

    if ret == 0 and state.children_count == 0:
        print("No actions are found for event '%s'" % event_name)
        return RETURN_FAILURE

    return ret


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 successfully performed; otherwise
    returns False.

    """

    retval = RETURN_CANCEL_BY_USER
    allowed = ask_yes_no_save_result("abrt_analyze_upload_coredump",
                _("Ok to upload core dump? (It may contain sensitive data). "\
                  "If your answer is 'No', a stack trace will be generated locally. "\
                  "(It may download a huge amount of data)."))

    if allowed:
        retval = 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 locally? "\
                 "(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
    #
    # don't change the retval to RETURN_CANCEL_BY_USER if ask_yes_no_yesforever() is False
    # we want to catch errors produced by Retrace Server
    if not allowed or (retval != RETURN_OK and ask_yes_no_yesforever(option, question)):
        retval = handle_event("analyze_LocalGDB", problem_dir)

    return retval


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(run_analyze_smart(vars(OPTIONS)['problem_dir']))