#!/sbin/runscript
# Copyright 1999-2013 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/sys-apps/kexec-tools/files/kexec.init-2.0.4-r2,v 1.1 2013/09/21 11:35:53 jlec Exp $

depend() {
	need localmount
}

image_path() {
	local x= kver=$(uname -r) karch=$(uname -m)
	BOOTPART="${BOOTPART:-/boot}"
	KNAME="${KNAME:-bzImage}"
	if [ -e "${KNAME}" ]; then
		echo "${KNAME}"
		return 0
	fi
	for x in "${KNAME#${BOOTPART}}" vmlinuz \
		bzImage-${kver} vmlinuz-${kver} \
		kernel-genkernel-${karch}-${kver} \
		kernel-${kver} kernel-${karch}; do
		if [ -e "${BOOTPART}/${x}" ]; then
			echo "${BOOTPART}/${x}"
			return 0
		fi
	done

	return 1
}

initrd_path() {
	local x= kver=$(uname -r) karch=$(uname -m)
	BOOTPART="${BOOTPART:-/boot}"
	INITRD="${INITRD:-initrd}"
	if [ -e "${INITRD}" ]; then
		echo "${INITRD}"
		return 0
	fi
	for x in "${INITRD#${BOOTPART}}" \
		initrd.img-${kver} initrd-${kver}.img \
		initrd-${kver} initramfs-${kver}.img \
		initramfs-genkernel-${karch}-${kver} ; do
		if [ -e "${BOOTPART}/${x}" ]; then
			echo "${BOOTPART}/${x}"
			return 0
		fi
	done

	return 1
}

mount_boot(){
	local ret

	[ -n "${DONT_MOUNT_BOOT}" ] && return 1
	grep -q " ${BOOTPART:-/boot} " /proc/mounts && return 1

	BOOTPART="${BOOTPART:-/boot}"
	ebegin "Mounting ${BOOTPART}"
	mount "${BOOTPART}"; ret=$?
	eend ${ret}
	return ${ret}
}

load_image() {
	local ret
	if [ "${KNAME}" = "-" ]; then
		ebegin "Disabling kexec"
		kexec -u; ret=$?
		eend ${ret}
		return ${ret}
	fi

	BOOTPART="${BOOTPART:-/boot}"
	local img= initrd="$(initrd_path)" mounted=false initrdopt=

	if ! img="$(image_path)"; then
		if mount_boot; then
			if img="$(image_path)"; then
				mounted=true
				initrd="$(initrd_path)"
			else
				eerror "No kernel image found in ${BOOTPART}!"
				umount "${BOOTPART}"
				return 1
			fi
		else
			eerror "No kernel image found in ${BOOTPART}!"
			return 1
		fi
	fi

	if [ -n "${INITRD}" ] && \
		! [ "${BOOTPART}/${INITRD#${BOOTPART}}" = "${initrd}" ]; then
		eerror "Requested initrd: ${INITRD#${BOOTPART}}"
		eerror "could not be found"
		return 1
	fi

	[ -n "${ROOTPART}" ] || \
		ROOTPART="$(readlink -f "$(sed -n '/^\/[^ ]* \/ / s,^\([^ ]*\).*,\1,p' /proc/mounts)")"

	[ -n "${KPARAM}" ] || KEXEC_OPT_ARGS="${KEXEC_OPT_ARGS} --reuse-cmdline"

	[ -n "${initrd}" ] && [ -e "${initrd}" ] && initrdopt="--initrd=${initrd}"

	local msg=
	[ -n "${initrd}" ] && \
		msg="with ${initrd}"
	einfo "Using kernel image ${img} ${msg} for kexec"

	ebegin "Setting kexec with ${KEXEC_OPT_ARGS} -l ${img} root=${ROOTPART} ${KPARAM} ${initrdopt}"
	kexec ${KEXEC_OPT_ARGS} -l "${img}" --append="root=${ROOTPART} ${KPARAM}" ${initrdopt}
	local res=$?

	${mounted} && umount "${BOOTPART}"
	eend ${res}
	return ${res}
}

start() {
	if [ "${LOAD_DURING_SHUTDOWN:-yes}" = "yes" ]; then
		local ret=0
		BOOTPART="${BOOTPART:-/boot}"
		if mount_boot; then
			mounted=true
		fi
		if ! image_path > /dev/null; then
			ewarn "Cannot find kernel image!"
			ewarn "Please make sure a valid kernel image is present before reboot."
			return 0
		fi
		if [ -n "${mounted}" ]; then
			ebegin "Unmounting ${BOOTPART}"
			umount "${BOOTPART}"; ret=$?
			eend ${ret}
		fi
		return ${ret}
	else
		ebegin "Configuring kexec"
		load_image
		eend $?
	fi
}

stop() {
	[ "${LOAD_DURING_SHUTDOWN:-yes}" != "yes" ] && return 0

	if ! yesno $RC_REBOOT; then
		einfo "Not rebooting, so disabling"
		kexec -u
		return 0
	fi

	if [ -f /nokexec ]; then
		einfo "Not using kexec during reboot"
		rm -f /nokexec
		kexec -u
		return 0
	fi

	ebegin "Configuring kexec"
	load_image
	eend $?
}
