]> git.llucax.com Git - software/bacap.git/blob - bacap
fb6cc5ec57baccb24df041b6419a5c1b7a5739f0
[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
42 # Load configuration files
43 source "/etc/bacaprc" 2> /dev/null
44 source "/etc/bacap/bacaprc" 2> /dev/null
45 source `dirname \`readlink -f "$0"\``/bacaprc 2> /dev/null
46 test -n "$1" && source "$1"
47
48
49 export RSYNC_RSH
50
51 run=
52 [ $DRY_RUN -eq 1 ] &&
53         run=echo
54 [ $VERBOSE -eq 1 ] &&
55         RSYNC_FLAGS="$RSYNC_FLAGS $RSYNC_VERBOSE_FLAGS"
56 [ $DEBUG -eq 1 ] &&
57         V=-v
58 [ -n "$LOG_FILE" ] &&
59         exec 3>&2 &&
60         exec 1>>"$LOG_FILE" &&
61         exec 2>>"$LOG_FILE"
62
63 pout() {
64         echo "$@" >&3
65 }
66
67 plog() {
68         [ $VERBOSE -eq 1 ] &&
69                 echo "$@"
70 }
71
72 perror() {
73         echo "$@" >&2
74 }
75
76 host_up() {
77         ping -c1 "$1" > /dev/null 2>&1
78 }
79
80 date=`date "+$DATE_FMT"`
81 plog
82 plog
83 plog "========================================================================="
84 plog "Starting backup for $date at `date '+%Y-%m-%d %H:%M:%S'`"
85 plog "========================================================================="
86 ret=0
87 for host_path in "$CONFIG_PATH"/*
88 do
89         host=`basename "$host_path"`
90         host_backup_path="$BACKUP_PATH/$host"
91         dst="$BACKUP_PATH/$host/$date"
92         src=`cat "$host_path/paths"`
93         [ "$host" != "$LOCALHOST" ] &&
94                 src=`awk "{print \"$host:\"\\$1}" "$host_path/paths"`
95         exclude="$host_path/excludes"
96         current_link="$host_backup_path/current"
97         current_dir="$host_backup_path/`readlink \"$current_link\"`"
98         exclude_flags=
99         plog "-----------------------------------------------------------------"
100         plog "Backup for host $host"
101         plog "-----------------------------------------------------------------"
102         plog "Source:      "$src
103         plog "Destination: $dst"
104         plog "Last:        $current_dir"
105         plog
106         [ -d "$dst" ] &&
107                 perror "$dst already exists, skipping..." &&
108                 continue
109         ! host_up $host &&
110                 perror "$host is down, skipping..." &&
111                 continue
112         [ -r "$exclude" ] &&
113                 exclude_flags=" --exclude-from=$exclude --delete-excluded"
114         plog "Rotating backup..."
115         $run cp -al $V "$current_dir" "$dst" ||
116                 ret=$(($ret+1))
117         plog "Running rsync..."
118         $run rsync $RSYNC_FLAGS $exclude_flags $src "$dst/" ||
119                 ret=$(($ret+1))
120         plog "Moving current..."
121         $run rm $V "$current_link" ||
122                 ret=$(($ret+1))
123         $run ln -s $V "$date" "$current_link" ||
124                 ret=$(($ret+1))
125 done
126
127 plog "========================================================================="
128 plog "Backup for $date finished at `date '+%Y-%m-%d %H:%M:%S'`"
129 plog "========================================================================="
130
131 if [ $ret -ne 0 ]
132 then
133         pout 'There were some errors when running the backup.'
134         pout
135         pout "Please take a look at the log: $LOG_FILE"
136         pout
137 fi
138
139 exit $ret
140