#!/bin/sh -e

WITHOUT_RC_COMPAT=1
. /etc/init.d/functions

charset='utf8'
destdir="/mnt/destination"
datadir="/usr/share/install2/data"
cmdline=

action_begin_msg() {
	[ -z "$*" ] || printf '%s ' "$*"
}

action_end_msg() {
	local rc=$1
	if [ "$BOOTUP" = color ]; then
		[ $rc = 0 ] && echo_success || echo_failure
	fi
	echo
}

unset action
action() {
	action_begin_msg "$1"
	shift
	$*
	local rc=$?
	action_end_msg "$rc"
	return $rc
}

remount_root_rw() {
	[ -d "$1" ] || return 0
	mkdir -p -- "/tmp/root$1"
	mount -n -tunionfs -o dirs="/tmp/root$1"=rw:"$1"=ro "/tmp/root$1" "$1"
}

mount_fs() {
	mount -n -t proc proc /proc
	mount -n -t sysfs sysfs /sys
	mount -n -t tmpfs tmpfs /tmp
	mount -n -t tmpfs tmpfs /mnt

	remount_root_rw /var
	remount_root_rw /etc

	# Make mountpoint for new system
	mkdir -p -- /mnt/destination
}

set_locale() {
	local lang=
	for d in $cmdline; do
		[ -z "${d%%lang=*}" ] || continue
		lang="${d#lang=}"
		break
	done
	[ -n "$lang" ] || return 0
	locale -a |cut -d. -f1 |fgrep -xqs "$lang" || return 0

	unset \
		LANGUAGE \
		LC_CTYPE \
		LC_NUMERIC \
		LC_TIME \
		LC_COLLATE \
		LC_MONETARY \
		LC_MESSAGES \
		LC_PAPER \
		LC_NAME \
		LC_ADDRESS \
		LC_TELEPHONE \
		LC_MEASUREMENT \
		LC_IDENTIFICATION \
		LC_ALL \
		||:
	export LANG="$lang.$charset"
}

gen_xorgconf() {
	local d= drv="vesa"
	sed -r -e '/[[:space:]]*Load[[:space:]]+"(glx|dri)"/d' /usr/share/alterator-x11/xorg.conf > /etc/X11/xorg.conf

	for d in $cmdline; do
		[ -z "${d%%xdriver=*}" ] || continue
		d="${d#xdriver=}"
		if [ -n "$d" ]; then
			drv="$d"
			printf '%s' ", found xdriver='$drv'"
			break
		fi
	done

	[ "$drv" = "auto" ] &&
		{ video_autosetup    /etc/X11/xorg.conf ||:; } ||
		{ video_setup "$drv" /etc/X11/xorg.conf ||:; }

	d="$(xconf -g /etc/X11/xorg.conf)" ||:
	[ -z "$d" ] || printf '%s' ", try '$d'"

	monitor_autosetup /etc/X11/xorg.conf ||:
}

set_evmsconf() {
	local exclude= dev mpoint fstype opts dummy
	while read dev mpoint fstype opts dummy; do
		[ "$mpoint" = "/" -o "$mpoint" = "/image" ] || continue
		[ -n "${dev%%/dev/*}" ] || exclude="$exclude ${dev##*/}*"
	done < /proc/mounts
	[ -f "/etc/evms.conf" ] || cp -f -- "$datadir/evms.conf" /etc/
	sed -i -e "0,/^sysfs_devices /{p;d}; s/^\([[:space:]]*\)exclude = \[ \]/\1exclude = [$exclude loop* ]/" /etc/evms.conf
}

set_design() {
	# Enforce DejaVu fonts and size
	cat >/etc/fonts/conf.d/00.installer.conf<<-EOF
	<?xml version="1.0"?>
	<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
	<fontconfig>
	  <match target="font">
	    <edit name="family" mode="assign"><string>DejaVu Sans</string></edit>
	  </match>
	</fontconfig>
	EOF
}

set_network() {
	# Rewrite resolv.conf
	>/etc/resolv.conf
	[ -z "$DOMAINNAME" ]  || printf %s\\n "search $DOMAINNAME" >>/etc/resolv.conf
	[ -z "$DNS_SERVER" ]  || printf %s\\n "nameserver $DNS_SERVER" >>/etc/resolv.conf
	[ -z "$DNS_SERVER2" ] || printf %s\\n "nameserver $DNS_SERVER2" >>/etc/resolv.conf

	# Rewrite hosts
	echo "127.0.0.1 localhost.localdomain localhost" > /etc/hosts
	[ -z "$IPADDR" -o -z "$HOSTNAME" ] ||
		printf %s\\n "$IPADDR $HOSTNAME${DOMAINNAME:+.$DOMAINNAME $HOSTANME}" >> /etc/hosts

	[ ! -x "/sbin/update_chrooted" ] || /sbin/update_chrooted all
}

check_autoinstall() {
	grep -qs '\(^\|[[:space:]]\)ai\([[:space:]]\|$\)' /proc/cmdline &&
		export AUTOINSTALL=1 ||
		export AUTOINSTALL=
}

if_run_debug_shell()
{
	fgrep -iwqs 'instdebug' /proc/cmdline || return 0
	echo 'Executing shell for debug purposes'
	HOME=/root bash -l
}

# Mount
action "Mounting filesystems" mount_fs
cmdline="$(cat /proc/cmdline)"

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

set_locale

check_autoinstall

# Set the system clock (when /etc/adjtime is present)
[ ! -s /etc/adjtime ] || service clock start

service udevd start

# Open additional VTs with running shell for debug purposes
openvt -l -- env HOME=/root bash -l
openvt -l -- env HOME=/root bash -l

# Create network settings
action "Preparing resolv.conf and /etc/hosts" set_network

# Remove some devices from evms config
action "Preparing evms.conf" set_evmsconf
cat /proc/sys/dev/raid/speed_limit_min >/proc/sys/dev/raid/speed_limit_max

action "Acquiring installation metadata" get-manifest

if [ -n "$AUTOINSTALL" -a -s "/tmp/metadata/autoinstall.scm" ]; then
	rc=0
	printf "Starting autoinstaller...\n"
	alterator-autoinstall "/tmp/metadata/autoinstall.scm" || rc=$?
	printf "autoinstall done: rc=$rc\n"
	install2-cleanup
	exit $rc
fi

action "Generating Xorg config" gen_xorgconf

# Enforce DejaVu fonts, font size
action "Configuring fontconfig" set_design

# debug
if_run_debug_shell

# Try to start Xserver
rc=0
printf "Starting Xorg server...\n"
cmd="xinit /usr/sbin/alterator-install2 -- vt7 -dpms -ac -dpi 80 -logfile /tmp/x11.log"
if ! $cmd >>/tmp/install2.log 2>&1; then
	for drv in fbdev vesa vga; do
		video_setup "$drv" /etc/X11/xorg.conf
		$cmd >>/tmp/install2.log 2>&1 && break || rc=$?
	done
fi

if [ -d "$destdir/root" ]; then
	mkdir -m700 -- "$destdir/root/.install-log"
	cd "$destdir/root/.install-log"
	for f in install2 wizard basesystem x11; do
		[ -f "/tmp/$f.log" ] || continue
		sed 's/\<\(passwd[12] "\)[^"]*"/\1*"/g' <"/tmp/$f.log" >"$f.log"
	done
fi

# debug
if_run_debug_shell

[ "$rc" -ne 0 ] || install2-cleanup

exit $rc
