#!/bin/sh
# $Id: installkernel,v 1.7 2004/08/17 02:08:27 at Exp $
#--------------------------------------------------------------------
# Copyright (C) 2000, 2002 by MandrakeSoft,
# Chmouel Boudjnah <chmouel@mandrakesoft.com>,
# Redistribution of this file is permitted under the terms of the GNU
# Public License (GPL)
#--------------------------------------------------------------------
# Copyright (C) 2003, 2004 by ALT Linux Team,
# Alexey Tourbin <at@altlinux.org>.
#--------------------------------------------------------------------
# description: Install a kernel to /boot and add an entry for grub and lilo

NOLAUNCH=
REMOVE=
MEMTEST=
LABEL=
NODEFAULT=
NOFLAVOUR=
KEEPINITRD=

: ${INSTALLKERNEL_CONFIG:=/etc/sysconfig/installkernel}
if [ -f "$INSTALLKERNEL_CONFIG" ]; then
	. "$INSTALLKERNEL_CONFIG"
fi

usage()
{
	cat <<EOF >&2
Usage: $0 [options] KERNEL_VERSION

  -r, -R, --remove	remove bootloader entry and prepare to remove kernel;
  -m, --memtest		it's all about memtest86, not Linux kernel;
      --label <label>	use <label> if it is not already used;
  -n, --nolaunch	don't launch lilo;
      --nodefault	do not change default kernel (/boot/vmlinuz) link;
      --noflavour	do not change flavour kernel (/boot/vmlinuz-flavour) link;
      --keep-initrd	do not overwrite existing initrd;
  -h, --help		this help.
EOF
	[ -n "$1" ] && exit "$1" || exit 2
}

LEGACY=algyNdsSCiLc
ARGV=`getopt -n "$0" -o nrRmh$LEGACY -l nolaunch,remove,memtest,help,nodefault,noflavour,keep-initrd,label: -- "$@"` || usage
eval set -- "$ARGV"

while :; do
	case "$1" in
		-n|--nolaunch) NOLAUNCH=$1; shift
			;;
		-r|-R|--remove) REMOVE=$1; shift
			;;
		-m|--memtest) MEMTEST=$1; shift
			;;
		--label) LABEL="$1 $2"; shift 2
			;;
		--nodefault) NODEFAULT=$1; shift
			;;
		--noflavour) NOFLAVOUR=$1; shift
			;;
		--keep-initrd) KEEPINITRD=$1; shift
			;;
		-h|--help) shift; usage 0
			;;
		--) shift; break
			;;
		-[$LEGACY]) echo "$0: legacy option $1 ignored (probably harmless)" >&2; shift
			;;
		*) echo "$0: unrecognized option: $1" >&2; exit 1
			;;
	esac
done

[ -z "${0##*memtest*}" ] && MEMTEST=--memtest

VERSION="$1"
[ -n "$VERSION" ] || usage

if [ -n "$DURING_INSTALL" ]; then
	echo "$0: DURING_INSTALL=$DURING_INSTALL; supposed to run later" >&2
	exit 0
fi

if [ -n "$MEMTEST" -a -d /sys/firmware/efi ]; then
	echo "$0: booted in EFI mode, skipping" >&2
	exit 0
fi

: ${INITRD_GENERATOR:=mkinitrd}
: ${BOOTDIR:=/boot}
: ${MKINITRD:=/sbin/mkinitrd}
: ${MAKE_INITRD:=/usr/sbin/make-initrd}

if ! [ -w "$BOOTDIR" ]; then
  echo "$0: $BOOTDIR: Permission denied"
  exit 1
fi

if OLD_KERNEL=`readlink -e -- "$BOOTDIR/vmlinuz"`; then
	OLD_VERSION="${OLD_KERNEL##*/vmlinuz-}"
fi

