#!/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 xdriver 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=}"
		[ -n "$d" ] || continue
		xdriver="$d"
		printf 'found xdriver="%s"' "$xdriver"
		drv="$xdriver"
		break
	done

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

	d="$(xconf -d /etc/X11/xorg.conf)" ||:
	[ -z "$d" ] || printf '%strying "%s"' "${xdriver:+, }" "$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
	echo 'Starting autoinstaller...'
	alterator-autoinstall /tmp/metadata/autoinstall.scm || rc=$?
	printf "autoinstall done: rc=%s\n" "$rc"
	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
echo 'Starting Xorg server...'
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
