#!/bin/sh
# Author: Fox_exe
# Skype: Fox_experience

export PATH=/bin:/sbin:/usr/bin:/usr/sbin

echo "# Loading, please wait..."

# ========= VARS =========
SWAP_DEV=/dev/md0
ROOT_DEV=/dev/md1
DATA_DEV=/dev/md2
DISK1=/dev/sda
DISK2=/dev/sdb
PARTSCRIPT="mklabel gpt \
mkpart primary 0% 512MB \
mkpart primary 512MB 4096MB \
mkpart primary 4096MB 100% \
set 1 raid on \
set 2 raid on \
set 3 raid on"
# Temp vars
BUTTON_STATUS=0
ROOTFS=/mnt/root
TEST=0
DISK1_MD0=missing
DISK1_MD1=missing
DISK1_MD2=missing
DISK2_MD0=missing
DISK2_MD1=missing
DISK2_MD2=missing

# ========= FUNC =========
run_shell () {
	echo "# Runing a shell..."

	# Enable RED HDD leds to inform user
	led hdd1 on
	led hdd2 on

	# Start network and run telnet server
	ifup -a
	sleep 1
	telnetd -l /bin/ash

	# Run UART shell
	exec 0</dev/console
	exec 1>/dev/console
	exec 2>/dev/console
	exec setsid cttyhack ash
}

prepare_disks () {
	if [ $TEST == 1 ]; then
		echo "# Disks already formatted, but something went wrong."
		run_shell
	fi

	# Someone use disk? Fuck off!
	umount $ROOT_DEV 2> /dev/null
	mdadm -S /dev/md0 2> /dev/null
	mdadm -S /dev/md1 2> /dev/null
	mdadm -S /dev/md2 2> /dev/null
	wait && sync

	# Too brutal...
	if [ -b $DISK1 ]; then
		echo "# ${DISK1} exists, do partitions..."
		parted --script $DISK1 $PARTSCRIPT 1>/dev/null 2>/dev/null
		echo "# Done."
		# yeah.. stupid way...
		DISK1_MD0=${DISK1}1
		DISK1_MD1=${DISK1}2
		DISK1_MD2=${DISK1}3
	fi

	if [ -b $DISK2 ]; then
		echo "# ${DISK2} exists, do partitions..."
		parted --script $DISK2 $PARTSCRIPT 1>/dev/null 2>/dev/null
		echo "# Done."
		DISK2_MD0=${DISK2}1
		DISK2_MD1=${DISK2}2
		DISK2_MD2=${DISK2}3
	fi

	echo "# Creating mdraids..."
	# Say "yes" to any mdadm questions. Someone find best way? Tell me!
	mdadm --create --force $SWAP_DEV --raid-devices=2 --level=raid1 --run $DISK1_MD0 $DISK2_MD0 1>/dev/null 2>/dev/null
	mdadm --create --force $ROOT_DEV --raid-devices=2 --level=raid1 --run $DISK1_MD1 $DISK2_MD1 1>/dev/null 2>/dev/null
	mdadm --create --force $DATA_DEV --raid-devices=2 --level=raid1 --run $DISK1_MD2 $DISK2_MD2 1>/dev/null 2>/dev/null
	wait && sync

	echo "# Creating filesystems..."
	mkswap $SWAP_DEV 1>/dev/null 2>/dev/null
	mkfs.ext4 -F $ROOT_DEV 1>/dev/null 2>/dev/null
	mkfs.ext4 -F $DATA_DEV 1>/dev/null 2>/dev/null
	wait && sync
	
	echo "# Uploading rootfs to new root partition..."
	mount $ROOT_DEV $ROOTFS || run_shell
	tar xf /dev/mtdblock3 -C $ROOTFS 2> /dev/null
	umount $ROOTFS 2>/dev/null
	wait && sync

	# Anti-loop
	TEST=1
	check_init

	echo "# Preparing new dis(s) done. Continue booting..."
}

check_init () {
	if [ -b $SWAP_DEV ] && [ -b $ROOT_DEV ] && [ -b $DATA_DEV ]; then
		mount $ROOT_DEV $ROOTFS || run_shell
		# Maybe need something more useful...
		if [ ! -h $ROOTFS/linuxrc ]; then
			echo "# linuxrc not found!"
			run_shell
		fi
	else
		echo "# $ROOT_DEV not exist!"
		BUTTON_STATUS=0
		
		# Madness...
		led hdd1 on
		led hdd2 off
		sleep 1
		led hdd1 off
		led hdd2 on
		sleep 1
		led hdd1 on
		led hdd2 off
		sleep 1
		led hdd1 off
		led hdd2 on
		sleep 1
		led hdd1 off
		led hdd2 off

		BUTTON_STATUS=`cat /sys/class/gpio/gpio64/value`
		if [ $BUTTON_STATUS == 1 ]; then
			BUTTON_STATUS=0
			prepare_disks
		else
			run_shell
		fi
	fi
}

ask_for_stop () {
	key='boot'
	BUTTON_STATUS=`cat /sys/class/gpio/gpio64/value`
	led hdd2 on
	read -r -p "### Press any key to stop and run shell... (2)" -n1 -t2 key
	led hdd2 off
	if [ "$key" != 'boot' ] || [ $BUTTON_STATUS == 1 ]; then
		run_shell
	fi
}

# ========= CODE =========

echo "# Mounting filesystems..."
# hide error messages, if kernel already mount /dev
mount -t devtmpfs -o size=10M,mode=0755 udev /dev > /dev/null 2>&1
mkdir -p /dev/pts
mount -t devpts -o noexec,nosuid,gid=5,mode=0620 devpts /dev/pts > /dev/null 2>&1
mount -t sysfs -o nodev,noexec,nosuid sysfs /sys
mount -t tmpfs -o "nosuid,size=20%,mode=0755" tmpfs /run
mount -t proc -o nodev,noexec,nosuid proc /proc

# Reset button init
echo 64 > /sys/class/gpio/export
echo 1 > /sys/class/gpio/gpio64/active_low
#BUTTON_STATUS=`cat /sys/class/gpio/gpio64/value`

echo "# Check disk and init"
ask_for_stop
led init 0
mdadm -As
check_init

echo "# Switch to real OS..."
ask_for_stop

# hide error messages, if kernel already mount /dev
#mount -n -o move /dev $ROOTFS/dev > /dev/null 2>&1
#mkdir -p $ROOTFS/dev/pts
#mount -n -o move /dev/pts $ROOTFS/dev/pts > /dev/null 2>&1
#mount -n -o move /sys $ROOTFS/sys || run_shell
#mount -n -o move /run $ROOTFS/run || run_shell
#mount -n -o move /proc $ROOTFS/proc || run_shell
#mkdir -p $ROOTFS/initrd
#pivot_root $ROOTFS $ROOTFS/initrd || run_shell
#exec /linuxrc || run_shell

umount /sys 2> /dev/null
umount /proc 2> /dev/null
umount /dev/pts 2> /dev/null
umount /dev 2> /dev/null
exec switch_root -c /dev/console $ROOTFS /linuxrc || run_shell
