#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#

#
# While installing a rpm to update kernel on a deployed target, it will update
# the boot area and the boot menu with the kernel as the priority but allow
# you to fall back to the original kernel as well.
#
# - In kernel-image's preinstall scriptlet, it backs up original kernel to avoid
#   probable confliction with the new one.
#
# - In kernel-image's postinstall scriptlet, it modifies grub's config file to
#   updates the new kernel as the boot priority.
#

python __anonymous () {
    import re

    preinst = '''
	# Parsing confliction
	[ -f "$D/boot/grub/menu.list" ] && grubcfg="$D/boot/grub/menu.list"
	[ -f "$D/boot/grub/grub.cfg" ] && grubcfg="$D/boot/grub/grub.cfg"
	if [ -n "$grubcfg" ]; then
		# Dereference symlink to avoid confliction with new kernel name.
		if grep -q "/KERNEL_IMAGETYPE \+root=" $grubcfg; then
			if [ -L "$D/boot/KERNEL_IMAGETYPE" ]; then
				kimage=`realpath $D/boot/KERNEL_IMAGETYPE 2>/dev/null`
				if [ -f "$D$kimage" ]; then
					sed -i "s:KERNEL_IMAGETYPE \+root=:${kimage##*/} root=:" $grubcfg
				fi
			fi
		fi

		# Rename old kernel if it conflicts with new kernel name.
		if grep -q "/KERNEL_IMAGETYPE-${KERNEL_VERSION} \+root=" $grubcfg; then
			if [ -f "$D/boot/KERNEL_IMAGETYPE-${KERNEL_VERSION}" ]; then
				timestamp=`date +%s`
				kimage="$D/boot/KERNEL_IMAGETYPE-${KERNEL_VERSION}-$timestamp-back"
				sed -i "s:KERNEL_IMAGETYPE-${KERNEL_VERSION} \+root=:${kimage##*/} root=:" $grubcfg
				mv "$D/boot/KERNEL_IMAGETYPE-${KERNEL_VERSION}" "$kimage"
			fi
		fi
	fi
'''

    postinst = '''
	get_new_grub_cfg() {
		grubcfg="$1"
		old_image="$2"
		title="Update KERNEL_IMAGETYPE-${KERNEL_VERSION}-${PV}"
		if [ "${grubcfg##*/}" = "grub.cfg" ]; then
			rootfs=`grep " *linux \+[^ ]\+ \+root=" $grubcfg -m 1 | \
				 sed "s#${old_image}#${old_image%/*}/KERNEL_IMAGETYPE-${KERNEL_VERSION}#"`

			echo "menuentry \"$title\" {"
			echo "    set root=(hd0,1)"
			echo "$rootfs"
			echo "}"
		elif [ "${grubcfg##*/}" = "menu.list" ]; then
			rootfs=`grep "kernel \+[^ ]\+ \+root=" $grubcfg -m 1 | \
				 sed "s#${old_image}#${old_image%/*}/KERNEL_IMAGETYPE-${KERNEL_VERSION}#"`

			echo "default 0"
			echo "timeout 30"
			echo "title $title"
			echo "root  (hd0,0)"
			echo "$rootfs"
		fi
	}

	get_old_grub_cfg() {
		grubcfg="$1"
		if [ "${grubcfg##*/}" = "grub.cfg" ]; then
			cat "$grubcfg"
		elif [ "${grubcfg##*/}" = "menu.list" ]; then
			sed -e '/^default/d' -e '/^timeout/d' "$grubcfg"
		fi
	}

	if [ -f "$D/boot/grub/grub.cfg" ]; then
		grubcfg="$D/boot/grub/grub.cfg"
		old_image=`grep ' *linux \+[^ ]\+ \+root=' -m 1 "$grubcfg" | awk '{print $2}'`
	elif [ -f "$D/boot/grub/menu.list" ]; then
		grubcfg="$D/boot/grub/menu.list"
		old_image=`grep '^kernel \+[^ ]\+ \+root=' -m 1 "$grubcfg" | awk '{print $2}'`
	fi

	# Don't update grubcfg at first install while old bzImage doesn't exist.
	if [ -f "$D/boot/${old_image##*/}" ]; then
		grubcfgtmp="$grubcfg.tmp"
		get_new_grub_cfg "$grubcfg" "$old_image"  > $grubcfgtmp
		get_old_grub_cfg "$grubcfg" >> $grubcfgtmp
		mv $grubcfgtmp $grubcfg
		echo "Caution! Update kernel may affect kernel-module!"
	fi
'''

    imagetypes = d.getVar('KERNEL_IMAGETYPES')
    imagetypes = re.sub(r'\.gz$', '', imagetypes)

    for type in imagetypes.split():
        typelower = type.lower()
        preinst_append = preinst.replace('KERNEL_IMAGETYPE', type)
        postinst_prepend = postinst.replace('KERNEL_IMAGETYPE', type)
        d.setVar('pkg_preinst:kernel-image-' + typelower + ':append', preinst_append)
        d.setVar('pkg_postinst:kernel-image-' + typelower + ':prepend', postinst_prepend)
}

