#!/bin/bash
#
# Installation script to SD card for Always Innovating OS
# version 1.26 as of 2011-03-16
# Usage: ./install-sd.sh [-aAbfsUW] [-u url_mirror] [-o /path/to/binaries/] [-z /path/archive.zip] [-v version] -d /dev/sd?
#
# ***** Recommended usage is the following *****
# sudo -s
# ./install-sd.sh -d /dev/mmcblk0
# This will reformat the card and install the latest from the web
#
# The script must be run as root
# Options are:
# -a: advanced developer editions (default)
# -A: user editions (not supported any more)
# -b: for beagleboard
# -f: avoid confirmation message
# -o /path/to/binaries: specify a local folder with the binaries already downloaded 
# default is the current folder
# -p: for pandaboard
# -s: stop the script before the second partition is touched
# -u: specify a mirror url for binaries download
# -U: use the alwaysinnovating.com repository (not recommended)
# -v version: force a specific version
# -W: no swap space
# -z /path/archive.zip: specify a single zip archive including all binaries
# default is the latest
#
# Released under the GPL


DEST="None"
ORIG="."
CONFIRM=1
DEV=1
VERSION=latest
SHORT=0
SWAP=1
BASEURL="http://www.alwaysinnovating.com/release/"
MIRROR="mirror"
ARCHIVE="none"
FILE1="ai-os.squashfs"
FILE2="ubuntu.squashfs"
FILE3="android.squashfs"
FILE4="chromium.squashfs"
FILE1DEV="ai-os-dev.squashfs"
MIRROR1=""
MIRROR2=""
MIRROR3=""
MIRROR4=""
RANDOM_FIX=${RANDOM}
TMP="/tmp/ai_${RANDOM_FIX}"
BOARD=touchbook

umount_all() {
for ((i=0;i<9;i++)); do
	mount | grep -q "${DEST}${i}"
	if [ $? = 0 ]; then
		umount ${DEST}${i}
	fi
	mount | grep -q "${DEST}${i}"
	if [ $? = 0 ]; then
		sleep 2
		umount ${DEST}${i}
	fi
	mount | grep -q "${DEST}${i}"
	if [ $? = 0 ]; then
		sleep 5
		umount ${DEST}${i}
	fi
done
}

rotdash() {
	p=$1
	while [ -d /proc/$p ]
	do
		echo -e -n '/' ; sleep 1
		echo -e -n '-' ; sleep 1
		echo -e -n '\' ; sleep 1
		echo -e -n '|' ; sleep 1
	done
}

special_wget() {
	echo $2 | grep "dl.free.fr" > /dev/null
	if [ $? = 0 ]; then
		UA='Opera/9.23 (Windows NT 5.1; U; fr)'
		wget -q --user-agent="$UA" --save-cookies cookie.txt --output-document=- --keep-session-cookies "$2" > /dev/null
		wget -O $1 -c --user-agent="$UA" --load-cookies cookie.txt $2
		rm cookie.txt
	else
		wget -O $1 $2
	fi
}

