Skip to content

Commit

Permalink
New Migration Module
Browse files Browse the repository at this point in the history
  • Loading branch information
sysrich committed May 7, 2024
1 parent dda29ef commit 9d60590
Show file tree
Hide file tree
Showing 4 changed files with 159 additions and 5 deletions.
5 changes: 2 additions & 3 deletions usr/lib/tik/lib/tik-functions
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ get_img() {
fi
}

function dump_image {
dump_image() {
local image_source_files=$1
local image_target=$2
local image_source
Expand All @@ -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
Expand All @@ -256,7 +256,6 @@ function set_boot_target {
fi
}


load_modules() {
local module_dir
if [[ $2 = "custom" ]]; then
Expand Down
33 changes: 33 additions & 0 deletions usr/lib/tik/modules/post/20-mig
Original file line number Diff line number Diff line change
@@ -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
4 changes: 2 additions & 2 deletions usr/lib/tik/modules/pre/10-welcome
Original file line number Diff line number Diff line change
@@ -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="<big>Welcome to ${TIK_OS_NAME}</big>\n\nPlease press <b>Install Now</b> to continue"
122 changes: 122 additions & 0 deletions usr/lib/tik/modules/pre/20-mig
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 9d60590

Please sign in to comment.