#!/bin/bash

# =LLC= © (C)opyright 2017 Boojum Consulting LLC / Dave Bechtel, All rights reserved.
## NOTICE: Only Boojum Consulting LLC personnel may use or redistribute this code,
## Unless given explicit permission by the author - see http://www.boojumconsultingsa.com
#
# To be run from systemrescuecd environment; NOTE restore disk MUST be partitioned 1st!
# REQUIRES 1 arg: filename of .fsa
# copy this script to /tmp and chmod +x, run from there

# 2024.Apr kneutron

# mod for proxmox
# NO EFI version

# If you prefer not to use an ISO to restore from, systemrescuecd has sshfs:
#
# sshfs -C -o Ciphers=chacha20-poly1305@openssh.com  loginid@ipaddress:/path/to/backupfile \
#  /mnt/path \
#  -o follow_symlinks

# mkdir -pv /mnt/restore; sshfs -C -o Ciphers=chacha20-poly1305@openssh.com dave@192.168.1.185:/mnt/seatera4-xfs/notshrcompr \
#   /mnt/restore -o follow_symlinks

# failexit.mrg
function failexit () {
  echo '! Something failed! Code: '"$1 $2" # code # (and optional description)
  exit $1
}

vgchange -a y

# TODO editme
#rootdev=/dev/sda3 # for physical disk non-nvme
#rootdev=/dev/vda3 # for restore to VM
rootdev=/dev/mapper/pve-root # for proxmox ext4+LVM restore

# xxx TODO EDITME
#rdevonly=${rootdev%[[:digit:]]}
rdevonly=/dev/vda # for VM
umount $rootdev # failsafe

#cdr=/mnt/cdrom2
#mkdir -pv $cdr
rootdir=/mnt/tmp2
umount $rootdir # failsafe
mkdir -pv $rootdir

myres=BOOJUM-RESTORE.sh # injection script

# NOTE sr0 is systemrescue
#mount /dev/sr1 $cdr -oro
#chkmount=`df |grep -c $cdr`
#[ $chkmount -gt 0 ] || failexit 99 "Failed to mount $cdr"; # failed to mount
chkmount=`df |grep -c $rootdir`
[ $chkmount -eq 0 ] || failexit 98 "$rootdir is still mounted - cannot restore!";

#cd $cdr || failexit 199 "Cannot CD to $cdr";
pwd
echo "`date` - RESTORING root filesystem to $rootdev"

# PROBLEM with long filenames in UDF - gets cut off, use $1
#time fsarchiver restfs *.fsa id=0,dest=$rootdev
time fsarchiver restfs -v "$1" id=0,dest=$rootdev  || failexit 400 "Restore failed!";

# TODO fix
#while `wait -n`; do ## notwork - endless loop
#while [ `jobs |wc -l` -gt 0 ]; do
#  df -h |grep $rootdev # grep fsa
#  sleep 5
#done

date

# boojumtastic!
tune2fs -m1 $rootdev

mount $rootdev $rootdir -onoatime,rw

# Comment out any existing swap partitions in restored fstab
# REF: https://unix.stackexchange.com/questions/295537/how-do-i-comment-lines-in-fstab-using-sed
#sed -e '/[/]/common s/^/#/' /etc/fstab
#/bin/cp -v $rootdir/etc/fstab $rootdir/etc/fstab--bkp && \
#  sed -i '/swap/s/^/#/' $rootdir/etc/fstab; grep swap $rootdir/etc/fstab

# Detect swap partition(s) in restore environ - print /dev/sdXX w/o ":"
#for p in `blkid |grep TYPE=\"swap\" |awk -F: '{ print $1 }'`; do
#  pmod=${p##*/} # strip off beginning /dev/, leave sdXX 
#  swapuuid=`ls -l /dev/disk/by-uuid |grep $pmod |awk '{ print $9 }'`
# check have we already done this?
#  [ `grep -c $swapuuid $rootdir/etc/fstab` -gt 0 ] || \
#    echo "UUID=$swapuuid  swap  swap  defaults,pri=2  0 0" |tee -a $rootdir/etc/fstab
#    echo "UUID=$swapuuid  swap  swap  defaults,pri=2  0 0" >> $rootdir/etc/fstab
#done

# /dev/sdb5
#ls -l /dev/disk/by-uuid |grep sdb5
# 1         2 3    4    5  6   7  8     9
#lrwxrwxrwx 1 root root 10 Aug 27 11:09 dfc46f8f-bcfa-4e73-b62f-b24dd0bf60cf -> ../../sdb5

# Make sure we can boot!
echo "$(date) - Installing grub on $rdevonly"
grub-install --root-directory=$rootdir $rdevonly
mount -o bind /dev $rootdir/dev; mount -o bind /proc $rootdir/proc; mount -o bind /sys $rootdir/sys

# FIXED
myres2=$rootdir/$myres
touch $myres2 || failexit 298 "Check if R/O filesystem?"

echo "#!/bin/bash" > $myres2 || failexit 299 "Cannot update $myres2 injection script - Check R/O filesystem?"
echo "grub-install $rdevonly" >> $myres2  # from chroot
echo "update-grub" >> $myres2
echo "exit;" >> $myres2
#^D

# inject script here!
chroot $rootdir /bin/bash /$myres

#umount -a $rootdir/*
#umount -a $rootdir/{dev,proc,sys}

#umount $rootdir/* 2>/dev/null
#umount $rootdir 2>/dev/null

df -hT

echo "DON'T FORGET TO COPY /home and adjust fstab for swap / home / squid BEFORE booting new drive!"
echo "+ also adjust etc/network/interfaces , getdrives-byid , etc/rc.local , etc/hostname , etc/hosts ,"
echo "+ etc/init/tty11 port (home/cloudssh/.bash_login"
echo '====='
echo "If restoring to VM and a zpool on the host does not exist:"
echo " systemctl disable zfs-import@zpoolnamehere "
echo "...and it should not hold up the reboot anymore"
echo "- Also remove anything from /etc/fstab that exists on the host but not in-vm"

exit;

# 2024.0420 kneutron

=======================================
Full restore instructions:

Run the Proxmox installer from ISO / USB and recreate the LVM + ext4 root FS with appropriate disk size 

Boot systemrescuecd

cd /tmp
Fire up ' mc ' Midnight Commander

Tab to right pane, Esc+9 (or F9) and SFTP to where your .fsa backup file(s) are

SCP the appropriate restore script (EFI or NO-EFI) over to local /tmp and ' chmod +x ' it

EDIT THIS SCRIPT (look for EDITME) and change the appropriate values to match your restore environnment

You may run into an issue with systemrescuecd where you cannot save over the original file;
 in that case you can save it under another name or delete it from another TTY and save it again
 but you will have to redo the ' chmod +x ' on it
 
Follow the sshfs HOWTO in the comment at the beginning of this script to mount your backup file storage

cd /mnt/restore
/tmp/$0 backupfilename.fsa # Start the restore

From here you can still ' chroot ' into the /mnt/tmp2 dir and disable zfs imports, edit /etc/fstab, et al

Shutdown, remove rescue media and it should reboot into Proxmox VE
If not, boot Super Grub Disc and that should do it

Once you have a PVE login prompt, you can login as root and reinstall grub
' grub-install /dev/blah '

and then do a test reboot to make sure everything comes up as expected.

=======================================
 
2024.0420 Tested, works OK with proxmox no-efi
2017.0827 Tested, works OK
