Blame src/plugins/abrt-action-analyze-vmcore

Packit 8ea169
#!/usr/bin/python3 -u
Packit 8ea169
# -*- coding: utf-8 -*-
Packit 8ea169
# Generate backtrace from vmcore
Packit 8ea169
#
Packit 8ea169
Packit 8ea169
import os
Packit 8ea169
import sys
Packit 8ea169
import getopt
Packit 8ea169
from subprocess import Popen, PIPE
Packit 8ea169
Packit 8ea169
from reportclient import verbose, set_verbosity, error_msg_and_die, error_msg
Packit 8ea169
Packit 8ea169
GETTEXT_PROGNAME = "abrt"
Packit 8ea169
import locale
Packit 8ea169
import gettext
Packit 8ea169
Packit 8ea169
_ = lambda x: gettext.gettext(x)
Packit 8ea169
Packit 8ea169
def init_gettext():
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
    # Defeat "AttributeError: 'module' object has no attribute 'nl_langinfo'"
Packit 8ea169
    try:
Packit 8ea169
        gettext.bind_textdomain_codeset(GETTEXT_PROGNAME, locale.nl_langinfo(locale.CODESET))
Packit 8ea169
    except AttributeError:
Packit 8ea169
        pass
Packit 8ea169
    gettext.bindtextdomain(GETTEXT_PROGNAME, '/usr/share/locale')
Packit 8ea169
    gettext.textdomain(GETTEXT_PROGNAME)
Packit 8ea169
Packit 8ea169
Packit 8ea169
PROGNAME = "abrt-action-analyze-vmcore"
Packit 8ea169
Packit 8ea169
# everything was ok
Packit 8ea169
RETURN_OK = 0
Packit 8ea169
# serious problem, should be logged somewhere
Packit 8ea169
RETURN_FAILURE = 2
Packit 8ea169
Packit 8ea169
ver = ""
Packit 8ea169
if __name__ == "__main__":
Packit 8ea169
    dmesg_log = "dmesg_log"
Packit 8ea169
    cachedirs = []
Packit 8ea169
    vmlinux_di_cachedir = ""
Packit 8ea169
    vmlinux_di_path = ""
Packit 8ea169
    tmpdir = ""
Packit 8ea169
    vmcore = ""
Packit 8ea169
Packit 8ea169
    init_gettext()
Packit 8ea169
Packit 8ea169
    help_text = _("Usage: {0} [-v[v]] [--core=VMCORE]").format(PROGNAME)
Packit 8ea169
    try:
Packit 8ea169
        opts, args = getopt.getopt(sys.argv[1:], "hvd", ["help", "core="])
Packit 8ea169
    except getopt.GetoptError as err:
Packit 8ea169
        error_msg(str(err))  # prints something like "option -a not recognized"
Packit 8ea169
        error_msg_and_die(help_text)
Packit 8ea169
    usercache = False
Packit 8ea169
Packit 8ea169
    for opt, arg in opts:
Packit 8ea169
        if opt in ("-h", "--help"):
Packit 8ea169
            print(help_text)
Packit 8ea169
            exit(0)
Packit 8ea169
        elif opt == "-v":
Packit 8ea169
            verbose += 1
Packit 8ea169
        elif opt in ("-d"):
Packit 8ea169
            try:
Packit 8ea169
                os.chdir(arg)
Packit 8ea169
            except OSError as ex:
Packit 8ea169
                print(ex)
Packit 8ea169
                sys.exit(RETURN_FAILURE)
Packit 8ea169
Packit 8ea169
    if not vmcore:
Packit 8ea169
        vmcore = os.path.join(os.getcwd(), "vmcore")
Packit 8ea169
Packit 8ea169
    set_verbosity(verbose)
Packit 8ea169
Packit 8ea169
    if not os.path.exists(vmcore):
Packit 8ea169
        print(_("File {0} doesn't exist").format(vmcore))
Packit 8ea169
        sys.exit(RETURN_FAILURE)
Packit 8ea169
Packit 8ea169
    print(_("Extracting the oops text from core"))
Packit 8ea169
    crash = Popen(["makedumpfile", "--dump-dmesg", "-f", vmcore, dmesg_log], stdout=PIPE, stderr=PIPE, bufsize=-1)
Packit 8ea169
    out, err = crash.communicate()
Packit 8ea169
Packit 8ea169
    if crash.returncode != 0:
Packit 8ea169
        error_msg_and_die(_("Can't process {0}:\n{1}").format(vmcore, err))
Packit 8ea169
Packit 8ea169
    backtrace_file = open("backtrace", "w")
Packit 8ea169
    dump_oops = Popen(["abrt-dump-oops", "-u", ".", dmesg_log], stdout=backtrace_file, stderr=PIPE, bufsize=-1)
Packit 8ea169
    out, err = dump_oops.communicate()
Packit 8ea169
    backtrace_file.close()
Packit 8ea169
    ret = dump_oops.returncode
Packit 8ea169
    if dump_oops.returncode != 0:
Packit 8ea169
        print(_("Can't extract the oops message: '{0}'").format(err))
Packit 8ea169
        sys.exit(ret)
Packit 8ea169
Packit 8ea169
    print(_("Oops text extracted successfully"))
Packit 8ea169
    sys.exit(ret)