#!/bin/sh
# Lukasz Pawelczyk <havner@pld-linux.org> 2004
# $Id: linuxrc,v 1.28 2006/07/12 11:09:45 havner Exp $

# This is IDE/SCSI detection script run in livecd initrd

trap "" 1 2 3 15

getparam()
{
	CMDLINE=" `cat /proc/cmdline` "

	case "$CMDLINE" in
		*\ $1=*)
			;;
		*\ $1\ *)
			return 0;
			;;
		*)
			return 1;
			;;
	esac
	result="${CMDLINE##*$1=}"
	result="${result%%[     ]*}"
	echo "$result"
	return 0
}

# Reset fb color mode
RESET="]R"
# ANSI COLORS
# Erase to end of line
CRE="
[K"
# Clear and reset Screen
CLEAR="c"
# Normal color
NORMAL="[0;39m"
# RED: Failure or error message
RED="[1;31m"
# GREEN: Success message
GREEN="[1;32m"
# YELLOW: Descriptions
YELLOW="[1;33m"
# BLUE: System mesages
BLUE="[1;34m"
# MAGENTA: Found devices or drivers
MAGENTA="[1;35m"
# CYAN: Questions
CYAN="[1;36m"
# BOLD WHITE: Hint
WHITE="[1;37m"

echo "${GREEN}Welcome to PLD Live CD 1.0${NORMAL}"

echo "${BLUE}Preparing rootfs${NORMAL}"
mount -n -t proc none /proc
echo 0 > /proc/sys/kernel/printk
mount -n -t tmpfs -o size=1G,nr_inodes=12k none /rootfs
mkdir -p /rootfs/media/LiveCD

if getparam debug > /dev/null; then
	LOG=/dev/console
	echo 7 > /proc/sys/kernel/printk
	set -x
else
	LOG=/dev/null
	echo 5 > /proc/sys/kernel/printk
fi

modprobe cdrom > $LOG 2>&1
modprobe loop > $LOG 2>&1
modprobe isofs > $LOG 2>&1
modprobe squashfs > $LOG 2>&1
modprobe nls_iso8859-1 > $LOG 2>&1
modprobe nls_cp437 > $LOG 2>&1

echo "${YELLOW}Autodetecting SCSI controller(s):${NORMAL}"
COUNT=0
SCSI=0
for I in `detect /pci/scsi.pci | uniq`; do
	SCSI=1
	echo "SCSI${COUNT}:   $I"
	modprobe ${I} > $LOG 2>&1
	let $((++COUNT))
done
if [ "${SCSI}" = "0" ]; then
	echo "None known SCSI controller found"
fi

echo "${YELLOW}Autodetecting SATA controller(s):${NORMAL}"
COUNT=0
SATA=0
for I in `detect /pci/sata.pci | uniq`; do
	SATA=1
	echo "SATA${COUNT}:   $I"
	modprobe ${I} > $LOG 2>&1
	let $((++COUNT))
done
if [ "${SATA}" = "0" ]; then
	echo "None known SATA controller found"
fi

if [ "${SCSI}" = "1" -o "${SATA}" = "1" ]; then
	echo "${BLUE}Loading SCSI/SATA modules${NORMAL}"
	modprobe sr_mod > $LOG 2>&1
	modprobe sd_mod > $LOG 2>&1
	modprobe sg > $LOG 2>&1
fi

echo "${YELLOW}Autodetecting IDE controller(s):${NORMAL}"
COUNT=0
IDE=0
for I in `detect /pci/ide.pci | uniq`; do
	IDE=1
	echo "IDE${COUNT}:    $I"
	modprobe ${I} > $LOG 2>&1
	let $((++COUNT))
done
if [ "${IDE}" = "0" ]; then
	echo "None known IDE controller found, falling back to ide-generic"
	modprobe ide-generic > $LOG 2>&1
	modprobe ide-disk > $LOG 2>&1
	modprobe ide-cd > $LOG 2>&1
else
	echo "${BLUE}Loading IDE modules${NORMAL}"
	modprobe ide-disk > $LOG 2>&1
	modprobe ide-cd > $LOG 2>&1
fi

if getparam shell > /dev/null; then
	/bin/sh
fi

if getparam HDD > /dev/null; then	# ugly hack to run livecd from hdd for tests
	HDD_fs=ext3
	HDD_dev=hda1
	if getparam HDD_fs > /dev/null; then
		HDD_fs=`getparam HDD_fs`
	fi
	if getparam HDD_dev > /dev/null; then
		HDD_dev=`getparam HDD_dev`
	fi
	modprobe $HDD_fs > $LOG 2>&1
	mkdir -p /rootfs/mnt/hd
	mount -n -o ro -t $HDD_fs /dev/$HDD_dev /rootfs/mnt/hd
	mount -n -o ro,loop -t iso9660 /rootfs/mnt/hd/livecd.iso /rootfs/media/LiveCD
else
	echo "${MAGENTA}Searching for PLD Live CDROM${NORMAL}"
	DEVICES="$DEVICES /dev/hd[cd] /dev/hd[ab] /dev/scd[0-9] /dev/hd[e-l]"
	for I in $DEVICES
	do
		echo -n "${CRE}${BLUE}Looking for CDROM in: ${MAGENTA}${I}${NORMAL} "
		if mount -n -o ro -t iso9660 "${I}" /rootfs/media/LiveCD > $LOG 2>&1
		then
			if [ -f /rootfs/media/LiveCD/squashfs ]; then
				echo "${CRE}${GREEN}PLD Live CDROM found at ${MAGENTA}${I}${GREEN}...${NORMAL}"
				PLDLIVECD="${I}"
				break
			fi
			umount /rootfs/media/LiveCD > $LOG 2>&1
		fi
	done
	if [ "$PLDLIVECD" = "" ]; then
		echo "${CRE}${RED}PLD Live CDROM not found !!! Either your controller has not"
		echo "been properly detected or you have ejected CD during boot."
		echo "Try running with debug option."
		echo ""
		echo "Restart your computer now and send bugreport.${NORMAL}"
		read NOTHING
	fi
fi

if getparam md5 > /dev/null; then
	echo "${MAGENTA}Checking md5sum, please wait...${NORMAL}"
	if [ "`cd /rootfs/media/LiveCD; md5sum squashfs`" = "`cat /rootfs/media/LiveCD/squashfs.md5`" ]; then
		echo "${GREEN}Md5sum ok.${NORMAL}"
	else
		echo -n "${RED}Md5sum mismatch, press enter if you want to continue.${NORMAL}"
		read NOTHING
	fi
fi

cd /rootfs
tar xzpf /rootfs/media/LiveCD/ramdisk.tgz
cd /

if getparam copycd > /dev/null; then
	echo "${YELLOW}Copying iso to ram, please wait...${NORMAL}"
	cp /rootfs/media/LiveCD/squashfs /rootfs
	umount /rootfs/media/LiveCD > $LOG 2>&1
	rm -rf /rootfs/media/LiveCD
	echo "${YELLOW}Done, you can now eject your cdrom${NORMAL}"
	losetup /dev/loop7 /rootfs/squashfs
else
	losetup /dev/loop7 /rootfs/media/LiveCD/squashfs
fi
mount -n -t squashfs -o ro /dev/loop7 /rootfs/live

if getparam X > /dev/null || getparam x > /dev/null; then
	INITPARAM="5 "
fi

if getparam noX > /dev/null || getparam nox > /dev/null; then
	INITPARAM="3 "
fi

echo "${BLUE}Changing rootfs${NORMAL}"
cd /rootfs
mount -o bind live/bin-bind bin > $LOG 2>&1
mount -o bind live/sbin-bind sbin > $LOG 2>&1
mount -o bind live/boot-bind boot > $LOG 2>&1
mount -o bind live/lib-bind lib > $LOG 2>&1
mount -o bind live/usr-bind usr > $LOG 2>&1
umount /proc > $LOG 2>&1

[ ! -d initrd ] && mkdir initrd
pivot_root . initrd

exec /usr/sbin/chroot . /sbin/init ${INITPARAM} <dev/console >dev/console 2>&1
