# /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