#!/bin/sh

. /usr/share/alterator/build/backend3.sh

PROG="savesettings"
destdir="/mnt/destination"
stage1_mpoint="/image"
cdrom_stage3="/media/cdrom"

exec_chroot() {
	env -i PATH="$PATH" HOME="/root" TMPDIR="/tmp" chroot "$destdir" "$@" >/dev/null
}

run_chroot() {
	env -i PATH="$PATH" HOME="/root" TMPDIR="/tmp" chroot "$destdir" "$@"
}

append_fstab() {
	local src dst
	src="$1"; shift
	dst="$1"; shift

	mountpoint -q "$src" || return 0

	mkdir -p -- "$destdir/$dst"
	fgrep " $src " /proc/mounts |
		sed -e "s# $src # $dst #" \
		    -e 's#,addr=[^, ]\+##' >> "$destdir/etc/fstab"
}

sources_list() {
	mkdir -p -- "$destdir/etc/apt/sources.list.d"
	printf 'rpm %s ALTLinux base disk\n' "$1" >"$destdir/etc/apt/sources.list.d/sources.installer.list"
}

prepare_chroot() {
	mount --bind "/dev" "$destdir/dev"
	mount --bind "/dev/pts" "$destdir/dev/pts"
	mount --bind "/proc" "$destdir/proc"
	mount --bind "/sys" "$destdir/sys"

	mkdir -p -- "$destdir/tmp/alterator"
	mount --bind /tmp/alterator "$destdir/tmp/alterator"

	local src_mpoint= dst_mpoint=
	case "$METHOD" in
		cdrom)
			src_mpoint="$stage1_mpoint"
			dst_mpoint="$destdir/$cdrom_stage3"
			;;
		disk|nfs)
			src_mpoint="$stage1_mpoint"
			dst_mpoint="$destdir/mnt/disk"
			sources_list "file:/mnt/disk"

			# Save mountpoint
			append_fstab "$src_mpoint" "/mnt/disk"
			;;
		http|ftp)
			sources_list "$METHOD://$HOST$PREFIX"
			return 0
			;;
		*) return 0
			;;
	esac
	mkdir -p -- "$dst_mpoint"
	mount --bind "$src_mpoint" "$dst_mpoint"
}

save_fstab() {
	[ ! -f "/tmp/fstab" ] ||
		cat "/tmp/fstab" >> "$destdir/etc/fstab"
}

# XXXLegion: TODO: add cdrom to fstab if any.
save_cdrom() {
	[ "$METHOD" = "cdrom" ] || return 0

	local cdromdev= dev= mpoint= fstype= opts= dummy=
	while read dev mpoint fstype opts dummy; do
		[ "$stage1_mpoint" = "$mpoint" ] || continue
		cdromdev="$dev"
		break
	done < /proc/mounts
	[ -n "$cdromdev" ] || return 0
	printf '%s\t%s\t%s\t%s\t%s\n' "$cdromdev" "$cdrom_stage3" "udf,iso9660" "ro,noauto,user" "0 0" >> "$destdir/etc/fstab"
	exec_chroot apt-cdrom --cdrom "$cdrom_stage3" --no-mount -o dir::etc=/etc/apt/sources.list.d add >/dev/null
}

save_network() {
	exec_chroot ifup lo

	case "$METHOD" in
		cdrom|disk) return 0 ;;
	esac

	exec_chroot alterator-cmdline /net-general action "write" hostname "$HOSTNAME" search "$DOMAINNAME" dns "$DNS_SERVER${DNS_SERVER2:+
$DNS_SERVER2}"

	local iface="$(run_chroot ip addr show up |
			sed -n -e '/^[[:digit:]]\+:/!d' -e '/^[[:digit:]]\+: lo:/d' -e 's/^[[:digit:]]\+: \([^:]\+\):.*/\1/p' -e 'q')"
	mkdir -p -- "$destdir/etc/net/ifaces"
	printf '%s' "IFACE='$iface' BOOTPROTO='$BOOTPROTO' " >&2
	case "$BOOTPROTO" in
		adsl_pppoe)
			exec_chroot alterator-cmdline "/net-pppoe" action "new" name "$iface" login "$USER" password "$PASS"
			;;
		static)
			exec_chroot alterator-cmdline "/net-tcp/$iface" action "write" ip "$IPADDR" mask "$NETBITS" default "$GATEWAY" state '#t'
			;;
		dhcp)
			exec_chroot alterator-cmdline "/net-tcp/$iface" action "write" dhcp '#t' state '#t'
			;;
	esac
	[ -z "$iface" ] || exec_chroot ifup "$iface"
}

save_i18n() {
	[ ! -f "/etc/sysconfig/i18n" ] ||
		cp -af "/etc/sysconfig/i18n" "$destdir/etc/sysconfig/"	
	[ ! -f "/etc/alterator/syskbd/data/consolefont" ] ||
		cp -af "/etc/alterator/syskbd/data/consolefont" "$destdir/etc/sysconfig/"
	[ ! -f "/etc/sysconfig/keyboard" ] ||
		cp -af "/etc/sysconfig/keyboard" "$destdir/etc/sysconfig/"
	[ ! -f "/etc/sysconfig/keyboard" ] ||
		cp -af "/etc/sysconfig/keyboard" "$destdir/etc/sysconfig/"
	[ ! -f "/etc/X11/xinit/Xkbmap" -o ! -d "$destdir/etc/X11/xinit" ] ||
		cp -af "/etc/X11/xinit/Xkbmap" "$destdir/etc/X11/xinit/"
}

save_aptprofile() {
	[ -s "/tmp/metadata/alterator-apt.profile" ] || return 0
	mkdir -p -- "$destdir/etc/alterator/apt.d"
	cp -af -- "/tmp/metadata/alterator-apt.profile" "$destdir/etc/alterator/apt.d/install3"
}

save_initrd() {
	cat >"$destdir/tmp/instkernel"<<-EOF
	#!/bin/sh -efu
	kern_list="\$(rpmquery -a --qf='%{version}-%{name}-%{release}\\n' kernel-image-*)"
	[ "\$(printf '%s\\n' "\$kern_list" |wc -l)" -eq 1 ] || touch /etc/lilo.conf
	printf '%s\\n' "\$kern_list" |
	    sed -e 's#kernel-image-##' |
	    xargs -ri /sbin/installkernel -n '{}'
	rm -f /tmp/instkernel
	EOF
	chmod +x "$destdir/tmp/instkernel"
	exec_chroot "/tmp/instkernel"
}

save_portmap() {
	#[ "$METHOD" = "nfs" ] || return 0
	local conf="$destdir/etc/sysconfig/portmap"
	[ -f "$conf" ] || return 0
	sed -i 's,#\(PORTMAP_ARGS="-l".*\),\1,' "$conf"
	exec_chroot chkconfig portmap on
}

save_mdadm() {
	local conf="$destdir/etc/mdadm.conf"
	[ -s "$conf" ] || return 0
	sed -i '/## EOF ##/d' "$conf"
	run_chroot mdadm --examine --scan >>"$conf"
}

on_message()
{
        case "$in_action" in
        	write)
			echo "$PROG: write init" >&2
			for f in prepare_chroot save_fstab save_i18n \
				 save_cdrom save_aptprofile save_initrd \
				 save_portmap save_network save_mdadm
			do
				printf '%s ' "$PROG: function $f" >&2
				rc="done"
				eval "$f" || rc="fail"
				echo "$rc" >&2
			done
			sync
			echo '()'
                        ;;
		*)
			echo '#f'
			;;
        esac
}

message_loop