get_mirror() {
if [ $MIRROR = "mirror" ]; then
	list=(`wget -O - ${BASEURL}${VERSION}/mirror.txt`)
	tot1=0
	tot2=0
	tot3=0
	tot4=0
	j=0;k=0;l=0;m=0
	for ((i=0;i<$((${#list[*]} / 3));i++)); do
		if [ "${list[$(($i * 3))]}" = "${FILE1}" ]; then
			tot1=$((${tot1} + ${list[$(($i * 3 + 1))]}))
			pond1[$j]=${list[$(($i * 3 + 1))]}
			list1[$j]=${list[$(($i * 3 + 2))]}
			j=$((${j} + 1))			
		elif [ "${list[$(($i * 3))]}" = "${FILE2}" ]; then
			tot2=$((${tot2} + ${list[$(($i * 3 + 1))]}))
			pond2[$k]=${list[$(($i * 3 + 1))]}
			list2[$k]=${list[$(($i * 3 + 2))]}
			k=$((${k} + 1))			
		elif [ "${list[$(($i * 3))]}" = "${FILE3}" ]; then
			tot3=$((${tot3} + ${list[$(($i * 3 + 1))]}))
			pond3[$l]=${list[$(($i * 3 + 1))]}
			list3[$l]=${list[$(($i * 3 + 2))]}
			l=$((${l} + 1))			
		elif [ "${list[$(($i * 3))]}" = "${FILE4}" ]; then
			tot4=$((${tot3} + ${list[$(($i * 3 + 1))]}))
			pond4[$m]=${list[$(($i * 3 + 1))]}
			list4[$m]=${list[$(($i * 3 + 2))]}
			m=$((${m} + 1))			
		fi
	done

	if [ ${tot1} = 0 ]; then
		MIRROR1=${MIRROR}${VERSION}/${FILE1}
	else
		pos=$((${RANDOM} % ${tot1} + 1))
		i=0
		tmp=${pond1[0]}
		while [ ${tmp} -lt ${pos} ]; do
			i=$((${i} + 1))
		tmp=$((${tmp} + ${pond1[${i}]}))
		done
		MIRROR1=${list1[${i}]}
	fi

	if [ ${tot2} = 0 ]; then
		MIRROR2=${MIRROR}${VERSION}/${FILE2}
	else
		pos=$(($RANDOM % ${tot2} + 1))
		i=0
		tmp=${pond2[0]}
		while [ ${tmp} -lt ${pos} ]; do
			i=$((${i} + 1))
			tmp=$((${tmp} + ${pond2[${i}]}))
		done
		MIRROR2=${list2[${i}]}
	fi

	if [ ${tot3} = 0 ]; then
		MIRROR3=${MIRROR}${VERSION}/${FILE3}
	else
		pos=$(($RANDOM % ${tot3} + 1))
		i=0
		tmp=${pond3[0]}
		while [ ${tmp} -lt ${pos} ]; do
			i=$((${i} + 1))
			tmp=$((${tmp} + ${pond3[${i}]}))
		done
		MIRROR3=${list3[${i}]}
	fi

	if [ ${tot4} = 0 ]; then
		MIRROR4=${MIRROR}${VERSION}/${FILE4}
	else
		pos=$(($RANDOM % ${tot4} + 1))
		i=0
		tmp=${pond4[0]}
		while [ ${tmp} -lt ${pos} ]; do
			i=$((${i} + 1))
			tmp=$((${tmp} + ${pond4[${i}]}))
		done
		MIRROR4=${list4[${i}]}
	fi
else
	MIRROR1=${MIRROR}${VERSION}/${FILE1}
	MIRROR2=${MIRROR}${VERSION}/${FILE2}
	MIRROR3=${MIRROR}${VERSION}/${FILE3}
	MIRROR4=${MIRROR}${VERSION}/${FILE4}
fi
}

while getopts aAbd:fo:psu:Uv:Wz: opt
do
	case "$opt" in
		a) DEV=1;;
		A) DEV=0;;
		b) BOARD="beagleboard";;
		d) DEST="$OPTARG";;
		f) CONFIRM=0;;
		o) ORIG="$OPTARG";;
		p) BOARD="pandaboard";;
		s) SHORT=1;;
		u) MIRROR="$OPTARG";;
		U) MIRROR="$BASEURL";;
		v) VERSION="$OPTARG";;
		W) SWAP=0;;
		z) ARCHIVE="$OPTARG";;
	esac
done

if [ "m`id -u`" != "m0" ]; then
	echo "You must be root"
	exit 1
fi

which rsync > /dev/null
if [ $? = 0 ]; then
	CP="rsync --progress -L"
else
	CP=cp
fi

if [ ${DEST} = "None" ]; then
	echo "*******************************"
	echo "ERROR: You need to specify the SD card destination"
	echo "Example: ./install-sd.sh -d /dev/sdb"
	echo "*******************************"
	exit 1
fi


echo "*******************************"
echo "Please wait - installing 0/5"
echo "*******************************"

if [ $CONFIRM = 1 ]; then
	echo "*******************************"
	echo "Are you sure you want to erase the card in ${DEST}? (yes?no)"
	echo "You need to type yes in lower case to proceed"
	echo "*******************************"
	read ANSWER2
	if [ "${ANSWER2}" != "yes" ]; then
		exit 1
	fi
