diff --git a/restore.sh b/restore.sh index a7e1b4c..c6f8a1c 100644 --- a/restore.sh +++ b/restore.sh @@ -1,180 +1,197 @@ +#!/bin/bash #not working encrypted setup #vars -IP="192.168.100.16" -source="rsync@"$IP"/rsync/" +IP="192.168.100.100" +source="rsync@"$IP"/mnt/" bootSize=256M -#prepare ##check for root -if [ `id -u` != 0 ] ; then - echo "==> Need to be root" - exit 1 -fi -##check for network -ping -c 1 $IP &> /dev/null -if [ "$?" != 0 ] -then - echo "==> Host unavailable, exiting" - exit 1 -fi - -##check for space - -rsync_dir_list=($(rsync --password-file=rsync_pass rsync://$source | awk '{print $5}' | grep -v .DS_Store | grep -v "@Recently-Snapshot" | sort -r | head -n -1)) - -##choose backup - -echo "==>" ${#rsync_dir_list[@]} backups: ${rsync_dir_list[@]} -read -p "Input backup number:" backupNum - -until [ $backupNum -le ${#rsync_dir_list[@]} ] -do -read -p "Input backup number:" backupNum -done -let "backupNum -= 1" - - -##set target drive -lsblk -o NAME,LABEL,FSTYPE,SIZE,MOUNTPOINT,MODEL -until [ ! -f $targetDrive ] -do -read -p "Target drive is " targetDrive -targetDrive=/dev/$targetDrive -done -echo "Encrypted?" -while read -r -n 1 -s answer ; do - if [[ $answer = [YyNn] ]]; then - [[ $answer = [Yy] ]] && encryptedDevice=true && echo "WARNING You will be asked for password later" #read -p "Password: " encryptedPassword - [[ $answer = [Nn] ]] && encryptedDevice=false - break +testVars() { + if [ `id -u` != 0 ] ; then + echo "==> Need to be root" + exit 1 fi -done + ##check for network + ping -c 1 $IP &> /dev/null + if [ "$?" != 0 ] + then + echo "==> Host unavailable, exiting" + exit 1 + fi +} -#get swap size -swapSize=$(free -m | grep "Mem" | awk '{print $2}') -read -p "Enter extra amount of swap (empty == 512):" swapExtra -if [ -z "$swapExtra" ] && swapExtra=512 -let "swapSize += swapExtra" #add 512 mbs to swap for swap, not only hibernation -swapSize=$swapSize"M" +chooseBackup() { + ##get list of backups + rsync_dir_list=($(rsync --password-file=rsync_pass rsync://$source | awk '{print $5}' | grep -v .DS_Store | grep -v "@Recently-Snapshot" | sort -r | head -n -1)) + ##choose backup + echo "==>" ${#rsync_dir_list[@]} backups: ${rsync_dir_list[@]} + read -p "Input backup number:" backupNum + + until [ $backupNum -le ${#rsync_dir_list[@]} ] + do + read -p "Input backup number:" backupNum + done + let "backupNum -= 1" +} + +setTargetDisk() { + + ##set target drive + lsblk -o NAME,LABEL,FSTYPE,SIZE,MOUNTPOINT,MODEL + until [ ! -f $targetDrive ] + do + read -p "Target drive is " targetDrive + targetDrive=/dev/$targetDrive + done + echo "Encrypted?" + while read -r -n 1 -s answer ; do + if [[ $answer = [YyNn] ]]; then + [[ $answer = [Yy] ]] && encryptedDevice=true && echo "WARNING You will be asked for password later" #read -p "Password: " encryptedPassword + [[ $answer = [Nn] ]] && encryptedDevice=false + break + fi + done + + #get swap size + swapSize=$(free -m | grep "Mem" | awk '{print $2}') + read -p "Enter extra amount of swap (empty == 512):" swapExtra + if [ -z "$swapExtra" ] && swapExtra=512 + let "swapSize += swapExtra" #add 512 mbs to swap for swap, not only hibernation + swapSize=$swapSize"M" +} #DEPLOY -echo deployin\' ${rsync_dir_list[$backupNum]} on $targetDrive in 15s... +warnDeploy() { + echo deployin\' ${rsync_dir_list[$backupNum]} on $targetDrive in 15s... + sleep 15 + trap 'echo "==> Interrupted by user"; exit 1' 2 +} -sleep 15 +partitionDisk() { + ##clear mbr for sure + dd if=/dev/zero of=$targetDrive count=512 + ##fdisk + echo "==> Partitioning..." + ( + echo o # Create a new empty DOS partition table + echo n # Add a new partition + echo # Primary partition + echo # Partition number + echo # First sector (Accept default: 1) + echo +$swapSize # Last sector (Accept default: varies) + echo y #remove sign + echo n + echo + echo + echo + echo +$bootSize + echo y + echo n + echo + echo + echo + echo + echo w + ) | fdisk $targetDrive + # IMHO this ^ is less obfuscated way +} -trap 'echo "==> Interrupted by user"; exit 1' 2 +makeFS() { + ##mkfs's + echo "==> Making filesystems..." + echo "mkswap" + mkswap $targetDrive"1" + echo "mkfs.vfat" + mkfs.vfat $targetDrive"2" -##clear mbr for sure + echo "mkfs.ext4" + if $encryptedDevice + then + cryptsetup luksFormat -v $targetDrive"3" + cryptsetup open $targetDrive"3" targetLuks + mkfs.ext4 /dev/mapper/targetLuks + else + mkfs.ext4 $targetDrive"3" + fi +} -dd if=/dev/zero of=$targetDrive count=512 +getUUIDs() { + ##get disk's uuid + echo "==> Got UUIDs!" + UUIDS=($(blkid $targetDrive"1" $targetDrive"2" $targetDrive"3" -o value -s UUID)) + if $encryptedDevice + then + UUIDS[3]=UUIDS[2] + UUIDS[2]=`blkid /dev/mapper/targetLuks -o value -s UUID` + fi +} -##fdisk -echo "==> Partitioning..." -( -echo o # Create a new empty DOS partition table -echo n # Add a new partition -echo # Primary partition -echo # Partition number -echo # First sector (Accept default: 1) -echo +$swapSize # Last sector (Accept default: varies) -echo y #remove sign -echo n -echo -echo -echo -echo +$bootSize -echo y -echo n -echo -echo -echo -echo -echo w -) | fdisk $targetDrive - # IMHO this ^ is less obfuscated way +mountDisk() { + ##mount disks + echo "==> Mounting..." + if $encryptedDevice + then + mount /dev/mapper/targetLuks /mnt + else + mount $targetDrive"3" /mnt + fi -##mkfs's -echo "==> Making filesystems..." -echo "mkswap" -mkswap $targetDrive"1" -echo "mkfs.vfat" -mkfs.vfat $targetDrive"2" + mkdir /mnt/boot + mount $targetDrive"2" /mnt/boot +} -echo "mkfs.ext4" -if $encryptedDevice -then -cryptsetup luksFormat -v $targetDrive"3" -cryptsetup open $targetDrive"3" targetLuks -mkfs.ext4 /dev/mapper/targetLuks -else -mkfs.ext4 $targetDrive"3" -fi +copyFiles() { + ##rsync + echo "==> Copying from NAS..." + rsync --archive --password-file=rsync_pass rsync://$source${rsync_dir_list[$backupNum]}/ /mnt/ + retVal=$? + if [ $retVal -ne 0 ]; then + exit 1 + fi +} -sleep 15 +updateFstab() { + ##update fstab + echo "==> Updating fstab..." + mv /mnt/etc/fstab /mnt/etc/fstab.orig + cat /mnt/etc/fstab.orig | grep "ext4" | sed 's/UUID=[A-Fa-f0-9-]*/UUID='${UUIDS[2]}'/' > /mnt/etc/fstab + cat /mnt/etc/fstab.orig | grep "vfat" | sed 's/UUID=[A-Fa-f0-9-]*/UUID='${UUIDS[1]}'/' >> /mnt/etc/fstab + cat /mnt/etc/fstab.orig | grep "swap" | sed 's/UUID=[A-Fa-f0-9-]*/UUID='${UUIDS[0]}'/' >> /mnt/etc/fstab + rm /mnt/etc/fstab.orig #TODO OFC we need to check mountpoint, not only type of FS -##get disk's uuid -echo "==> Got UUIDs!" -UUIDS=($(blkid $targetDrive"1" $targetDrive"2" $targetDrive"3" -o value -s UUID)) -if $encryptedDevice -then -UUIDS[3]=UUIDS[2] -UUIDS[2]=`blkid /dev/mapper/targetLuks -o value -s UUID` -fi + echo "==> Result:" + cat /mnt/etc/fstab +} -##mount disks -echo "==> Mounting..." -if $encryptedDevice -then -mount /dev/mapper/targetLuks /mnt -else -mount $targetDrive"3" /mnt -fi +configBootloader() +{ + ##update grub linux options + if $encryptedDevice + cat /mnt/etc/default/grub | sed 's/cryptdevice=UUID=[A-Fa-f0-9-]*:cryptroot /cryptdevice=UUID='${UUIDS[3]}':cryptroot/' > /mnt/etc/default/grub + else + cat /mnt/etc/default/grub | sed 's/cryptdevice=UUID=[A-Fa-f0-9-]*:cryptroot //' > /mnt/etc/default/grub + fi -mkdir /mnt/boot -mount $targetDrive"2" /mnt/boot + cat /mnt/etc/default/grub | sed 's/resume=UUID=[A-Fa-f0-9-]*/resume=UUID='${UUIDS[0]}'/' > /mnt/etc/default/grub +} -##rsync -echo "==> Copying from NAS..." -rsync --archive --password-file=rsync_pass rsync://$source${rsync_dir_list[$backupNum]}/ /mnt/ -retVal=$? -if [ $retVal -ne 0 ]; then - exit 1 -fi +updateBootloader() +{ + ##mount system stuff + echo "==> Mounting /dev, /sys, /proc..." + mount /dev /mnt/dev --bind + mount /sys /mnt/sys --bind + mount /proc /mnt/proc --bind -##update fstab -echo "==> Updating fstab..." -mv /mnt/etc/fstab /mnt/etc/fstab.orig -cat /mnt/etc/fstab.orig | grep "ext4" | sed 's/UUID=[A-Fa-f0-9-]*/UUID='${UUIDS[2]}'/' > /mnt/etc/fstab -cat /mnt/etc/fstab.orig | grep "vfat" | sed 's/UUID=[A-Fa-f0-9-]*/UUID='${UUIDS[1]}'/' >> /mnt/etc/fstab -cat /mnt/etc/fstab.orig | grep "swap" | sed 's/UUID=[A-Fa-f0-9-]*/UUID='${UUIDS[0]}'/' >> /mnt/etc/fstab -rm /mnt/etc/fstab.orig #TODO OFC we need to check mountpoint, not only type of FS + ##chroot, mkinitcpio and update grub + echo "==> mkinitcpio and update grub..." -echo "==> Result:" -cat /mnt/etc/fstab -##update grub linux options -if $encryptedDevice -cat /mnt/etc/default/grub | sed 's/cryptdevice=UUID=[A-Fa-f0-9-]*:cryptroot /cryptdevice=UUID='${UUIDS[3]}':cryptroot/' > /mnt/etc/default/grub -else -cat /mnt/etc/default/grub | sed 's/cryptdevice=UUID=[A-Fa-f0-9-]*:cryptroot //' > /mnt/etc/default/grub -fi + #cat /mnt/etc/mkinitcpio.conf | sed 's/encrypt //' > /mnt/etc/mkinitcpio.conf #remove cryptdevice, no encrypted fs today :c -cat /mnt/etc/default/grub | sed 's/resume=UUID=[A-Fa-f0-9-]*/resume=UUID='${UUIDS[0]}'/' > /mnt/etc/default/grub - -##mount system stuff -echo "==> Mounting /dev, /sys, /proc..." -mount /dev /mnt/dev --bind -mount /sys /mnt/sys --bind -mount /proc /mnt/proc --bind - -##chroot, mkinitcpio and update grub -echo "==> mkinitcpio and update grub..." - -#cat /mnt/etc/mkinitcpio.conf | sed 's/encrypt //' > /mnt/etc/mkinitcpio.conf #remove cryptdevice, no encrypted fs today :c - -#chroot env + #chroot env cat << EOF | chroot /mnt mkinitcpio -P grub-mkconfig -o /boot/grub/grub.cfg @@ -182,9 +199,28 @@ grub-install $targetDrive exit EOF -#deinit -echo "==> Syncing..." -sync -echo "==> Unmounting..." -umount -R /mnt -echo "==> Done!" \ No newline at end of file +} + +deinit() +{ + #deinit + echo "==> Syncing..." + sync + echo "==> Unmounting..." + umount -R /mnt + echo "==> Done!" +} +# funcions +testVars() +chooseBackup() +setTargetDisk() +warnDeploy() +partitionDisk() +makeFS() +getUUIDs() +mountDisk() +copyFiles() +updateFstab() +configBootloader() +updateBootloader() +deinit() \ No newline at end of file