#!/sbin/openrc-run
# Copyright 1999-2017 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

# Set up some defaults.
: "${LOAD_DURING_SHUTDOWN:=yes}"
: "${BOOTPART:=/boot}"
: "${DONT_MOUNT_BOOT:=no}"

depend() {
	need localmount
}

auto_prefix_bootpath() {
	# Only auto-add prefix to relative paths.
	case $1 in
	*/*) echo "$1";;
	*)   echo "${BOOTPART}/$1" ;;
	esac
}

get_genkernel_arch() {
	case $1 in
	  x86_64) echo "amd64" ;;
	  i[3456]86) echo "x86" ;;
	  *) echo "$1" ;;
	esac
}

image_path() {
	# Do no sanity checking if the user has set a value.
	if [ -n "${KNAME}" ]; then
		auto_prefix_bootpath "${KNAME}"
		return
	fi

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

	return 1
}

initrd_path() {
	# Do no sanity checking if the user has set a value.
	if [ -n "${INITRD}" ]; then
		auto_prefix_bootpath "${INITRD}"
		return 0
	fi

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

	return 1
}

mount_boot() {
	[ "${DONT_MOUNT_BOOT}" != "no" ] && return 1
	mountinfo -q "${BOOTPART}" && return 1

	ebegin "Mounting ${BOOTPART}"
	mount "${BOOTPART}"
	eend $?
}

load_image() {
	if [ "${KNAME}" = "-" ]; then
		ebegin "Disabling kexec"
		kexec -u
		eend $?
		return  # eend preserved $? for us.
	fi

	local img initrd="$(initrd_path)" mounted=false kparamopt 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 [ -z "${ROOTPART}" ]; then
		ROOTPART="$(readlink -f "$(sed -n '/^\/[^ ]* \/ / s,^\([^ ]*\).*,\1,p' /proc/mounts)")"
	fi

	if [ -z "${KPARAM}" ]; then
		kparamopt="--reuse-cmdline"
	fi

	if [ -n "${initrd}" ]; then
		initrdopt="--initrd=${initrd}"
	fi

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

	kexec ${KEXEC_OPT_ARGS} ${kparamopt} \
		-l "${img}" --append="root=${ROOTPART} ${KPARAM}" ${initrdopt}
	local ret=$?

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

start() {
	if [ "${LOAD_DURING_SHUTDOWN}" = "yes" ]; then
		local mounted
		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}"
			eend $?
		fi
		# $? is already set to the previous calls.
		return
	else
		load_image
	fi
}

stop() {
	if ! yesno ${RC_REBOOT}; then
		ebegin "Not rebooting; disabling kexec"
		kexec -u
		eend $?
		return
	fi

	if [ -f /nokexec ]; then
		ebegin "Rebooting; disabling kexec due to /nokexec"
		rm -f /nokexec
		kexec -u
		eend $?
		return
	fi

	if [ "${LOAD_DURING_SHUTDOWN}" = "yes" ]; then
		load_image
	fi
}
