Guest User

Untitled

a guest
Jan 18th, 2022
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 7.10 KB | None | 0 0
  1. #!/bin/bash
  2. #
  3. # ---------------------------
  4. # Snapshot - Rollback - Btrfs
  5. # ---------------------------
  6. #
  7. # readonly-Snapshot + inkrementelles Backup von /home auf eine externe verschlüsselte USB-Backup-Festplatte
  8. #
  9. declare -i fertig=0
  10. [[ -z "$1" ]] && . ../backup_all_to_local_USB-Drive.conf 2>/dev/null
  11. user=xxxx
  12. MAXBACKUPFILES=23
  13. RemoteCryptPartition='/dev/disk/by-id/usb-WD_My_Passport_25EA_595832314131384C4A527034-0:0-part1'
  14. RemoteCryptDeviceTarget=backupdrive
  15. RemoteBackupDrive="/dev/disk/by-id/dm-uuid-CRYPT-LUKS2-8bcd8784c8c04d294d6e064268723d3a-${RemoteCryptDeviceTarget}"
  16. RemoteBackupMountpoint=/backup
  17. remoteSubvolume=@LENOVO_T61_xxxx
  18. #
  19. ZuSicherndesVerzeichnis=/home
  20. RemoteBackupFolder=${RemoteBackupMountpoint}/home_backups
  21. RemotehomeBackupName=home_backup_RO
  22. remotehomebackup=${RemoteBackupFolder}/${RemotehomeBackupName}
  23. remoteNEWhomebackup=${RemoteBackupFolder}/NEW_${RemotehomeBackupName}
  24. LocalhomeBackupName=${RemotehomeBackupName}
  25. localhomebackup=/home/.home_snapshots/${LocalhomeBackupName}
  26. localNEWhomebackup=/home/.home_snapshots/NEW_${LocalhomeBackupName}
  27. ScriptName=`basename $0`
  28. #
  29. #
  30. #==== Funktionen ================================================================================================================================================
  31. function UnmountCryptedDevice {
  32.     umount ${RemoteBackupDrive}
  33.     cryptsetup luksClose ${RemoteCryptDeviceTarget}
  34. }
  35. #
  36. [ -f /root/${ScriptName}.tmp ] && rm /root/${ScriptName}.tmp
  37. touch /root/${ScriptName}.tmp
  38. if [ ! -f /root/${ScriptName}.tmp ] ; then
  39.     echo ""
  40.     echo "Abbruch, keine root-rechte !"
  41.     echo 'Bitte dieses Script mit "sudo" oder als user "root" ausführen !'
  42.     exit 1
  43. fi
  44. rm /root/${ScriptName}.tmp
  45. #
  46. if [ ! -e ${RemoteCryptPartition} ] ; then
  47.     echo ""
  48.     echo "Abbruch, keine USB-Backup-Festplatte angeschlossen !"
  49.     exit 1
  50. fi
  51. #
  52. if [ ! -e /dev/mapper/${RemoteCryptDeviceTarget} ]
  53.     then
  54.         cryptsetup luksOpen ${RemoteCryptPartition} ${RemoteCryptDeviceTarget}
  55.         mount -o rw,noatime,compress=lzo,space_cache=v2,subvol=${remoteSubvolume} ${RemoteBackupDrive} ${RemoteBackupMountpoint}
  56.     elif grep "/dev/mapper/${RemoteCryptDeviceTarget} ${RemoteBackupMountpoint} btrfs rw" /proc/mounts
  57.         then
  58.             sleep 0
  59.         else
  60.             mount -o rw,noatime,compress=lzo,space_cache=v2,subvol=${remoteSubvolume} ${RemoteBackupDrive} ${RemoteBackupMountpoint}
  61. fi
  62. #  
  63. if [ -f /tmp/timestamp.txt ]
  64.     then
  65.         TIMESTAMP=`cat /tmp/timestamp.txt`
  66.     else
  67.         TIMESTAMP=`ls -l --time-style=+%Y-%m-%d-%H%M ${RemoteBackupFolder} | grep -w "NEW_${RemotehomeBackupName}" | awk {'print $6'}`
  68. fi
  69. #
  70. mountstate=`grep "/dev/mapper/${RemoteCryptDeviceTarget} ${RemoteBackupMountpoint} btrfs rw" /proc/mounts`
  71. if [[ -z "${mountstate}" ]]
  72.     then
  73.         echo ""
  74.         echo $mountstate
  75.         echo "BTRFS-Backup-Datentraeger ist nicht eingebunden !"
  76.         echo "ENDE !"
  77.         UnmountCryptedDevice
  78.         exit 1
  79.     else
  80.         # echo "mountstate: $mountstate"
  81.         if [ ! -d $localhomebackup ] && [ $fertig -eq 0 ]
  82.            then
  83.             echo "localhomebackup fehlt - vollständiges Backup wird ausgeführt !"
  84.             btrfs subvolume snapshot -r ${ZuSicherndesVerzeichnis} $localhomebackup
  85.             if [ -d $remotehomebackup ] ; then
  86.                 [ -d ${RemoteBackupFolder}/${TIMESTAMP}_${RemotehomeBackupName} ] && btrfs subvolume delete ${RemoteBackupFolder}/${TIMESTAMP}_${RemotehomeBackupName}
  87.                 mv $remotehomebackup ${RemoteBackupFolder}/${TIMESTAMP}_${RemotehomeBackupName}
  88.             fi
  89.             [ -d $localNEWhomebackup ] && btrfs subvolume delete $localNEWhomebackup
  90.             [ -d $remoteNEWhomebackup ] && btrfs subvolume delete $remoteNEWhomebackup
  91.             btrfs send $localhomebackup | btrfs receive ${RemoteBackupFolder}
  92.             btrfs subvolume snapshot -r ${ZuSicherndesVerzeichnis} $localNEWhomebackup
  93.             fertig=1
  94.            elif [ ! -d $remotehomebackup ] && [ $fertig -eq 0 ]
  95.                then
  96.                 echo "remotehomebackup fehlt - vollständiges Backup wird ausgeführt !"
  97.                 [ -d $localhomebackup ] && btrfs subvolume delete $localhomebackup
  98.                 btrfs subvolume snapshot -r ${ZuSicherndesVerzeichnis} $localhomebackup
  99.                 [ -d $localNEWhomebackup ] && btrfs subvolume delete $localNEWhomebackup
  100.                 [ -d $remoteNEWhomebackup ] && btrfs subvolume delete $remoteNEWhomebackup
  101.                 btrfs send $localhomebackup | btrfs receive ${RemoteBackupFolder}
  102.                 btrfs subvolume snapshot -r ${ZuSicherndesVerzeichnis} $localNEWhomebackup
  103.                 fertig=1
  104.            elif [ ! -d $localNEWhomebackup ] && [ $fertig -eq 0 ]
  105.                then
  106.                 echo "localNEWhomebackup fehlt und wird erneuert - inkrementelles Backup wird versucht !"
  107.                 [ -d $remoteNEWhomebackup ] && btrfs subvolume delete $remoteNEWhomebackup
  108.                 btrfs subvolume snapshot -r ${ZuSicherndesVerzeichnis} $localNEWhomebackup
  109.                 fertig=1
  110.            elif [ -d $localhomebackup ] && [ -d $localNEWhomebackup ] && [ -d $remotehomebackup ] && [ ! -d $remoteNEWhomebackup ] && [ $fertig -eq 0 ]
  111.                then
  112.                 echo "remoteNEWhomebackup fehlt - inkrementelles Backup wird versucht !"
  113.                 btrfs send -p $localhomebackup $localNEWhomebackup | btrfs receive ${RemoteBackupFolder}
  114.                 if [ "$?" = "0" ]
  115.                   then
  116.                     fertig=2
  117.                   else
  118.                 echo "inkrementelles Backup fehlgeschlagen - vollständiges Backup wird ausgeführt !"
  119.                     [ -d $localhomebackup ] && btrfs subvolume delete $localhomebackup
  120.                     btrfs subvolume snapshot -r ${ZuSicherndesVerzeichnis} $localhomebackup
  121.                     if [ -d $remotehomebackup ] ; then
  122.                         [ -d ${RemoteBackupFolder}/${TIMESTAMP}_${RemotehomeBackupName} ] && btrfs subvolume delete ${RemoteBackupFolder}/${TIMESTAMP}_${RemotehomeBackupName}
  123.                         mv $remotehomebackup ${RemoteBackupFolder}/${TIMESTAMP}_${RemotehomeBackupName}
  124.                     fi
  125.                     [ -d $localNEWhomebackup ] && btrfs subvolume delete $localNEWhomebackup
  126.                     [ -d $remoteNEWhomebackup ] && btrfs subvolume delete $remoteNEWhomebackup
  127.                     btrfs send $localhomebackup | btrfs receive ${RemoteBackupFolder}
  128.                     btrfs subvolume snapshot -r ${ZuSicherndesVerzeichnis} $localNEWhomebackup
  129.                     fertig=1                 
  130.                 fi 
  131.            elif [ -d $localhomebackup ] && [ -d $localNEWhomebackup ] && [ -d $remotehomebackup ] && [ -d $remoteNEWhomebackup ] && [ $fertig -eq 0 ]
  132.                then
  133.                 echo "normales inkrementelles Backup"
  134.                 btrfs subvolume delete $localhomebackup
  135.                 mv $localNEWhomebackup $localhomebackup
  136.                 [ -d ${RemoteBackupFolder}/${TIMESTAMP}_${RemotehomeBackupName} ] && btrfs subvolume delete ${RemoteBackupFolder}/${TIMESTAMP}_${RemotehomeBackupName}
  137.                 mv $remotehomebackup ${RemoteBackupFolder}/${TIMESTAMP}_${RemotehomeBackupName}
  138.                 mv $remoteNEWhomebackup $remotehomebackup
  139.                 btrfs subvolume snapshot -r ${ZuSicherndesVerzeichnis} $localNEWhomebackup
  140.                 fertig=1
  141.         fi
  142. fi
  143. #
  144. [ $fertig -ne 2 ] && btrfs send -p $localhomebackup $localNEWhomebackup | btrfs receive ${RemoteBackupFolder}
  145. sync
  146. #
  147. typeset -i FILECOUNT
  148. FILECOUNT=0
  149. for file in `ls -r ${RemoteBackupFolder}` ; do
  150.     FILECOUNT=$FILECOUNT+1
  151.     [ $FILECOUNT -le $MAXBACKUPFILES ] && continue
  152.     [ "$file" = "${RemotehomeBackupName}" ] && continue
  153.     [ "$file" = "NEW_${RemotehomeBackupName}" ] && continue
  154.     btrfs subvolume delete ${RemoteBackupFolder}/${file}
  155.     echo  "deleting snapshot ${RemoteBackupFolder}/${file}"
  156. done
  157. #
  158. btrfs balance start -dusage=5 /btrfs
  159. btrfs balance start -dusage=5 ${RemoteBackupMountpoint}
  160.  
Advertisement
Add Comment
Please, Sign In to add comment