]> git.llucax.com Git - software/bacap.git/blob - bacap
dd83d2ea489416b7898ff99517c2c3875851b2c8
[software/bacap.git] / bacap
1 #!/bin/bash
2
3 #_INCLUDE_START_
4 # Default config values
5
6 # Be verbose
7 VERBOSE=1
8
9 # Be extra verbose
10 DEBUG=0
11
12 # Don't actually do anything, just print the commands
13 DRY_RUN=0
14
15 # Log file (if empty, print to stdout/err)
16 LOG_FILE=
17
18 # Where to find the configuration of the hosts to backup
19 CONFIG_PATH=/etc/bacap/hosts
20
21 # Name of the local host (so no ssh would be used with this host)
22 LOCALHOST=localhost
23
24 # Where to put the backups
25 BACKUP_PATH=/backup
26
27 # Date format used for backed up directories (passed to the date command)
28 DATE_FMT="%Y-%m-%d"
29
30 # rsync flags to use
31 RSYNC_FLAGS="-aAXHx --numeric-ids --delete"
32
33 # rsync flags to use when in verbose mode
34 RSYNC_VERBOSE_FLAGS="-v --stats"
35
36 # rsync remote shell to use
37 RSYNC_RSH="ssh -c arcfour -o Compression=no -x"
38
39 #_INCLUDE_END_
40
41 SCRIPT_DIR=$(dirname `readlink -f $0`)
42 BACAPRC=$1
43
44 # Load configuration files
45 load_config() {
46         source "/etc/bacaprc" 2> /dev/null
47         source "/etc/bacap/bacaprc" 2> /dev/null
48         source "$SCRIPT_DIR/bacaprc" 2> /dev/null
49         test -n "$BACAPRC" && source "$BACAPRC"
50 }
51 load_config
52
53 export RSYNC_RSH
54
55 run=
56 [ $DRY_RUN -eq 1 ] &&
57         run=echo
58 [ $VERBOSE -eq 1 ] &&
59         RSYNC_FLAGS="$RSYNC_FLAGS $RSYNC_VERBOSE_FLAGS"
60 [ $DEBUG -eq 1 ] &&
61         V=-v
62 [ -n "$LOG_FILE" ] &&
63         exec 3>&2 &&
64         exec 1>>"$LOG_FILE" &&
65         exec 2>>"$LOG_FILE"
66
67 pout() {
68         echo "$@" >&3
69 }
70
71 plog() {
72         [ $VERBOSE -eq 1 ] &&
73                 echo "$@"
74 }
75
76 perror() {
77         echo "$@" >&2
78 }
79
80 host_up() {
81         ping -c1 "$1" > /dev/null 2>&1
82 }
83
84 date=`date "+$DATE_FMT"`
85 plog
86 plog
87 plog "========================================================================="
88 plog "Starting backup for $date at `date '+%Y-%m-%d %H:%M:%S'`"
89 plog "========================================================================="
90 ret=0
91 for host_path in "$CONFIG_PATH"/*
92 do
93         # Load default config and override config if correspond
94         load_config
95         source "$host_path/bacaprc" 2>/dev/null
96         host=`basename "$host_path"`
97         host_backup_path="$BACKUP_PATH/$host"
98         dst="$BACKUP_PATH/$host/$date"
99         src=`cat "$host_path/paths"`
100         [ "$host" != "$LOCALHOST" ] &&
101                 src=`awk "{print \"$host:\"\\$1}" "$host_path/paths"`
102         exclude="$host_path/excludes"
103         current_link="$host_backup_path/current"
104         current_dir="$host_backup_path/`readlink \"$current_link\"`"
105         exclude_flags=
106         plog "-----------------------------------------------------------------"
107         plog "Backup for host $host"
108         plog "-----------------------------------------------------------------"
109         plog "Source:      "$src
110         plog "Destination: $dst"
111         plog "Last:        $current_dir"
112         plog
113         [ -d "$dst" ] &&
114                 perror "$dst already exists, skipping..." &&
115                 continue
116         ! host_up $host &&
117                 perror "$host is down, skipping..." &&
118                 continue
119         [ -r "$exclude" ] &&
120                 exclude_flags=" --exclude-from=$exclude --delete-excluded"
121         plog "Rotating backup..."
122         $run cp -al $V "$current_dir" "$dst" ||
123                 ret=$(($ret+1))
124         plog "Running rsync..."
125         $run rsync $RSYNC_FLAGS $exclude_flags $src "$dst/" ||
126                 ret=$(($ret+1))
127         plog "Moving current..."
128         $run rm $V "$current_link" ||
129                 ret=$(($ret+1))
130         $run ln -s $V "$date" "$current_link" ||
131                 ret=$(($ret+1))
132 done
133
134 plog "========================================================================="
135 plog "Backup for $date finished at `date '+%Y-%m-%d %H:%M:%S'`"
136 plog "========================================================================="
137
138 if [ $ret -ne 0 ]
139 then
140         pout 'There were some errors when running the backup.'
141         pout
142         pout "Please take a look at the log: $LOG_FILE"
143         pout
144 fi
145
146 exit $ret
147