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