fi

if [ ${DEST} = "/dev/mmcblk0" ]; then
	DEST=/dev/mmcblk0p
fi
if [ ${DEST} = "/dev/mmcblk1" ]; then
	DEST=/dev/mmcblk1p
fi
umount_all
mount | grep -q "${DEST}"
if [ $? = 0 ]; then
	echo "*******************************"
	echo "ERROR: ${DEST} still seems to be mounted"
	echo "*******************************"
	exit 1
fi


if [ ${DEST} = "/dev/mmcblk0p" ]; then
	DEST=/dev/mmcblk0
fi
if [ ${DEST} = "/dev/mmcblk1p" ]; then
	DEST=/dev/mmcblk1
fi

if [ ! -b ${DEST} ]; then
	echo "*******************************"
	echo "An error has occured. Disk can't be accessed"
	echo "*******************************"
	exit 1
fi

let CYL=$(fdisk -s ${DEST})*2/255/63
if [ ${CYL} -lt 10 ]; then
	echo "*******************************"
	echo "An error has occured. Cylinder can't be calculated"
	echo "*******************************"
	exit 1
fi

dd if=/dev/zero of=${DEST} bs=1024 count=1024 &> /dev/null
if [ ${VERSION} = "2009-08.a" -o ${VERSION} = "2009-08.b" -o ${VERSION} = "2009-09.a" ]; then
	sfdisk -D -C${CYL} -H255 -S63 -f ${DEST} &> /dev/null << EOF
,5,c,*
,63,
,
EOF
elif [ ${VERSION} = "2009-09.b" -o ${VERSION} = "2009-09.c" -o ${VERSION} = "2009-11.a" ]; then
	sfdisk -D -C${CYL} -H255 -S63 -f ${DEST} &> /dev/null << EOF
,5,c,*
,62,
,62,82
,
EOF
else
	let PART2=$(($CYL-62-305-2))
	sfdisk -D -C${CYL} -H255 -S63 -f ${DEST} &> /dev/null << EOF
,305,c,*
,${PART2}
,62,82
EOF
fi

if [ ${DEST} = "/dev/mmcblk0" ]; then
	DEST=/dev/mmcblk0p
fi
if [ ${DEST} = "/dev/mmcblk1" ]; then
	DEST=/dev/mmcblk1p
fi

sleep 2
umount_all
fdisk -l | grep -q "${DEST}1"; TEST1=$?;
fdisk -l | grep -q "${DEST}2"; TEST2=$?;
fdisk -l | grep -q "${DEST}3"; TEST3=$?;
if [ ${VERSION} = "2009-09.b" -o ${VERSION} = "2009-09.c" -o ${VERSION} = "2009-11.a" ]; then
	fdisk -l | grep -q "${DEST}4"; TEST4=$?;
else
	TEST4=0
fi
if [ ${SWAP} = 0 ]; then
	TEST3=0
fi
if [ $TEST1 != 0 -o $TEST2 != 0 -o $TEST3 != 0 -o $TEST4 != 0 ]; then
	echo "*******************************"
	echo "ERROR: ${DEST} doesn't contain the right number of partitions."
	echo "This is a problem somewhere. Try to remove and reinsert the card."
	echo "*******************************"
	exit 1
fi

if [ $CONFIRM = 1 ]; then
	echo "*******************************"
	echo "Are you sure you want to install AI OS on ${DEST}? (yes|no)"
	echo "You need to type yes in lower case to proceed"
	echo "*******************************"
	read ANSWER4
	if [ "${ANSWER4}" != "yes" ]; then
		exit 1
	fi
fi

echo "*******************************"
echo "Please wait - installing 1/5"
echo "*******************************"
umount_all
mount | grep -q "${DEST}"
if [ $? = 0 ]; then
	echo "*******************************"
	echo "ERROR: ${DEST} still seems to be mounted"
	echo "*******************************"
	exit 1
fi
mkfs.vfat -F 32 ${DEST}1 > /dev/null

