From 9d6059049f0ff0340351e2cc2dfda978c5867e90 Mon Sep 17 00:00:00 2001 From: Richard Brown Date: Tue, 7 May 2024 16:32:52 +0200 Subject: [PATCH] New Migration Module --- usr/lib/tik/lib/tik-functions | 5 +- usr/lib/tik/modules/post/20-mig | 33 ++++++++ usr/lib/tik/modules/pre/10-welcome | 4 +- usr/lib/tik/modules/pre/20-mig | 122 +++++++++++++++++++++++++++++ 4 files changed, 159 insertions(+), 5 deletions(-) create mode 100644 usr/lib/tik/modules/post/20-mig create mode 100644 usr/lib/tik/modules/pre/20-mig diff --git a/usr/lib/tik/lib/tik-functions b/usr/lib/tik/lib/tik-functions index 885a3d0..632b7b0 100644 --- a/usr/lib/tik/lib/tik-functions +++ b/usr/lib/tik/lib/tik-functions @@ -228,7 +228,7 @@ get_img() { fi } -function dump_image { +dump_image() { local image_source_files=$1 local image_target=$2 local image_source @@ -239,7 +239,7 @@ function dump_image { prun /usr/bin/sync | d --progress --title="Syncing" --pulsate --auto-close --no-cancel --width=400 } -function set_boot_target { +set_boot_target() { if [ "${debug}" == "1" ]; then log "[debug] Not setting EFI boot target" else @@ -256,7 +256,6 @@ function set_boot_target { fi } - load_modules() { local module_dir if [[ $2 = "custom" ]]; then diff --git a/usr/lib/tik/modules/post/20-mig b/usr/lib/tik/modules/post/20-mig new file mode 100644 index 0000000..c11d60d --- /dev/null +++ b/usr/lib/tik/modules/post/20-mig @@ -0,0 +1,33 @@ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: Copyright 2024 SUSE LLC +# SPDX-FileCopyrightText: Copyright 2024 Richard Brown + +if [ "${migrate}" == 1 ]; then + probe_partitions $TIK_INSTALL_DEVICE "btrfs" "/usr/lib/os-release" + + if [ -z "${probedpart}" ]; then + error "MIGRATION FAILED: New Installation NOT FOUND" + fi + + prun /usr/bin/mkdir ${mig_dir}/mnt + prun /usr/bin/mount -o compress=zstd:1 ${probedpart} ${mig_dir}/mnt + prun /usr/bin/systemd-repart --pretty 0 --root ${mig_dir}/mnt --dry-run=0 ${probedpart} + prun /usr/bin/mount -o compress=zstd:1,subvol=/@/var ${probedpart} ${mig_dir}/mnt/var + prun /lib/systemd/systemd-growfs ${mig_dir}/mnt/var + etcmountcmd=$(cat ${mig_dir}/mnt/etc/fstab | grep "overlay /etc" | sed 's/\/sysroot\//${mig_dir}\/mnt\//g' | sed 's/\/work-etc.*/\/work-etc ${mig_dir}\/mnt\/etc\//' | sed 's/overlay \/etc overlay/\/usr\/bin\/mount -t overlay overlay -o/') + prun eval "$etcmountcmd" + prun /usr/bin/cat ${mig_dir}/passwd.out >> ${mig_dir}/mnt/etc/passwd + prun /usr/bin/cat ${mig_dir}/shadow.out >> ${mig_dir}/mnt/etc/shadow + prun /usr/bin/sed -i "/^wheel:/ s/$/$(head -n 1 ${mig_dir}/passwd.out | awk -F'[/:]' '{print $1}')/" ${mig_dir}/mnt/etc/group + prun /usr/bin/cp -a ${mig_dir}/system-connections ${mig_dir}/mnt/etc/NetworkManager/system-connections + prun /usr/bin/umount ${mig_dir}/mnt/etc + prun /usr/bin/umount ${mig_dir}/mnt/var + prun /usr/bin/umount ${mig_dir}/mnt + prun /usr/bin/mount -o compress=zstd:1,subvol=/@ ${probedpart} ${mig_dir}/mnt + prun /usr/sbin/btrfs subvolume delete ${mig_dir}/mnt/home + (prun /usr/sbin/btrfs send ${mig_dir}/${snap_dir} | pv -f -F "# %b copied in %t %r" | prun /usr/sbin/btrfs receive ${mig_dir}/mnt) 2>&1 | d --progress --title="Restoring /home" --pulsate --auto-close --no-cancel --width=400 + prun /usr/bin/mv ${mig_dir}/mnt/${snap_dir} ${mig_dir}/mnt/home + prun /usr/sbin/btrfs property set -f -ts ${mig_dir}/mnt/home ro false + prun /usr/bin/umount ${mig_dir}/mnt + prun /usr/bin/rmdir ${mig_dir}/mnt +fi \ No newline at end of file diff --git a/usr/lib/tik/modules/pre/10-welcome b/usr/lib/tik/modules/pre/10-welcome index 826653c..842352c 100644 --- a/usr/lib/tik/modules/pre/10-welcome +++ b/usr/lib/tik/modules/pre/10-welcome @@ -1,5 +1,5 @@ # SPDX-License-Identifier: MIT -# SPDX-FileCopyrightText: Copyright 2023-2024 SUSE LLC -# SPDX-FileCopyrightText: Copyright 2023-2024 Richard Brown +# SPDX-FileCopyrightText: Copyright 2024 SUSE LLC +# SPDX-FileCopyrightText: Copyright 2024 Richard Brown d --info --ok-label="Install Now" --no-wrap --width=300 --height=300 --icon=distributor-logo-Aeon-symbolic --title="" --text="Welcome to ${TIK_OS_NAME}\n\nPlease press Install Now to continue" \ No newline at end of file diff --git a/usr/lib/tik/modules/pre/20-mig b/usr/lib/tik/modules/pre/20-mig new file mode 100644 index 0000000..09eb4c5 --- /dev/null +++ b/usr/lib/tik/modules/pre/20-mig @@ -0,0 +1,122 @@ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: Copyright 2024 SUSE LLC +# SPDX-FileCopyrightText: Copyright 2024 Richard Brown + +mig_dir=/var/lib/tik/mig +snap_dir=homebk +if [ -d ${mig_dir} ]; then + prun /usr/bin/mkdir -p ${mig_dir} +fi + +probe_partitions() { + local filesystem_type=$2 + local filematch=$3 + local device=$1 + local mountops + local part + + if [[ "${filesystem_type}" == "btrfs" ]]; then + mountops="-o compress=zstd:1" + fi + prun /usr/bin/mkdir -p ${mig_dir}/mnt + probedpart="" + for part in $(lsblk ${device} -p -n -r -o ID-LINK,FSTYPE|tr -s ' ' ":"|grep ":${filesystem_type}"|cut -d: -f1); do + prun /usr/bin/mount ${mountops} /dev/disk/by-id/${part} ${mig_dir}/mnt + # Check if ${filematch} exists + if [ -f ${mig_dir}/mnt/${filematch} ]; then + probedpart=/dev/disk/by-id/${part} + log "[probe_partitions] /dev/disk/by-id/${part} found" + if grep -q 'PRETTY_NAME="openSUSE MicroOS"' ${mig_dir}/mnt/${filematch} && [ -f ${mig_dir}/mnt/usr/share/doc/packages/patterns-microos/desktop-gnome.txt ]; then + # Found legacy Aeon, activate easter egg + legacy_aeon=1 + fi + continue + else + continue + fi + done + prun /usr/bin/umount ${mig_dir}/mnt + prun /usr/bin/rmdir ${mig_dir}/mnt +} + +if [ -z "$(ls -A ${mig_dir})" ]; then + log "existing backup found" + zenity --question --no-wrap --cancel-label="No, Delete Backup" --title="Existing user backup detected" --text="These users can be restored to the new installation\n\nWould you like to use this backup?" + oldbackupyn=$? + log "[oldbackupyn][${oldbackupyn}]" + if [ "${oldbackupyn}" == 0 ]; then + skipbackup=1 + migrate=1 + log "backup skipped, migration will use existing backup" + else + prun /usr/sbin/btrfs subvolume delete ${mig_dir}/${snap_dir} + prun /usr/bin/rm ${mig_dir}/*.out + prun /usr/bin/rm ${mig_dir}/system-connections/* + prun /usr/bin/rmdir ${mig_dir}/system-connections + fi +fi + +get_disk + +if [ -z "${skipbackup}" ]; then + # Probe selected disk for a btrfs partition containing /usr/lib/os-release + probe_partitions $TIK_INSTALL_DEVICE "btrfs" "/usr/lib/os-release" + + if [ -n "${probedpart}" ]; then + prun /usr/bin/mkdir ${mig_dir}/mnt + if prun /usr/bin/mount -o compress=zstd:1,subvol=/@/home ${probedpart} ${mig_dir}/mnt; then + prun /usr/sbin/btrfs quota rescan -w ${mig_dir}/mnt | d --progress --title="Detected existing /home subvolume.." --pulsate --auto-close --no-cancel --width=400 + home_size=$(prun /usr/sbin/btrfs qgroup show --raw -f ${mig_dir}/mnt | grep @/home$ | awk '{print $2}') + tik_stick_size=$(prun /usr/sbin/btrfs fi usage --raw ${mig_dir} | grep estimated | awk '{print $3}') + if [ ${home_size} -gt ${tik_stick_size} ]; then + # Not enough space to offer migration + migrate=0 + fi + if [ ${home_size} -le 16384 ]; then + # /home subvolume is empty + migrate=0 + fi + prun /usr/bin/umount ${mig_dir}/mnt + else + log "no @/home subvolume found on ${probedpart}" + migrate=0 + fi + prun /usr/bin/rmdir ${mig_dir}/mnt + + # partition found, /home subvolume found, no known reason to not migrate, so ask the user + if [ -z "${migrate}" ]; then + if [ "${legacy_aeon}" == 1 ]; then + d --info --width=300 --height=300 --icon=distributor-logo-Aeon-symbolic --no-wrap --title="Message from the Aeon Team" --text="We'd like to thank you for adopting openSUSE Aeon so early in it's development,\nbefore we fully understood what we were building or how we wanted it to look\n\nWe are sorry that you need to reinstall your system\n\nThank you so much for your support.\nWe hope you enjoy the new look openSUSE Aeon" + fi + zenity --question --no-wrap --title="Backup users from the existing install?" --text="These users will be restored to the new installation." + migrateyn=$? + if [ "${migrateyn}" == 0 ]; then + migrate=1 + else + migrate=0 + fi + fi + + fi + + if [ "${migrate}" == 1 ]; then + # We're migrating, lets go! + prun /usr/bin/mkdir ${mig_dir}/mnt + prun /usr/bin/mount -o compress=zstd:1,subvol=/@/home ${probedpart} ${mig_dir}/mnt + prun /usr/sbin/btrfs subvolume snapshot -r ${mig_dir}/mnt ${mig_dir}/mnt/${snap_dir} + (prun /usr/sbin/btrfs send ${mig_dir}/mnt/${snap_dir} | pv -f -F "# %b copied in %t %r" | prun /usr/sbin/btrfs receive ${mig_dir}) 2>&1 | d --progress --title="Backing up /home" --pulsate --auto-close --no-cancel --width=400 + prun /usr/sbin/btrfs subvolume delete ${mig_dir}/mnt/${snap_dir} + prun /usr/bin/umount ${mig_dir}/mnt + prun /usr/bin/mount -o compress=zstd:1 ${probedpart} ${mig_dir}/mnt + prun /usr/bin/mount -o compress=zstd:1,subvol=/@/var ${probedpart} ${mig_dir}/mnt/var + etcmntcmd=$(cat ${mig_dir}/mnt/etc/fstab | grep "overlay /etc" | sed 's/\/sysroot\//${mig_dir}\/mnt\//g' | sed 's/\/work-etc.*/\/work-etc ${mig_dir}\/mnt\/etc\//' | sed 's/overlay \/etc overlay/\/usr\/bin\/mount -t overlay overlay -o/') + prun eval "$etcmntcmd" + prun /usr/bin/awk -F'[/:]' '($3 >= 1000 && $3 != 65534)' ${mig_dir}/mnt/etc/passwd > ${mig_dir}/passwd.out + prun /usr/bin/awk -F'[/:]' '{if ($3 >= 1000 && $3 != 65534) print $1}' ${mig_dir}/mnt/etc/passwd | prun /usr/bin/grep -f - ${mig_dir}/mnt/etc/shadow > ${mig_dir}/shadow.out + prun /usr/bin/cp -a ${mig_dir}/mnt/etc/NetworkManager/system-connections ${mig_dir}/system-connections + prun /usr/bin/umount ${mig_dir}/mnt/etc + prun /usr/bin/umount ${mig_dir}/mnt/var + prun /usr/bin/umount ${mig_dir}/mnt + prun /usr/bin/rmdir ${mig_dir}/mnt + fi +fi