#!/bin/sh -e

WITH_ACTION=1
. install2-init-functions
. shell-config

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

stderr_to_log()
{
	exec 4>&2 2>/tmp/install2.log
}

stderr_to_stderr()
{
	exec 2>&4
}

mount_fs()
{
	[ -n "$INSTALL2_INIT" ] || return 0
	"$install2_bindir"/mount-unionfs /var
	"$install2_bindir"/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
	shell_config_set "$install_variables" ALTERATOR_DESTDIR "$ALTERATOR_DESTDIR"
}

set_duringinstall()
{
	DURING_INSTALL=1
	export DURING_INSTALL
}

set_locale()
{
	[ -z "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ] || return 0
	LANG=
	export LANG
	local i18n_conf=/etc/sysconfig/i18n
	local locale_conf=/etc/locale.conf

	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"
	[ ! -f "$i18n_conf" ] || echo LANG="$lang.$charset" > "$i18n_conf"
	[ ! -f "$locale_conf" ] || echo LANG="$lang.$charset" > "$locale_conf"
}

set_autoinstall()
{
	AUTOINSTALL=
	export AUTOINSTALL

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

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"
	shell_config_set "$install_variables" CDROMDEV "$CDROMDEV"
}

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/}"
	shell_config_set "$install_variables" DEVICE "$DEVICE"
}

if_run_debug_shell()
{
	cmdline_has_arg instdebug || return 0
	[ -z "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ] || return 0
	[ -n "$INSTALL2_INIT" ] || stderr_to_stderr
	tty 2>&1 >/dev/null || exec </dev/console >/dev/console 2>&1
	echo 'Executing shell for debug purposes'
	HOME=/root setsid -c bash -l
	[ -n "$INSTALL2_INIT" ] || stderr_to_log
}

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
}

x11presetdrv()
{
	[ -n "$INSTALL2_INIT" ] || return 0
	[ -f /etc/rc.d/init.d/x11presetdrv ] || return 0
	service x11presetdrv start 2>/tmp/x11presetdrv.log
	update_splash x11presetdrv
}

if [ -z "$INSTALL2_INIT" ]; then
	> /tmp/install2.log
	chmod 600 /tmp/install2.log
	stderr_to_log
fi

# Mount
touch /var/rw-test || action 'Mounting filesystems' mount_fs

# Fix HOSTNAME when boot with make-initrd-bootchain
if [ "$HOSTNAME" = "(none)" ]; then
	export HOSTNAME="localhost.localdomain"
	hostname "$HOSTNAME"
fi

# 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
shell_config_set "$install_variables" HOME "$HOME"
shell_config_set "$install_variables" TMPDIR "$TMPDIR"
shell_config_set "$install_variables" INSTALLER "$INSTALLER"

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

# Create tmpfiles
[ -z "$INSTALL2_INIT" ] ||
	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

[ -z "$INSTALL2_INIT" ] || service udevd start 2>/tmp/udevd.log
update_splash udev

x11presetdrv

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

# create empty logs with strict rights
> /tmp/initinstall.log
> /tmp/preinstall.log
> /tmp/postinstall.log
> /tmp/wizard.log
> /tmp/pkg-install.log
> /tmp/x11.log
chmod 600 /tmp/initinstall.log
chmod 600 /tmp/preinstall.log
chmod 600 /tmp/postinstall.log
chmod 600 /tmp/wizard.log
chmod 600 /tmp/pkg-install.log
chmod 600 /tmp/x11.log

# create destination directory
mkdir -p "$destdir"

[ -n "$DISPLAY" ] || [ -n "$WAYLAND_DISPLAY" ] ||
	"$install2_bindir"/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...'
	alterator-autoinstall "$AUTOINSTALL" && text=done || text=FAILED
	echo "autoinstall $text"
else
	if [ -n "$DISPLAY" ] || [ -n "$WAYLAND_DISPLAY" ]; then
		echo livecd-start > /usr/share/install2/installer-livecd-steps
		cat /usr/share/install2/installer-steps |sed '/sysconfig/d'|
			sed '/release-notes/d' >> /usr/share/install2/installer-livecd-steps
		echo livecd-finish >> /usr/share/install2/installer-livecd-steps
		alterator-wizard -f /usr/share/install2/installer-livecd-steps || rc=$?
	else
		if cmdline_has_arg headless; then
			"$install2_bindir"/alterator-vnc
		else
			if cmdline_has_arg wayland; then
				echo "Starting Wayland server..."
				mkdir -p /run/user/0
				chmod 700 /run/user/0
				export XDG_RUNTIME_DIR=/run/user/0
				export WLR_NO_HARDWARE_CURSORS=1
				cmd="cage -d -s -m last "$install2_bindir"/alterator-install2"
				chvt 7
				$cmd >/tmp/install2.log 2>&1
				chvt 1
			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 "$install2_bindir"/alterator-install2 -- $xinit_args"
				if ! $cmd >/tmp/install2.log 2>&1 ; then
					for drv in $auto_drivers; do
						# xinit must failed before run alterator-wizard
						[ ! -s /tmp/wizard.log ] || break
						echo "Error running Xorg server, trying with driver $drv..."
						"$install2_bindir"/xorg_conf_setup "$drv" "$XORG_CONF"
						rc=0
						$cmd >>/tmp/install2.log 2>&1 && break || rc=$?
					done
				fi
			fi
		fi
	fi
fi

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

save_logs

# Unmount destination
if [ -z "$INSTALL2_INIT" ]; then
	. install2-remount-functions
	! mountpoint -q "$destdir" ||
		action 'Unmount destination' umount_chroot ||:
	if [ -n "$DISPLAY" ] || [ -n "$WAYLAND_DISPLAY" ]; then
		start_alteratord
	fi
fi

mountpoint -q "$destdir" || rm -r "$destdir" ||:

exit $rc
