#!/bin/sh -eu
### Create and mount alt-metadata partition

. shell-error

mdir=/usr/share/install2/metadata
# 24 GiB
fspace_min=25769803776
fix_pmbr=

imagepart="$(grep " /image " /proc/mounts |cut -f1 -d' ')"
case "$imagepart" in
	/dev/sd*)
		device="$(echo "$imagepart" | sed 's/[0-9]*$//')"
	;;
	/dev/mmc*|dev/nvme*)
		device="$(echo "$imagepart" | sed 's/p[0-9]*$//')"
	;;
	*)
		exit 0
	;;
esac

[ -b "$device" ] || fatal "error: \"$device\" is not block device!!!"

mkdir -p "$mdir"

# find and try mount alt-metadata partition
mpart="$(blkid ${device}* | grep 'LABEL="alt-metadata"' |sed 's/:.*//')"
if [ -n "$mpart" ]; then
	mount "$mpart" "$mdir" || fatal "error: mount \"$mpart\" \"$mdir\" failed!!!"
	exit 0
fi

if LANG=C.UTF-8 sfdisk -l "$device" 2>/dev/null |grep -qs 'Disklabel type: gpt'; then
	# fix PMBR
	fix_pmbr=1
	sfdisk -f --relocate gpt-bak-std "$device"
fi

# check free space on device.
fspace_string="$(LANG=C.UTF-8 sfdisk --bytes --list-free "$device" |tail -n1 |tr -s " ")"
fspace="$(echo "$fspace_string" | cut -f4 -d' ')"
[ "$fspace" -gt "$fspace_min" ] ||
	fatal "error: Not enough free space (< 24 GiB) on $device!!!"
fspace_start="$(echo "$fspace_string" | cut -f1 -d' ')"
fspace_end="$(echo "$fspace_string" | cut -f2 -d' ')"

# create alt-metadata partition
echo "," | LANG=C.UTF-8 sfdisk -f -a --no-reread --no-tell-kernel -- "$device"
newpart_string="$(LANG=C.UTF-8 sfdisk --bytes --list "$device" |tail -n1 |tr -s " ")"
newpart="$(echo "$newpart_string" | cut -f1 -d' ')"
newpart_num="${newpart#"$device"}"
newpart_num="${newpart_num#p}"
newpart_start="$(echo "$newpart_string" | cut -f2 -d' ')"
newpart_length="$(echo "$newpart_string" | cut -f4 -d' ')"
addpart "$device" "$newpart_num" "$newpart_start" "$newpart_length"

# Tricking old BIOS into booting from GUID/GPT
if [ -n "$fix_pmbr" ]; then
	# adding a boot record to the PMBR table
	printf '\200\0\0\0\0\0\0\0\0\0\0\0\001\0\0\0' |
		dd "of=$device" bs=1 seek=462 2>/dev/null
	sync
fi

[ -b "$newpart" ] || fatal "error: can't create a new partition on the drive $device"

# optimal ext4 options
opts="-t ext4 -O ^has_journal,sparse_super2"
opts="$opts -E packed_meta_blocks=1,num_backup_sb=1"
# format filesystem
mke2fs $opts -L "alt-metadata" -- "$newpart"

# Tell udevd about changes
udevadm trigger -- "$device" 1>&2 ||:
udevadm settle -t5 -- "$device" 1>&2 ||:

# mount alt-metadata partition
mount "$newpart" "$mdir" || fatal "error: mount \"$newpart\" \"$mdir\" failed!!!"
