#!/usr/bin/python
#
# Collect information about a kernel oops.
#
# Copyright (c) 2007 Canonical Ltd.
# Author: Martin Pitt <martin.pitt@ubuntu.com>
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.  See http://www.gnu.org/copyleft/gpl.html for
# the full text of the license.

import os, re
import apport, apport.fileutils

vmcore_root = os.path.join(apport.fileutils.report_dir)
vmcore_path = os.path.join(vmcore_root, 'vmcore')

pr = apport.Report('KernelCrash')
package = apport.packaging.get_kernel_package()
try:
    package_version = apport.packaging.get_version(package)
except ValueError as e:
    if 'does not exist' in e.message:
        package_version = 'unknown'
pr['Package'] = '%s %s' % (package, package_version)

pr.add_os_info()
if os.path.exists(vmcore_path + '.log'):
    pr['VmCoreLog'] = (vmcore_path + '.log',)

if os.path.exists(vmcore_path):
    pr['VmCore'] = (vmcore_path,)
    try:
        with open(apport.fileutils.make_report_path(pr), 'wb') as f:
            pr.write(f)
    except IOError as e:
        apport.fatal('Cannot create report: ' + str(e))
else:
    # kdump-tools has moved vmcore to timestamped dir
    for root, dirs, files in os.walk(vmcore_root):
        for timedir in dirs:
            if re.search('^[0-9]{12}$', timedir):
                vmcore_dir = os.path.join(vmcore_root, timedir)
                dmesgfile = os.path.join(vmcore_dir, 'dmesg.' + timedir)
                report_name = pr['Package'] + '-' + timedir + '.crash'
                crash_report = os.path.join(vmcore_root, report_name)
                pr['VmCoreDmesg'] = (dmesgfile,)
                if not os.path.exists(crash_report):
                    try:
                        with open(crash_report, 'wb') as f:
                            pr.write(f)
                    except IOError as e:
                        apport.fatal('Cannot create report: ' + str(e))

# clean up the core file
# if not generated by kdump-tools
if os.path.exists(vmcore_path):
    try:
        os.unlink(vmcore_path)
    except OSError:
        pass  # huh, already gone?
    try:
        os.unlink(vmcore_path + '.log')
    except OSError:
        pass
