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