# /usr/lib/mindi/DebFindFailsafe
#
# DebFindFailsafe - Find correct FAILSAFE kernel to use on Debian systems.
#
# Approach:
# - get architecture
# - get kernel version (e.g. '2.6' or '2.4') of running kernel
# - find matching latest generic kernel using list of virtual candiates
#
# Caveats:
# - candiates lists need to be maintained manually; not too much overhead
# - the kernel relases don't have to match, i.e. a 2.6.12 could be running and
#   a 2.6.15 might get selected as failsafe; probably ok
#
# Changelog:
# 28Jan06AL: - initial version
# 12Feb06AL: - removed 'FATAL ERROR' from error messages
#            - check for status of kernel package, not dpkg (silly glitch)
#            - tell users to install kernel package when not found
#            - turned from independent script into snippet that is sourced by mindi
#              (prefixed all variables with 'EXT_' as external name space)
#            - use Die for better error reporting (possible through previous step)
#


# Define candiate lists for virtual kernel packages
EXT_virt_kernel_pkg_cand_amd64_26="linux-image-2.6-amd64"
EXT_virt_kernel_pkg_cand_i386_24="kernel-image-2.4-386"
EXT_virt_kernel_pkg_cand_i386_26="linux-image-2.6-486 kernel-image-2.6-386 linux-image-386" # Sarge Etch/Sid Breezy
EXT_virt_kernel_pkg_cand_ia64_24="kernel-image-2.4-itanium"
EXT_virt_kernel_pkg_cand_ia64_26="linux-image-2.6-itanium kernel-image-2.6-itanium"

####################################################
# +++ No maintainable parts beyond this point. +++ #
####################################################


# Get architecure of system
EXT_system_architecture=`dpkg --print-architecture 2> /dev/null`
if [ $? -ne 0 ]; then
	Die "Failed to determine system architecture. Terminating."
fi

# Get version of running kernel
EXT_kernel_version=`uname -r 2> /dev/null | cut -c1-3 2> /dev/null`
if [ $? -ne 0 ]; then
	Die "Failed to get version of running kernel. Terminating."
fi

# Get virtual kernel package candiates corresponding to architecture and kernel version
case "$EXT_system_architecture" in
	"amd64")
		case "$EXT_kernel_version" in
			"2.6")
				EXT_virt_kernel_pkg_cand=$EXT_virt_kernel_pkg_cand_amd64_26 ;;
			*)
				Die "Kernel version $EXT_kernel_version not supported on architecture $EXT_system_architecture. Terminating." ;;
		esac;;
	"i386")
		case "$EXT_kernel_version" in
			"2.4")
				EXT_virt_kernel_pkg_cand=$EXT_virt_kernel_pkg_cand_i386_24 ;;
			"2.6")
				EXT_virt_kernel_pkg_cand=$EXT_virt_kernel_pkg_cand_i386_26 ;;
			*)
				Die "Kernel version $EXT_kernel_version not supported on architecture $EXT_system_architecture. Terminating." ;;
		esac;;
	"ia64")
		case "$EXT_kernel_version" in
			"2.4")
				EXT_virt_kernel_pkg_cand=$EXT_virt_kernel_pkg_cand_ia64_24 ;;
			"2.6")
				EXT_virt_kernel_pkg_cand=$EXT_virt_kernel_pkg_cand_ia64_26 ;;
			*)
				Die "Kernel version $EXT_kernel_version not supported on architecture $EXT_system_architecture. Terminating." ;;
		esac;;
	*)
		Die "Architecture $EXT_system_architecture not supported. Terminating." ;;
esac

# Determine kernel package from virtual candidates
for EXT_cand in $EXT_virt_kernel_pkg_cand; do
	EXT_kernel_package=`dpkg --print-avail $EXT_cand 2>/dev/null | grep "^Depends: " | cut -d" " -f2`
	[ -n "$EXT_kernel_package" ] && break
done
if [ -z "$EXT_kernel_package" ]; then
	Die "Failed to get real kernel package for virtual kernel package candiate(s) $EXT_virt_kernel_pkg_cand. Terminating."
fi

# Verify that kernel package is installed
# (This is what users that don't have a suitable kernel to be used as failsafe will see.)
if [ `dpkg --status $EXT_kernel_package 2>/dev/null | grep -c "Status: install ok installed"` -ne 1 ]; then
	Die "Debian kernel package $EXT_kernel_package not installed. Please install (one of): $EXT_virt_kernel_pkg_cand. Terminating."
fi

# Get path to kernel image
EXT_kernel_image=`dpkg -L "$EXT_kernel_package" 2> /dev/null | grep -m 1 vmlinuz`
if [ -z "$EXT_kernel_image" ]; then
	Die "Failed to get path to kernel image from package $EXT_kernel_package. Terminating."
else
	# Export kernel version
	export FAILSAFE_KBIN="$EXT_kernel_image"
	export FAILSAFE_KVER="`echo $EXT_kernel_image | cut -d- -f2-`"
fi
