OpenWrt – Rev 2

Subversion Repositories:
Rev:
#!/bin/sh /etc/rc.common

START=41
STOP=98

EXTRA_COMMANDS="status"
EXTRA_HELP="        status  Print crashkernel status"

verify_kdump() {
        local cfg="$1"
        local enabled
        local path
        local save_vmcore
        local save_dmesg

        config_get_bool enabled "$cfg" enabled 1
        config_get_bool save_dmesg "$cfg" save_dmesg 1
        config_get_bool save_vmcore "$cfg" save_vmcore 0

        [ "$enabled" -gt 0 ] || return 2

        [ "$save_dmesg" -gt 0 ] || [ "$save_vmcore" -gt 0 ] || return 2

        config_get path "$cfg" path "/"

        [ -d "$path" ] || mkdir -p "$path" 2>/dev/null || return 1
}

run_kdump() {
        local cfg="$1"
        local enabled
        local path
        local save_vmcore
        local save_dmesg

        config_get_bool enabled "$cfg" enabled 1
        [ "$enabled" -gt 0 ] || return

        config_get_bool save_dmesg "$cfg" save_dmesg 1
        config_get_bool save_vmcore "$cfg" save_vmcore 0
        config_get path "$cfg" path "/"

        timestamp=$(date "+%Y%m%dT%H%M%S")

        if [ "$save_vmcore" -eq 1 ]; then
                echo -n "Saving vmcore (this may take a while)..."
                # would like 'sparse' but busybox doesn't support it
                dd if=/proc/vmcore of="$path/vmcore-$timestamp" conv=fsync bs=1M
                echo " done"
        fi

        if [ "$save_dmesg" -eq 1 ]; then
                vmcore-dmesg /proc/vmcore > "$path/dmesg-$timestamp"
        fi

        sync
        reboot -f
}

find_kernel() {
        . /lib/functions.sh
        local kernel

        kernel="$BOOT_IMAGE"
        if [ -r "$kernel" ]; then
                echo $kernel
                return 0
        fi

        kernel="$(find_mtd_part kernel)"
        if [ -r "$kernel" ]; then
                echo $kernel
                return 0
        fi

        for voldir in /sys/class/ubi/ubi*_*; do
                [ ! -e "$voldir" ] && continue
                if [ "$(cat "${voldir}/name")" = "kernel" ]; then
                        kernel="/dev/$(basename "$voldir")"
                        echo $kernel
                        return 0
                fi
        done

        return 1
}

load_crashkernel() {
        local append_cmdline
        local kernel

        kernel="$(find_kernel)"
        [ $? -gt 0 ] && return 1

        case "$(uname -m)" in
                i?86|x86_64)
                        grep -q "crashkernel=" /proc/cmdline || return 1
                        append_cmdline="1 irqpoll reset_devices maxcpus=1"
                        ;;
                arm*)
                        append_cmdline="1 maxcpus=1 reset_devices"
                        ;;
        esac
        kexec -p "$kernel" --reuse-cmdline --append="$append_cmdline"
        return $?
}

start() {
        local retval

        if [ ! -e /sys/kernel/kexec_crash_loaded ]; then
                return 1
        fi

        if [ -e /proc/vmcore ]; then
                config_load kdump
                config_foreach run_kdump kdump
        else
                config_load kdump
                config_foreach verify_kdump kdump
                retval=$?
                [ $retval = 1 ] && return 1
                [ $retval = 0 ] && load_crashkernel
                return $?
        fi
}

stop() {
        [ "$(cat /sys/kernel/kexec_crash_loaded)" = "1" ] || return

        if [ -e "$BOOT_IMAGE" ]; then
                kexec -p -u "$BOOT_IMAGE"
        fi
}

status() {
        local retval kernel

        if [ ! -e /sys/kernel/kexec_crash_loaded ]; then
                echo "crashdump not supported by kernel"
                return
        fi

        if [ $(cat /sys/kernel/kexec_crash_size) -eq 0 ]; then
                echo "memory for crashdump kernel not reserved!"
                echo "check crashkernel= kernel cmdline parameter"
                echo "(a reboot is required after installing kdump)"
                return
        fi

        kernel="$(find_kernel)"
        if [ $? -gt 0 ]; then
                echo "cannot find kernel image"
                return
        else
                echo "using kernel image $kernel"
        fi

        echo -n "kdump configuration is "
        config_load kdump
        retval=$?
        if [ $retval = 0 ]; then
                if [ "$(config_foreach echo kdump)" ]; then
                        config_foreach verify_kdump kdump
                        retval=$?
                else
                        retval=1
                fi
        fi

        if [ $retval = 0 ]; then
                echo "valid"
        elif [ $retval = 2 ]; then
                echo "disabled"
        else
                echo "BROKEN"
        fi

        echo -n "kexec crash kernel "
        if [ "$(cat /sys/kernel/kexec_crash_loaded)" = "0" ]; then
                echo -n "not "
        fi
        echo "loaded"
}