#!/bin/sh
#
# This script installs any number of kernels into their proper boot
# directories.
#
# usage: installkernel KERNEL ...
#
# $Id: installkernel,v 1.10 2004/09/22 17:29:29 mtm Exp $
#

BOOTDIR=/boot
SRCDIR=/usr/src

# write_header logfile msg
#	Writes msg in header format into logfile
#
write_header()
{
	local msg log
	log="$1"
	shift
	msg="$*"

	echo '----------------------------------------------------------' \
	    >> "${log}"
	echo ":::: $msg" >> "${log}"
	echo '----------------------------------------------------------' \
	    >> "${log}"
}

# install_kernel kernel logfile
#	Installs kernel into a directory named after the kernel
#	name. If the directory is not empty it moves the kernel
#	to an appropriately named 'old' directory. It keeps a
#	log of it's output in logfile.
#
install_kernel()
{
	local kern logfile

	kern=$1
	logfile=$2
	if [ -z "$kern" -o -z "$logfile" ]; then
		echo "!! error !!"
		return 1
	fi

	# Start out logfile
	#
	echo "BEGIN KERNEL INSTALL: $kern" > "${logfile}"
	echo '' >> "${logfile}"

	# Remove the old kernel.old if it exists
	#
	if [ -n "$doMove" -a -d "${BOOTDIR}/kernel.old.${kern}" ]; then
		write_header "${logfile}" "Removing old kernel."
		rm -rf ${BOOTDIR}/kernel.old.${kern} >> "${logfile}" 2>&1
		echo -n " deleted old"
	fi

	# Move current kernel to kernel.old
	#
	if [ -n "$doMove" -a -d "${BOOTDIR}/kernel.${kern}" ]; then
		write_header "${logfile}" "Moving current kernel to old directory."
		mv ${BOOTDIR}/kernel.${kern} ${BOOTDIR}/kernel.old.${kern} \
		    >> "${logfile}" 2>&1
		echo -n " moved current"
	fi

	# Install new kernel
	#
	write_header "${logfile}" "Installing new kernel."
	( new_kernel ${kern} >> "${logfile}" 2>&1 )
	if [ $? -eq 0 ]; then
		echo -n " installed new"
	else
		echo -n " ERROR"
	fi

	echo '.'
}

new_kernel()
{
	local kern

	kern=$1
	cd "$SRCDIR"
	make installkernel \
	    KERNCONF=${kern} INSTKERNNAME=kernel.${kern}
}

### Main ####

kernels="${INSTALL_KERNELS}"
doMove=yes
me=`/usr/bin/basename "$0"`

args=`getopt DK: $*`
if [ $? -ne 0 ]; then
	echo "usage: $me [-D] [-K kernel,...]"
	echo "       -D : Install the new kernel over the current one without"
	echo "            deleting the old kernel."
	echo "       -K kernel,... : Comma separated list of kernels"
	echo ""
	echo "ENVIRONMENT VARIABLES"
	echo "    INSTALL_KERNELS : list of kernels to install"
	exit 1
fi
set -- $args
for i ; do
	case "$i" in
		-D)
			doMove=
			shift
			;;
		-K)
			_saved_ifs="$IFS"
			IFS=","
			kernels=
			for k in $2 ; do
				kernels="$kernels $k"
			done
			IFS="$_saved_ifs"
			shift;shift
			;;
	esac
done

log=
for k in $kernels ; do
	log=/usr/a/logs/kernel.install-${k}.`date +%Y.%m.%d.%H:%M`
	echo -n "Installing kernel $k:"
	install_kernel $k $log
done
