#!/bin/bash

set +e

mount -o remount,rw /dev/ram0 /

[ -d /dev ] || mkdir -m 0755 /dev
[ -d /root ] || mkdir -m 0700 /root
[ -d /sys ] || mkdir /sys
[ -d /proc ] || mkdir /proc
[ -d /tmp ] || mkdir /tmp
mkdir -p /var/lock
mount -t sysfs -o nodev,noexec,nosuid sysfs /sys
mount -t proc -o nodev,noexec,nosuid proc /proc
# Some things don't work properly without /etc/mtab.
ln -sf /proc/mounts /etc/mtab

umount -l /dev 2>/dev/null || true
mount -t devtmpfs -o mode=0755 udev /dev
sleep 1;

[ -e /dev/console ] || mknod -m 0600 /dev/console c 5 1
[ -e /dev/null ] || mknod /dev/null c 1 3
mkdir /dev/pts
mount -t devpts -o noexec,nosuid,gid=5,mode=0620 devpts /dev/pts || true
mount -t tmpfs -o "noexec,nosuid,size=10%,mode=0755" tmpfs /run
mkdir /run/initramfs
# compatibility symlink for the pre-oneiric locations
ln -s /run/initramfs /dev/.initramfs

# Export relevant variables
export ROOT=
export ROOTFLAGS=
export ROOTFSTYPE=
export BOOT=
export quiet=n
export readonly=y
export rootmnt=
export panic=
export blacklist=
export resume=
export resume_offset=
export recovery=

export MODE=ukit
export break=
export debug=n

export netif=
export netimgurl=
export netscript=

export bootdisk=
export bootpart=
export sysdisk=
export prismpart=

# mdadm needs hostname to be set. This has to be done before the udev rules are called!
if [ -f "/etc/hostname" ]; then
        /bin/hostname -b -F /etc/hostname 2>&1 1>/dev/null
fi

# Bring in the main config
[ -f /conf/initramfs.conf ] && . /conf/initramfs.conf
for conf in conf/conf.d/*; do
	[ -f ${conf} ] && . ${conf}
done
. /scripts/functions

export BLUE GREEN RED YELLOW  CYAN  MAGENTA DONE
export -f echo_blue echo_green echo_green echo_red echo_yellow echo_cyan echo_magenta

# Parse command line options
for x in $(cat /proc/cmdline); do
	case $x in
	break=*)
		break=${x#break=}
		;;
	mode=*)
		MODE=${x#mode=}
		;;
	netif=*)
		netif=${x#netif=}
		;;
	netimgurl=*)
		netimgurl=${x#netimgurl=}
		;;
	netscript=*)
		netscript=${x#netscript=}
		;;
	sysdisk=*)
		sysdisk=${x#sysdisk=}
		;;
	prismpart=*)
		prismpart=${x#prismpart=}
		;;
	bootdisk=*)
		bootdisk=${x#bootdisk=}
		;;
	bootpart=*)
		bootpart=${x#bootpart=}
		;;
	quiet)
		quiet=y
		;;
	debug)
		debug=y
		quiet=n
		set -x
		;;
	esac
done

maybe_break top

# export BOOT variable value for compcache,
# so we know if we run from casper
export BOOT

run_scripts /scripts/init-top

# start login prompt on tty2/3/S0
( while true; do /usr/bin/setsid /sbin/agetty tty2; sleep 1; done ) >/dev/null 2>/dev/null &
( while true; do /usr/bin/setsid /sbin/agetty tty3; sleep 1; done ) >/dev/null 2>/dev/null &
( while true; do /usr/bin/setsid /sbin/agetty ttyS0; sleep 1; done ) >/dev/null 2>/dev/null &

# silence the dmesg
dmesg -n 1

maybe_break pre-init

run_scripts /scripts/pre-init

echo_green "System booted in $MODE mode"
echo_green "  NETIF=$NETIF"
echo_green "  NETMAC=$NETMAC"
echo_green "  NETIP=$NETIP"
echo_green "  NETIMGURL=$NETIMGURL"
echo_green "  NETSCRIPT=$NETSCRIPT"
echo_green "  BOOTDISK=$BOOTDISK"
echo_green "  BOOTPART=$BOOTPART"
echo_green "  SYSDISK=$SYSDISK"
echo_green "  PRISMPART=$PRISMPART"

# export discovered env vars
export NETIF NETMAC NETIP NETIMGURL NETSCRIPT
export BOOTDISK BOOTPART SYSDISK PRISMPART

maybe_break init

[ "x$debug" = "xy" ] && echo_green "sleep 3 seconds before proceed to run init.$MODE"
[ "x$debug" = "xy" ] && sleep 3

[ -x /init.$MODE ] && exec /init.$MODE

panic "Could not execute init.$MODE"

