#!/bin/sh

# dyne:III live-boot script
# by Denis Roio <jaromil@dyne.org>
# GNU GPL v3

PREREQ="blacklist udev"

prereqs()
{
	echo "$PREREQ"
}

case $1 in
# get pre-requisites
prereqs)
	prereqs
	exit 0
	;;
esac

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

# we operate on boot type local
bootconf=$(egrep '^BOOT=' /conf/initramfs.conf | tail -1)
if [ "$bootconf" != "BOOT=local" ]
then
    # Not a local boot : nothing to do
    exit 0
fi


# superseded by command line
for ARGUMENT in $(cat /proc/cmdline); do
	case "${ARGUMENT}" in
		dyneiso=*)
			DYNE_ISO="${ARGUMENT#dyneiso=}"
			;;
	esac
done

# dyneiso not configured, nothing to do
if [ -z $DYNE_ISO ]; then exit 0; fi


echo "Scanning local storage for dyne:III ISO file $DYNE_ISO..."
# Load USB modules
num_block=$(ls -l /sys/block | wc -l)
for module in vfat ntfs sd_mod uhci-hcd ehci-hcd ohci-hcd usb-storage
do
    modprobe -q -b ${module}
done
modprobe ntfs
modprobe vfat

udevadm trigger
udevadm settle

# For some reason, udevsettle does not block in this scenario,
# so we sleep for a little while.
#
# See https://bugs.launchpad.net/ubuntu/+source/casper/+bug/84591
for timeout in 5 4 3 2 1
do
    sleep 1
    if [ $(ls -l /sys/block | wc -l) -gt ${num_block} ]
    then
	break
    fi
done

mkdir -p /dyne

check_dyne() {
    sysdev="${1}"
    devname=$(sys2dev "${sysdev}")

    # no partitions, skip checking
    if ! [ -r "${devname}1" ]; then return 1; fi

    for dev in $(ls ${devname}[0-9]);
    do
	echo "Opening ${devname} ... "
	mount -o ro "${dev}" /dyne
	if [ $? != 0 ];
	then
	    echo "cannot mount partition, skipping."
	    continue
	fi
	if [ -r "/dyne/${DYNE_ISO}" ]; then
	    log_success_msg "ISO ${DYNE_ISO} found in ${dev}"
	    # this is what adds parameters to boot
	    touch /conf/param.conf
	    echo "export FROMISO=${dev}${DYNE_ISO}" >> /conf/param.conf
	    return 0
	else
	    echo "not found."
	    umount /dyne
	fi
    done
    return 1
}

res=1
# removable-usb
for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -vE "/(loop|ram|dm-|fd)")
do
    for dev in $(subdevices "${sysblock}")
    do
	if check_dyne "${dev}"
	then
	    echo "Booting $DYNE_ISO"
	    res=0 #success
	fi
    done
done

umount /dyne
return $res
