#!/bin/sh

#set -e

# initramfs-tools header

PREREQ=""

prereqs()
{
	echo "${PREREQ}"
}

case "${1}" in
	prereqs)
		prereqs
		exit 0
		;;
esac

# live-initramfs header

if [ -n "${NOUSER}" ]
then
	exit 0
fi

. /scripts/live-functions
. /scripts/live-helpers

log_begin_msg "Adding live session user..."

# live-initramfs script

mountpoint=/cdrom

is_updates_path ()
{
	# Driver packages are stored in ubuntu-drivers/<kver>/
	# subdirectory. Each package contains a module for a specific
	# kernel flavour.

	path=$1
	kbase=$(uname -r | sed 's/^\([0-9]*\.[0-9]*\.[0-9]*\)-.*/\1/')
	update_dir="$path/ubuntu-drivers/$kbase"

	if [ -d "$update_dir" ]
	then
		if [ "$(echo $update_dir/*_$DPKG_ARCH.deb)" != \
			"$update_dir/*_$DPKG_ARCH.deb" ]
		then
			echo "$update_dir"
			return 0;
		fi
	fi

	return 1;
}

is_nice_device ()
{
	sysfs_path="${1#/sys}"

	if /lib/udev/path_id "${sysfs_path}" | grep -E -q "ID_PATH=(usb|pci-[^-]*-(ide|scsi|usb))"
	then
		return 0
	fi

	return 1
}

is_supported_fs ()
{
	# FIXME: do something better like the scan of supported filesystems
	fstype="${1}"

	case ${fstype} in
		vfat|iso9660|udf|ext2|ext3|ntfs)
			return 0
			;;
	esac

	return 1
}

check_dev_updates ()
{
	sysdev="${1}"
	devname="${2}"

	if [ -z "${devname}" ]
	then
		devname=$(sys2dev "${sysdev}")
	fi

	fstype=$(get_fstype "${devname}")

	if is_supported_fs ${fstype}
	then
		mount -t ${fstype} -o ro "${devname}" $mountpoint || continue

		if is_updates_path $mountpoint
		then
			return 0
		else
			umount $mountpoint
		fi
	fi

	return 1
}

find_driver_updates ()
{
	for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -v loop | grep -v ram)
	do
		devname=$(sys2dev "${sysblock}")
		fstype=$(get_fstype "${devname}")

		if /lib/udev/cdrom_id ${devname} > /dev/null
		then
			if check_dev_updates "null" "${devname}"
			then
				return 0
			fi
		elif is_nice_device "${sysblock}"
		then
			for dev in $(subdevices "${sysblock}")
			do
				if check_dev_updates "${dev}"
				then
					return 0
				fi
			done
		fi
	done

	return 1
}

pulsate ()
{
	if [ -x /sbin/usplash_write ]
	then
		/sbin/usplash_write "PULSATE"
	fi
}

updates="false"

for x in $(cat /proc/cmdline)
do
	case $x in
		debian-installer/driver-update=*)
			updates=${x#debian-installer/driver-update=}
			;;
	esac
done

if [ "$updates" != "true" ]
then
	log_end_msg
	exit 0
fi

# Not sure what to do for network installs. I assume there isn't even a CD
# for this anyway, so fail.
if [ -n "${NETBOOT}" ]
then
	log_end_msg
	exit 0;
fi

#if chroot /root [ -f /etc/gdm/gdm-cdd.conf ]
#then
#	GDMCONF=/etc/gdm/gdm-cdd.conf
#else
#	GDMCONF=/etc/gdm/gdm.conf
#fi

if [ -x /usr/bin/eject ]
then
	eject
fi

log_wait_msg "Insert a driver CD and press ENTER ($DPKG_ARCH)"

log_begin_msg "Looking for driver update CD"

for i in 0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13
do
	updates_root=$(find_driver_updates)

	if [ "${updates_root}" ]
	then
		break;
	fi

	sleep 1
done

log_end_msg

if [ -z "${updates_root}" ]
then
	log_begin_msg "Could not find driver updates"
	log_wait_msg "Re-insert install CD and press ENTER"
	exit 0
fi

log_begin_msg "Copying driver updates to temporary location"

mkdir -p /tmp/driver-updates
cp $updates_root/*_$DPKG_ARCH.deb /tmp/driver-updates/
umount $mountpoint

if [ -x /usr/bin/eject ]
then
	eject
fi

log_end_msg

log_wait_msg "Re-insert install CD and press ENTER."
