#! /bin/sh
# Remove critical files to ensure we don't end up with a mixed system.

. /lib/partman/lib/base.sh

failed () {
	db_progress STOP
	db_input critical partman-target/clear_partitions_failed || true
	db_go || true
	exit 1
}
count=0
partitions=$(
for dev in $DEVICES/*; do
	[ -d "$dev" ] || continue
	cd $dev
	open_dialog PARTITIONS
	while { read_line num id size type fs path name; [ "$id" ]; }; do
		[ -f "$id/method" ] || continue
		[ -f "$id/use_filesystem" ] || continue
		[ -f "$id/mountpoint" ] || continue
		[ "$fs" != free ] || continue
		[ -f "$id/format" ] && continue
		[ -f "$id/formatted" ] && continue
		count=$(($count + 1))
		mp="$(cat "$id/mountpoint")"
		echo "$mp,$path"
	done
	close_dialog
done | sort
)

[ -n "$partitions" ] || exit 0

echo "Considering $partitions." | tr '\n' ' ' | logger -t clear_partitions

tmp="/mnt/tmpmount"
mkdir -p "$tmp"
template=partman-target/clear_partitions_progress
db_progress START 0 $count ubiquity/install/title
db_progress INFO $template
to_delete=""
for part in $partitions; do
	mp="${part%,*}"
	path="${part#*,}"
	if [ "$mp" = "/" ]; then
		mount $path $tmp 3>&- || failed
		for x in bin dev etc lib lib32 lib64 proc sbin sys; do
			[ -e "$tmp/$x" ] && (rm -rf "$tmp/$x" &&
			logger -t clear_partitions "Removing $x from / ($path)." ||
			failed)
		done
		for x in "$tmp/usr/"* "$tmp/var/"*; do
			case "$x" in
				$tmp/usr/local|$tmp/usr/src|$tmp/var/lib|$tmp/var/local)
				continue
				;;
			esac
			[ -e "$x" ] && (rm -rf "$x" &&
			logger -t clear_partitions "Removing ${x#$tmp/} from / ($path)." ||
			failed)
		done
		for x in "$tmp/var/lib/"*; do
			case "$x" in
			    $tmp/var/lib/mysql|$tmp/var/lib/mythtv)
				# Databases
				continue
				;;
			esac
			[ -e "$x" ] && (rm -rf "$x" &&
			logger -t clear_partitions "Removing ${x#$tmp/} from / ($path)." ||
			failed)
		done
		for x in $tmp/initrd* $tmp/vmlinuz*; do
			[ -e "$x" ] && (rm -rf "$x" || failed)
		done
		
		# /home could be a symlink.
		[ -f "$tmp/home" ] && (rm "$tmp/home" || failed)

		# / could have the wrong owner.
		chown root:root $tmp
		
		# Preserve the UID, if possible.
		db_get passwd/username || true
		username="$RET"
		if [ -n "$username" ] && [ -d "$tmp/home/$username" ]; then
			uid="$(stat -c %u "$tmp/home/$username")"
			if [ -n "$uid" ] && [ "$uid" != 0 ]; then
				db_set passwd/user-uid "$uid" || true
			fi
		fi
		# Nothing should have anything in $tmp open at this point,
		# but apparently something does:
		#   https://bugs.launchpad.net/bugs/946663
		umount -l $tmp
	elif [ "$mp" = "/home" ]; then
		mount $path $tmp 3>&- || failed
		# Preserve the UID, if possible.
		db_get passwd/username || true
		username="$RET"
		if [ -n "$username" ] && [ -d "$tmp/$username" ]; then
			uid="$(stat -c %u "$tmp/$username")"
			if [ -n "$uid" ] && [ "$uid" != 0 ]; then
				db_set passwd/user-uid "$uid" || true
			fi
		fi
		# Nothing should have anything in $tmp open at this point,
		# but apparently something does:
		#   https://bugs.launchpad.net/bugs/946663
		umount -l $tmp
	else
		case "$mp" in
			/usr/local|/usr/local/*|/var/local|/var/local/*|/usr/src|/usr/src/*)
			logger -t clear_partitions "Skipping $mp ($path)."
			continue
			;;
		esac
		for x in bin dev etc lib lib32 lib64 proc sbin usr var sys; do
			if echo "$mp" | egrep -q "^/$x(\$|/)"; then
				mount $path $tmp 3>&- || failed
				logger -t clear_partitions "Removing everything from $mp ($path)."
				rm -rf $tmp/* || failed
				# Nothing should have anything in $tmp open
				# at this point, but apparently something
				# does:
				#   https://bugs.launchpad.net/bugs/946663
				umount -l $tmp
				break
			fi
		done
	fi
	db_progress STEP 1
done
db_progress STOP
rmdir $tmp

exit 0
