]> git.llucax.com Git - software/bacap.git/blob - bacap
Improve tip "Providing a ssh key"
[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 # Force synchronization, even when the target already exist
16 FORCE_SYNC=0
17
18 # Log file (if empty, print to stdout/err)
19 LOG_FILE=
20
21 # Where to find the configuration of the hosts to backup
22 CONFIG_PATH=/etc/bacap/hosts
23
24 # Name of the local host (so no ssh would be used with this host)
25 LOCALHOST=$HOSTNAME
26
27 # Where to put the backups
28 BACKUP_PATH=/backup
29
30 # Date format used for backed up directories (passed to the date command)
31 DATE_FMT="%Y-%m-%d"
32
33 # Ping remote hosts to check if they are up (set to 0 if your hosts don't
34 # reply to ICMP pings).
35 PING_CHECK=1
36
37 # rsync flags to use
38 RSYNC_FLAGS="-aAXHx --numeric-ids --delete"
39
40 # rsync flags to use when in verbose mode
41 RSYNC_VERBOSE_FLAGS="-v --stats"
42
43 # rsync remote shell to use
44 RSYNC_RSH="ssh"
45
46 #_INCLUDE_END_
47
48 SCRIPT_DIR=$(dirname `readlink -f $0`)
49 BACAPRC=$1
50
51 # Load configuration files
52 load_config() {
53         source "/etc/bacaprc" 2> /dev/null
54         source "/etc/bacap/bacaprc" 2> /dev/null
55         source "$SCRIPT_DIR/bacaprc" 2> /dev/null
56         test -n "$BACAPRC" && source "$BACAPRC"
57 }
58 load_config
59
60 export RSYNC_RSH
61
62 run=
63 [ $DRY_RUN -eq 1 ] &&
64         run=echo
65 [ $VERBOSE -eq 1 ] &&
66         RSYNC_FLAGS="$RSYNC_FLAGS $RSYNC_VERBOSE_FLAGS"
67 [ $DEBUG -eq 1 ] &&
68         V=-v
69 exec 3>&2
70 [ -n "$LOG_FILE" ] &&
71         exec 1>>"$LOG_FILE" &&
72         exec 2>>"$LOG_FILE"
73
74 pout() {
75         echo "$@" >&3
76 }
77
78 plog() {
79         [ $VERBOSE -eq 1 ] &&
80                 echo "$@"
81 }
82
83 perror() {
84         echo "$@" >&2
85 }
86
87 ping_host() {
88         ping -c1 "$1" > /dev/null 2>&1
89 }
90
91 date=`date "+$DATE_FMT"`
92 plog
93 plog
94 plog "========================================================================="
95 plog "Starting backup for $date at `date '+%Y-%m-%d %H:%M:%S'`"
96 plog "========================================================================="
97 ret=0
98 for host_path in "$CONFIG_PATH"/*
99 do
100         saved_ret=$ret
101         # Load default config and override config if correspond
102         load_config
103         source "$host_path/bacaprc" 2>/dev/null
104         host=`basename "$host_path"`
105         host_backup_path="$BACKUP_PATH/$host"
106         mkdir -p $host_backup_path
107         dst="$BACKUP_PATH/$host/$date"
108         src=`cat "$host_path/paths"`
109         [ "$host" != "$LOCALHOST" ] &&
110                 src=`awk "{print \"$host:\"\\$1}" "$host_path/paths"`
111         exclude="$host_path/excludes"
112         include="$host_path/includes"
113         current_link="$host_backup_path/current"
114         current_dir="$host_backup_path/`readlink \"$current_link\"`"
115         extra_flags=
116         plog "-----------------------------------------------------------------"
117         plog "Backup for host $host"
118         plog "-----------------------------------------------------------------"
119         plog "Source:      $src"
120         plog "Destination: $dst"
121         plog "Last:        $current_dir"
122         plog
123         [ -d "$dst" ] && [ "$FORCE_SYNC" -ne 1 ] &&
124                 perror "$dst already exists, skipping..." &&
125                 continue
126         [ "$PING_CHECK" -eq 1 ] && ! ping_host $host &&
127                 perror "$host is down, skipping..." &&
128                 continue
129         [ -r "$exclude" ] &&
130                 extra_flags="--exclude-from=$exclude"
131         [ -r "$include" ] &&
132                 extra_flags="$extra_flags --include-from=$include"
133         plog "Running rsync..."
134         $run rsync $RSYNC_FLAGS $extra_flags \
135                                 --link-dest="$current_dir" $src "$dst/" ||
136                 ret=$(($ret+1))
137         plog "Moving current..."
138         $run rm -f $V "$current_link" ||
139                 ret=$(($ret+1))
140         $run ln -s $V "$date" "$current_link" ||
141                 ret=$(($ret+1))
142         if [ $ret -ne $saved_ret ]
143         then
144                 ERROR_HOSTS="$ERROR_HOSTS $host"
145         fi
146 done
147
148 plog "========================================================================="
149 plog "Backup for $date finished at `date '+%Y-%m-%d %H:%M:%S'`"
150 plog "========================================================================="
151
152 if [ $ret -ne 0 ]
153 then
154         pout
155         pout "There were some errors when running the backup on: $ERROR_HOSTS"
156         pout
157         if [ -n "$LOG_FILE" ]
158         then
159                 pout "Please take a look at the log: $LOG_FILE"
160                 pout
161         fi
162 fi
163
164 exit $ret
165