Guest User

Untitled

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