cd "$BOOTDIR"
if [ -z "$REMOVE" -a -z "$MEMTEST" ]; then
	if [ -f "System.map-$VERSION" ]; then
		/sbin/depmod -a -F "System.map-$VERSION" "$VERSION"
	fi

	if [ -z "$KEEPINITRD" ] || [ ! -f "$BOOTDIR/initrd-$VERSION.img" ]; then
		case "$INITRD_GENERATOR" in
			mkinitrd)
				"$MKINITRD" $MKINITRD_OPTIONS -f "$BOOTDIR/initrd-$VERSION.img" "$VERSION" || exit 1
				;;
			make-initrd)
				"$MAKE_INITRD" -b "$BOOTDIR" -k "$VERSION" || exit 1
				;;
			*)
				echo "$0: $INITRD_GENERATOR: Unrecognized initrd generator"
				exit 1
				;;
		esac
	fi

	if [ -z "${VERSION##*-xen-*}" ] && [ -z "$NOFLAVOUR" ]; then
		ln -snf "vmlinuz-$VERSION" vmlinuz-xen
		ln -snf "initrd-$VERSION.img" initrd-xen.img
	else
		if [ -z "$NODEFAULT" ]; then
			ln -snf "vmlinuz-$VERSION" vmlinuz
			ln -snf "initrd-$VERSION.img" initrd.img
		fi
		if [ -z "$NOFLAVOUR" ]; then
			KFLAVOUR=${VERSION#*-}; KFLAVOUR=${KFLAVOUR%-*}
			ln -snf "vmlinuz-$VERSION" vmlinuz-$KFLAVOUR
			ln -snf "initrd-$VERSION.img" initrd-$KFLAVOUR.img
		fi
	fi
elif [ -z "$MEMTEST" ]; then
	rm -f "initrd-$VERSION.img"
fi
cd - > /dev/null

: ${LILO_CONF:=/etc/lilo.conf}
: ${GRUB_MENU_LST:=$BOOTDIR/grub/menu.lst}
: ${GRUB_DEVICE_MAP:=$BOOTDIR/grub/device.map}
: ${PERL:=/usr/bin/perl}
: ${LILO:=/sbin/lilo}
: ${DETECTLOADER:=/usr/sbin/detectloader.sh}
: ${DETECTLILOBOOT:=/usr/sbin/detectliloboot.sh}
: ${SHARFILE:=/usr/share/loader}

# check perl
if [ ! -x "$PERL" ] && ! type "$PERL" >/dev/null 2>&1; then
	echo "$0: warning: PERL=$PERL not available; supposed to run manually..."
	PERL="echo $PERL"
fi

# modify lilo config
if [ -w "$LILO_CONF" -a -x "$SHARFILE/lilo" ]; then
	cp -pf "$LILO_CONF" "$LILO_CONF.old"
	if [ -z "$REMOVE" -a -z "$MEMTEST" -a -n "$OLD_VERSION" ]; then
		$PERL "$SHARFILE/lilo" "$OLD_VERSION"
	fi
	$PERL "$SHARFILE/lilo" $LABEL $MEMTEST $REMOVE "$VERSION"
fi

# modify grub config
if [ -w "$GRUB_MENU_LST" -a -f "$GRUB_DEVICE_MAP" -a -x "$SHARFILE/grub" ]; then
	cp -pf "$GRUB_MENU_LST" "$GRUB_MENU_LST.old"
	if [ -z "$REMOVE" -a -z "$MEMTEST" -a -n "$OLD_VERSION" ]; then
		$PERL "$SHARFILE/grub" "$OLD_VERSION"
	fi
	$PERL "$SHARFILE/grub" $LABEL $MEMTEST $REMOVE "$VERSION"
fi

# launch lilo
if [ -z "$NOLAUNCH" ]; then
	if [ -z "$LOADER" -a -r "$LILO_CONF" -a\
	     -x "$DETECTLOADER" -a -x "$DETECTLILOBOOT" ]; then
		LILO_DEVICE="$($DETECTLILOBOOT "$LILO_CONF")"
		[ -z "$LILO_DEVICE" ] ||
			LOADER="$($DETECTLOADER "$LILO_DEVICE")"
	fi
	if [ "$LOADER" = "lilo" -o "$LOADER" = "LILO" ]; then
		"$LILO" ||:
	fi
fi

exit 0
