View difference between Paste ID: 4uLHbZHF and AHPXDVwt
SHOW: | | - or go back to the newest paste.
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
10+
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