#!/bin/sh -efu

alterator_api_version=1

. install2-init-functions
. alterator-sh-functions
. install2-remount-functions

log_file="${TMPDIR:-/tmp}/install-fs.log"

install_fs() {
	copied_fs=''
	if [ -r '/image/Metadata/copied-fs.tar' ]; then
		echo 'Use the uncompressed copied fs' >> "$log_file"
		copied_fs='/image/Metadata/copied-fs.tar'
	elif [ -r '/image/Metadata/copied-fs.tar.xz' ]; then
		echo 'Use the compressed copied fs' >> "$log_file"
		copied_fs='/image/Metadata/copied-fs.tar.xz'
	elif [ -r '/usr/share/install2/metadata/copied-fs.tar' ]; then
		echo 'Use the uncompressed copied fs' >> "$log_file"
		copied_fs='/usr/share/install2/metadata/copied-fs.tar'
	elif [ -r '/usr/share/install2/metadata/copied-fs.tar.xz' ]; then
		echo 'Use the compressed copied fs' >> "$log_file"
		copied_fs='/usr/share/install2/metadata/copied-fs.tar.xz'
	else
		write_error "install_fs: No readable copied fs"
		return 1
	fi

	echo 'Start of file system installation' >> "$log_file"
	echo >> "$log_file"

	tar xvf "$copied_fs" -C "$destdir" 2>&1 >> "$log_file"

	echo >> "$log_file"
	echo 'End of file system installation' >> "$log_file"
}

update_uuids() {
	declare -A mountpoint_to_new_uuid
	while IFS= read -r line; do
		uuid=$(      echo "$line" | cut -d ' ' -f 1 | sed 's/^UUID=//')
		mountpoint=$(echo "$line" | cut -d ' ' -f 2)

		mountpoint_to_new_uuid["$mountpoint"]="$uuid"
	done < <(sed -E -e 's/\t+/ /g' -e 's/ +/ /g' /tmp/fstab | grep '^UUID=')

	while IFS= read -r line; do
		old_uuid=$(  echo "$line" | cut -d ' ' -f 1 | sed 's/^UUID=//')
		mountpoint=$(echo "$line" | cut -d ' ' -f 2)
		new_uuid=${mountpoint_to_new_uuid["$mountpoint"]:-}
		if [ -z "$new_uuid" ]; then
			echo "No new uuid for old uuid $old_uuid. There may be a problem with disk sizes." >> "$log_file"
			continue
		fi
		echo "Update UUID from $old_uuid to $new_uuid with mountpoint $mountpoint" >> "$log_file"
		sed -i "s/$old_uuid/$new_uuid/g" \
			"$destdir/etc/fstab" \
			"$destdir/etc/sysconfig/grub2" \
			"$destdir/etc/grub.cfg"
	done < <(sed -E -e 's/\t+/ /g' -e 's/ +/ /g' "$destdir/etc/fstab" | grep '^UUID=')
}

on_message() {
	case "$in_action" in
		write)
			if ! mountpoint -q "$destdir"; then
				err_msg="The mountpoint -q $destdir command failed."
				err_msg+=" Further installation requires a mounted target system."
				write_error "$err_msg"
				return 1
			fi

			install_fs   || return 1

			pushd "$destdir" || return 1
			# These directories are necessary for mount_chroot.
			mkdir -pv -- \
				./dev \
				./proc \
				./sys \
				./run/lock/subsys \
				./tmp
			popd || return 1

			update_uuids || return 1

			if ! mount_chroot; then
				write_error "The mount_chroot command failed. There may be a problem with disk sizes."
				return 1
			fi

			# This is necessary to prevent freezing on alterator-preinstall.
			# See mounting in the run_preinstall function, backend3/preinstall.
			mkdir -p -- "$destdir/run/alteratord"

			# Flag to notify installer's postinstall.d hooks about new system.
			touch -- "$destdir/_NEW_SYSTEM_"
		;;
	esac
 }

message_loop
