blob: 2d22488c24916c163758363061f64728cb74766d [file] [log] [blame]
#!/bin/bash
ERROR_MSG="KDUMP_ERROR"
find /sys/fs/pstore -name 'dmesg-*' -print -exec cat {} \; -exec rm -f {} \;
# Dump the core file to the ram
dumpdir="/run/log/kdump"
mkdir -p ${dumpdir}
pmsgs=$(ls /sys/fs/pstore/pmsg-*) || exit 0
# there should always be 1 pmsg file
# if not, only process the first one and delete them all at the end
pmsg=$(echo "$pmsgs" | head -n 1)
# Parsing the pmsg file
# First line msg_len is a single number represents the dmesg buffer
# Following msg_len bytes of dmesg
# Rest of the buffer is the kdump, or error message starting with "KDUMP_ERROR"
msg_len=$(head -n 1 $pmsg)
msg_len_size=$(echo $msg_len | wc -c)
error_msg_len=$(echo -n $ERROR_MSG | wc -c)
core_offset=$(( msg_len + msg_len_size ))
# print the version info
cat /etc/os-release
# dump the dmesg to stdout
dd if=$pmsg bs=1 skip=$msg_len_size count=$msg_len
if [ $(dd if=$pmsg bs=1 skip=$core_offset count=$error_msg_len) == $ERROR_MSG ]; then
# dump the error msg to stdout
dd if=$pmsg bs=$core_offset skip=1
else
# process the core file
dd if=$pmsg bs=$core_offset skip=1 | makedumpfile -R ${dumpdir}/kcore-$(/bin/date +%Y_%m_%d_%H_%M_%S)
fi
echo "removing pmsg file "$pmsgs
rm -f $pmsgs