BOARD_=""
if [ ${BOARD} != "touchbook"  ]; then
	BOARD_=".${BOARD}"
fi
echo "*******************************"
echo "Please wait - installing 2/5"
echo "*******************************"
mkdir -p ${TMP}_1 > /dev/null
mount -o iocharset=utf8 ${DEST}1 ${TMP}_1 > /dev/null
if [ ${ARCHIVE} != "none" ]; then
	unzip ${ARCHIVE} mlo -d ${TMP}_1/ > /dev/null
elif [ -r "${ORIG}/mlo${BOARD_}" ]; then
	cp "${ORIG}/mlo${BOARD_}" ${TMP}_1/mlo
else
	wget -O ${TMP}_1/mlo${BOARD_} ${BASEURL}${VERSION}/mlo
fi

sync > /dev/null
umount_all

echo "*******************************"
echo "Please wait - installing 3/5"
echo "*******************************"
mkdir -p ${TMP}_1 > /dev/null
mount -o iocharset=utf8 ${DEST}1 ${TMP}_1 > /dev/null
if [ ${ARCHIVE} != "none" ]; then
	unzip ${ARCHIVE} u-boot.bin -d ${TMP}_1/ > /dev/null
elif [ -r "${ORIG}/u-boot.bin${BOARD_}" ]; then
	cp "${ORIG}/u-boot.bin${BOARD_}" ${TMP}_1/u-boot.bin
else
	wget -O ${TMP}_1/u-boot.bin${BOARD_} ${BASEURL}${VERSION}/u-boot.bin
fi
if [ ${BOARD} = "touchbook" ]; then
	if [ ${ARCHIVE} != "none" ]; then
		unzip ${ARCHIVE} uImage -d ${TMP}_1/ > /dev/null
	elif [ -r "${ORIG}/uImage" ]; then
		cp "${ORIG}/uImage" ${TMP}_1/uImage
	else
		wget -O ${TMP}_1/uImage ${BASEURL}${VERSION}/uImage
	fi
fi
if [ ${VERSION} \> "2010-04" ]; then
	if [ ${ARCHIVE} != "none" ]; then
		unzip ${ARCHIVE} uImage2 -d ${TMP}_1/ > /dev/null
	elif [ -r "${ORIG}/uImage2" ]; then
		cp "${ORIG}/uImage2" ${TMP}_1/uImage2
	else
		wget -O ${TMP}_1/uImage2 ${BASEURL}${VERSION}/uImage2
	fi
fi
if [ ${ARCHIVE} != "none" ]; then
	unzip ${ARCHIVE} ai-ui.tbz2 -d ${TMP}_1/ > /dev/null
elif [ -r "${ORIG}/ai-ui.tbz2" ]; then
	cp "${ORIG}/ai-ui.tbz2" ${TMP}_1/ai-ui.tbz2
else
	wget -O ${TMP}_1/ai-ui.tbz2 ${BASEURL}${VERSION}/ai-ui.tbz2
fi
if [ ${ARCHIVE} != "none" ]; then
	unzip ${ARCHIVE} ai-install.tbz2 -d ${TMP}_1/ > /dev/null
elif [ -r "${ORIG}/ai-install.tbz2" ]; then
	cp "${ORIG}/ai-install.tbz2" ${TMP}_1/ai-install.tbz2
else
	wget -O ${TMP}_1/ai-install.tbz2 ${BASEURL}${VERSION}/ai-install.tbz2
fi
umount_all


if [ ${SHORT} = 1 ]; then
	exit 0
fi

echo "*******************************"
echo "Please wait - installing 4/5"
echo "Less than 2 minutes"
echo "*******************************"
if [ ${VERSION} = "2009-08.a" -o ${VERSION} = "2009-08.b" -o ${VERSION} = "2009-09.a" ]; then
	mkfs.ext3 ${DEST}3 > /dev/null
	tune2fs -c 0 -i 0 ${DEST}3 > /dev/null
elif [ ${VERSION} = "2009-09.b" -o ${VERSION} = "2009-09.c" -o ${VERSION} = "2009-11.a" ]; then
	mkswap ${DEST}3 > /dev/null
	mkfs.ext3 ${DEST}4 > /dev/null
	tune2fs -c 0 -i 0 ${DEST}4 > /dev/null
