ubuntu-22.04.3-desktop-amd64/casper/filesystem/usr/lib/partman/finish.d/10clear_partitions

139 lines
3.6 KiB
Bash
Executable File

#! /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