|
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)
|