#!/bin/sh -e

WITH_ACTION=1
. install2-init-functions

charset=utf8
cmdline="$(cat /proc/cmdline)"

PLYMOUTH=/bin/plymouth

update_splash()
{
	[ -x $PLYMOUTH ] || return 0
	$PLYMOUTH --update $1 ||:
}

stop_splash()
{
	[ -x $PLYMOUTH ] || return 0
	$PLYMOUTH quit ||:
}

mount_fs()
{
	mount-unionfs /var
	mount-unionfs /etc
}

set_alterator_datadir()
{
	ALTERATOR_DESTDIR="$destdir"
	ALTERATOR_DATADIR="/usr/share/alterator:$destdir/usr/share/alterator:$datadir"
	GUILE_LOAD_PATH="$destdir/usr/share/guile/site:$destdir/usr/share/guile/1.8:$destdir/usr/share/guile"
	export ALTERATOR_DESTDIR
	export ALTERATOR_DATADIR
	export GUILE_LOAD_PATH
}

set_duringinstall()
{
	DURING_INSTALL=1
	export DURING_INSTALL
}

set_locale()
{
	LANG=
	export LANG

	lang="`sed -n 's/^.*\<lang=\([a-z_A-Z]\+\)\>.*$/\1/p' /proc/cmdline`"
	[ -n "$lang" ] || lang=en_US
	locale -a 2>/dev/null |cut -d. -f1 | grep -Fxqs "$lang" || return 0

	LANG="$lang.$charset"
	echo LC_ALL="$lang.$charset" > /etc/sysconfig/i18n
}

set_autoinstall()
{
	AUTOINSTALL=
	export AUTOINSTALL

	if cmdline_has_arg ai ; then
		AUTOINSTALL='/tmp/metadata/autoinstall.scm'
	fi
}

set_cdromdev()
{
	CDROMDEV=
	export CDROMDEV

	[ "$METHOD" = cdrom ] || [ "$METHOD" = disk ] ||  return 0
	CDROMDEV="$(sed -n 's,^\(/dev/[^[:space:]]\+\) '"$image_dir"' .*,\1,p' /proc/mounts)"
	case "$CDROMDEV" in
	/dev/sr[0-9]*|/dev/cdrom*|/dev/dvd*)
		;;
	*)
		CDROMDEV=
		return 0
		;;
	esac
	[ -b "$CDROMDEV" ] ||
		fatal "cannot find cdrom device file $CDROMDEV for $image_dir"
}

set_device()
{
	DEVICE=
	export DEVICE
	[ "$METHOD" = cdrom ] || [ "$METHOD" = disk ] || return 0
	[ -z "$CDROMDEV" ] || return 0
	DEVICE="$(sed -n 's,^\(/dev/[^[:space:]]\+\) '"$image_dir"' .*,\1,p' /proc/mounts)"
	DEVICE="${DEVICE#/dev/}"
}

if_run_debug_shell()
{
	cmdline_has_arg instdebug || return 0
    if [ -x "$PLYMOUTH" ]; then
        $PLYMOUTH quit ||:
    fi
	echo 'Executing shell for debug purposes'
	HOME=/root bash -l
}

save_logs()
{
	[ -d "$destdir/root" ] || return 0
	mkdir -p -m700 -- "$destdir/root/.install-log"
	# Copy alteratord.log from temporary dir to /tmp
	cp /run/alteratord/alteratord.log /tmp ||:
	# save logs
	for f in initinstall preinstall postinstall install2 pkg-install remount alteratord x11; do
		[ -f "/tmp/$f.log" ] || continue
		sed -r 's;( passwd_?([12]|auto) ")([^"]|[\\]["])*";\1*";g' <"/tmp/$f.log" \
			>"$destdir/root/.install-log"/"$f.log"
	done
	# save screenshots
	mkdir -p -m700 -- "$destdir/root/.install-log/screenshots"
	for f in /tmp/alterator-screenshot-*.*; do
		[ ! -f "$f" ] || cp "$f" "$destdir"/root/.install-log/screenshots/ ||:
	done
}

# Mount
touch /var/rw-test || action 'Mounting filesystems' mount_fs
# Mount runfs to /run:
# otherwise udevd init script will do it itself and
# will override directories created by systemd-tmpfiles.
mountpoint -q /run || mount -n -t tmpfs -o mode=755 runfs /run
update_splash mount 

# Define HOME and TMPDIR into writable place
export HOME=/tmp
export TMPDIR=/tmp
export INSTALLER=1

# Workaround for ALT bug #35350:
# remove /var/lock directory
if [ -d /var/lock ] && [ ! -L /var/lock ]; then
	rm -r /var/lock/
fi

# Create tmpfiles
systemd-tmpfiles --remove --create --boot --exclude-prefix=/dev >/tmp/tmpfiles.log 2>&1

# do not assemble raid automatically (restore with start_mdraid)
if [ -s /lib/udev/rules.d/64-md-raid-assembly.rules ]; then
	mv /lib/udev/rules.d/64-md-raid-assembly.rules /tmp
fi

service udevd start 2>/tmp/udevd.log
update_splash udev

set_alterator_datadir
set_locale
update_splash locale

set_autoinstall
update_splash autoinstall

set_duringinstall
update_splash duringinstall

set_cdromdev
update_splash cdromdev

set_device
update_splash device

initinstall 2>>/tmp/initinstall.log | tee -a /tmp/initinstall.log
update_splash finish

if_run_debug_shell
rc=0

PATH=/usr/lib/alterator-x11:$PATH
XORG_CONF='/etc/X11/xorg.conf'

if [ -s "$AUTOINSTALL" ]; then
	echo 'Starting autoinstaller...'
	stop_splash
	alterator-autoinstall "$AUTOINSTALL" && text=done || text=FAILED
	echo "autoinstall $text"
else
	if grep -q headless /proc/cmdline ; then
		stop_splash
		alterator-vnc
	else
		echo 'Starting Xorg server...'

		auto_drivers="$(video_scan -s drivers)"

		xinit_args='vt7 -dpms -ac -nolisten tcp -logfile /tmp/x11.log'
		eval $(grep -s ^xinit_args= /etc/xserver-args) ||:
		cmd="xinit /usr/sbin/alterator-install2 -- $xinit_args"
		stop_splash

		if ! $cmd >>/tmp/install2.log 2>&1; then
			for drv in $auto_drivers; do
				echo "Error running Xorg server, trying with driver $drv..."
				xorg_conf_setup "$drv" "$XORG_CONF"
				rc=0
				$cmd >>/tmp/install2.log 2>&1 && break || rc=$?
			done
		fi
	fi
fi

if_run_debug_shell
[ "$rc" -ne 0 ] ||
	postinstall 2>>/tmp/postinstall.log | tee -a /tmp/postinstall.log

save_logs

exit $rc
