#! /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 "crashkernel=" 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 $?
