]> git.sven.stormbind.net Git - sven/scripts.git/blob - hetzner/hetznerbackupv2.sh
First try to make this a bit more robust and add email reporting in case of error
[sven/scripts.git] / hetzner / hetznerbackupv2.sh
1 #!/bin/bash
2
3 ### Halt on errors
4 #set -e
5 ### Halt on unset variables
6 set -u
7
8 ### Do not inherit the following variables
9 # Safety net just in case some calls this
10 # script in a bogus way.
11 unset $dry
12
13 ### Debug
14 #set -x 
15 #set dry="--dry-run"
16
17 ### General settings
18 export PASSPHRASE=s
19 export FTP_PASSWORD=s
20 FTP_USER=uxxx
21 FTP_HOST=uxxx.your-backup.de
22 PROTO=ssh
23 ROOTMAIL="root@localhost"
24 LOCKFILE="/var/lock/backup/hetznerbackup"
25 LOGFILE="/var/log/hetznerbackup"
26 SESSIONLOG=$(mktemp /var/tmp/hetznerbackup.XXXXXXXXX)
27 ERRSTAT=0
28
29 ## Backup job for main
30 job_main() {
31     echo "" >> $SESSIONLOG
32     echo "Backing up main `date`" >>
33     echo "" >> $SESSIONLOG
34
35     echo "Going for /etc" >> $SESSIONLOG
36     duplicity $BMODE $dry /etc $PROTO://$FTP_USER@$FTP_HOST/main/etc >> $SESSIONLOG 2>&1 || ERRSTAT=1
37     duplicity remove-all-but-n-full 5 --force $dry $PROTO://$FTP_USER@$FTP_HOST/main/etc >> $SESSIONLOG 2>&1 || ERRSTAT=1
38
39     echo "Going for /home" >> $SESSIONLOG
40     duplicity $BMODE $dry /home $PROTO://$FTP_USER@$FTP_HOST/main/home >> $SESSIONLOG 2>&1  || ERRSTAT=1
41     duplicity remove-all-but-n-full 5 --force $dry $PROTO://$FTP_USER@$FTP_HOST/main/home >> $SESSIONLOG 2>&1 || ERRSTAT=1 
42
43     echo "Going for /var/www" >> $SESSIONLOG
44     duplicity $BMODE $dry /var/www $PROTO://$FTP_USER@$FTP_HOST/main/var/www >> $SESSIONLOG 2>&1  || ERRSTAT=1
45     duplicity remove-all-but-n-full 5 --force $dry $PROTO://$FTP_USER@$FTP_HOST/main/var/www >> $SESSIONLOG 2>&1  || ERRSTAT=1
46
47     echo "Going for /var/lib/automysqlbackup" >> $SESSIONLOG
48     if [ -e /var/lib/automysqlbackup/backupdone ]; then
49             duplicity $BMODE $dry /var/lib/automysqlbackup $PROTO://$FTP_USER@$FTP_HOST/main/automysqlbackup >> $SESSIONLOG 2>&1  || ERRSTAT=1
50             duplicity remove-all-but-n-full 5 --force $dry $PROTO://$FTP_USER@$FTP_HOST/main/automysqlbackup >> $SESSIONLOG 2>&1  || ERRSTAT=1
51     else
52        echo "WARNING: It seems that the last mysql backup is still runing" >> $SESSIONLOG
53        echo "Skipping mysql backup - please re-schedule" >> $SESSIONLOG
54     fi
55
56     echo "" >> $SESSIONLOG
57 }
58
59 # Append the session log to the main logfile and remove it
60 clean_log() {
61    cat $SESSIONLOG >> $LOGFILE
62    rm $SESSIONLOG
63 }
64
65 ### check for other runing instances of this script
66 if [ -e $LOCKFILE ]; then
67     echo "Lockfile $LOCKFILE found - aborting"
68     echo "This is a typical result of a failed backup run, please contact your admin"
69     exit 5
70 else
71     touch $LOCKFILE
72 fi
73
74 ### Set the duplicity backup mode we would like to use
75 if [[ $(LANG=C; date +%A) =~ Sunday ]]; then
76     echo "Runing in full mode"
77     BMODE="full"
78 else
79     echo "Runing in incr mode"
80     BMODE="incr"
81 fi
82
83 ### Start the backup jobs
84 job_main
85
86 ### Cleanup and reporting
87 ENDDATE=$(date)
88 if [ $ERRSTAT -eq 0 ]; then
89     echo "Backup finished successfully $ENDDATE" >> $SESSIONLOG
90     clean_log
91     rm $LOCKFILE
92     exit 0
93 else
94     echo "ERROR Backup FAILED $ENDDATE" >> $SESSIONLOG
95     cat $SESSIONLOG|mail -s "ERROR Backup FAILED $ENDDATE" $ROOTMAIL
96     clean_log
97     exit 1
98 fi