else
	if [ ${SWAP} = 1 ]; then
		mkswap ${DEST}3 > /dev/null
	fi
	mkfs.ext3 ${DEST}2 > /dev/null 2>&1 &
	rotdash $!
	tune2fs -c 0 -i 0 ${DEST}2 > /dev/null
fi

echo "*******************************"
echo "Please wait - installing 5/5"
echo "Around 5 minutes if files are local"
echo "Otherwise download time"
echo "*******************************"
if [ ${VERSION} = "2009-08.a" -o ${VERSION} = "2009-08.b" -o ${VERSION} = "2009-09.a" -o ${VERSION} = "2009-09.b" -o ${VERSION} = "2009-09.c" -o ${VERSION} = "2009-11.a" ]; then
	if [ -r "${ORIG}/image.squashfs" ]; then
		dd if="${ORIG}/image.squashfs" of=${DEST}2 bs=10240 > /dev/null
	else
		wget -O - ${BASEURL}${VERSION}/image.squashfs > ${DEST}2
	fi
else
	if [ ${VERSION} = "2009-12.a" ]; then
		FILE2="tbuntu.squashfs"
	fi
	mkdir -p ${TMP}_2 > /dev/null
	mount ${DEST}2 ${TMP}_2 > /dev/null
	mkdir -p ${TMP}_2/.images/
	mkdir -p ${TMP}_2/common-data/
	if [ ${VERSION} \> "2010-04" -a ${DEV} = 1 ]; then
		FILE1=${FILE1DEV}
	fi
	if [ ${ARCHIVE} != "none" ]; then
		unzip ${ARCHIVE} ${FILE1} -d ${TMP}_2/.images/ > /dev/null
	elif [ -r "${ORIG}/${FILE1}" ]; then
		$CP "${ORIG}/${FILE1}" ${TMP}_2/.images/${FILE1} 2>&1
	else
		if [ -z ${MIRROR1} ]; then
			get_mirror
		fi
		special_wget ${TMP}_2/.images/${FILE1} ${MIRROR1}
	fi
	if [ ${ARCHIVE} != "none" ]; then
		unzip ${ARCHIVE} ${FILE2} -d ${TMP}_2/.images/ > /dev/null
	elif [ -r "${ORIG}/${FILE2}" ]; then
		$CP "${ORIG}/${FILE2}" ${TMP}_2/.images/${FILE2} 2>&1
	else
		if [ -z ${MIRROR2} ]; then
			get_mirror
		fi
		special_wget ${TMP}_2/.images/${FILE2} ${MIRROR2}
	fi
	if [ ${ARCHIVE} != "none" ]; then
		unzip ${ARCHIVE} ${FILE3} -d ${TMP}_2/.images/ > /dev/null
	elif [ -r "${ORIG}/${FILE3}" ]; then
		$CP "${ORIG}/${FILE3}" ${TMP}_2/.images/${FILE3} 2>&1
	else
		if [ -z ${MIRROR3} ]; then
			get_mirror
		fi
		special_wget ${TMP}_2/.images/${FILE3} ${MIRROR3}
	fi
	if [ ${VERSION} \> "2010-12.a" ]; then
		if [ ${ARCHIVE} != "none" ]; then
			unzip ${ARCHIVE} ${FILE4} -d ${TMP}_2/.images/ > /dev/null
		elif [ -r "${ORIG}/${FILE4}" ]; then
			$CP "${ORIG}/${FILE4}" ${TMP}_2/.images/${FILE4} 2>&1
		else
			if [ -z ${MIRROR4} ]; then
				get_mirror
			fi
			special_wget ${TMP}_2/.images/${FILE4} ${MIRROR4}
		fi
	fi
	sync > /dev/null
	umount_all
	rmdir ${TMP}_2 > /dev/null
fi

sync > /dev/null
umount_all
rmdir ${TMP}_1 > /dev/null

echo "*******************************"
echo "Installation completed"
echo "*******************************"

exit 0

