#! /bin/sh
#
#  kdump
#
#  Description: The kdump script provides the support:
#		1. Load a kdump kernel image into memory;
#		2. Copy away vmcore when system panic.
#

#default
KEXEC=/usr/sbin/kexec
KEXEC_ARGS="-p"

MAKEDUMPFILE=/usr/bin/makedumpfile
MAKEDUMPFILE_ARGS="-E -d 1"

LOGGER="logger -p info -t kdump"

if [ -f /etc/sysconfig/kdump.conf ]; then
	. /etc/sysconfig/kdump.conf
else
	echo "no /etc/sysconfig/kdump.conf"
	exit 1;
fi

do_check()
{
	#check makedumpfile
	if [ ! -e ${MAKEDUMPFILE} -o ! -x ${MAKEDUMPFILE} ] ;then
		echo "No makedumpfile found."
		exit 0
	fi

	#check kexec
	if [ ! -e ${KEXEC} -o ! -x ${KEXEC} ] ;then
		echo "No kexec found."
		exit 0
	fi

	#check whether kdump kernel image exists on the system
	if [ -z "${KDUMP_KIMAGE}" -o ! -f "${KDUMP_KIMAGE}" ]; then
		echo "No kdump kernel image found."
		exit 0
	fi

	if [ "${KDUMP_CMDLINE}"x = "x" ] ; then
		echo "KDUMP_CMDLINE is not configured"
		exit 0
	fi
}

do_save_vmcore()
{
	if [ ${KDUMP_VMCORE_PATH}x = x ]; then
		KDUMP_VMCORE_PATH="/var/crash/`date +"%Y-%m-%d"`"
	fi

	mkdir -p ${KDUMP_VMCORE_PATH}
	echo "Saving a vmcore to ${KDUMP_VMCORE_PATH}."

	${MAKEDUMPFILE} ${MAKEDUMPFILE_ARGS} /proc/vmcore ${KDUMP_VMCORE_PATH}/vmcore-"`date +"%H:%M:%S"`"
#	cp --sparse=always /proc/vmcore ${KDUMP_VMCORE_PATH}/vmcore-"`date +"%H:%M:%S"`"
	rc=$?
	if [ ${rc} == 0 ]; then
		${LOGGER} "Saved a vmcore to ${KDUMP_VMCORE_PATH}."
	else
		${LOGGER} "Failed to save vmcore!"
	fi
	return ${rc}
}

do_start()
{
	#check file
	do_check

	#check whether the running kernel supports kdump.
	if [ ! -e /sys/kernel/kexec_crash_loaded ]; then
		echo "Kdump isn't supported on the running kernel!!!"
		${LOGGER} "Kdump isn't supported on the running kernel!!!"
		return 1
	fi

	#check whether kdump kernel image has been loaded
	rc=`cat /sys/kernel/kexec_crash_loaded`
	if [ ${rc} != 0 ]; then
		echo "Kdump is already running.";
		${LOGGER} "Kdump is already running."
		return 0
	fi

	#check the running kernel cmdline option,insure "crashkenrel=" always set.
	grep -q crashkernel= /proc/cmdline
	if [ $? != 0 ]; then
		echo "Kdump isn't supported on the running kernel,please check boot option!!!"
		${LOGGER} "Kdump isn't supported on the running kernel,please check boot option!!!"
		return 1
	fi

	#Load the kdump kernel image
	${KEXEC} ${KEXEC_ARGS} "${KDUMP_KIMAGE}" --append="${KDUMP_CMDLINE}"
	if [ $? != 0 ]; then
		echo "Failed to load kdump kernel!"
		${LOGGER} "Failed to load kdump kernel!"
		return 1
	fi

	echo "Kdump started up."
	${LOGGER} "Kdump started up."
}

do_stop()
{
	${KEXEC} -p -u 2>/dev/null
	if [ $? == 0 ]; then
		echo "Kdump has been stopped."
		${LOGGER} "Kdump has been stopped."
	else
		echo "Failed to stop kdump!"
		${LOGGER} "Failed to stop kdump!"
	fi
}

case "$1" in
  start)
	if [ -s /proc/vmcore ]; then
		do_save_vmcore
		reboot
	else
		do_start
	fi
	;;
 restart)
	do_stop
	do_start
	;;
  stop)
	do_stop
	;;
   *)
	echo $"Usage: $0 {start|stop|restart}"
	exit 1
esac

exit $?
