]> git.llucax.com Git - software/bacap.git/blobdiff - bacap
Let rsync do the hard linking
[software/bacap.git] / bacap
diff --git a/bacap b/bacap
index fb6cc5ec57baccb24df041b6419a5c1b7a5739f0..8c649ed099fe4d0df4aea98e2edd2ce420c8546a 100755 (executable)
--- a/bacap
+++ b/bacap
@@ -12,6 +12,9 @@ DEBUG=0
 # Don't actually do anything, just print the commands
 DRY_RUN=0
 
 # Don't actually do anything, just print the commands
 DRY_RUN=0
 
+# Force synchronization, even when the target already exist
+FORCE_SYNC=0
+
 # Log file (if empty, print to stdout/err)
 LOG_FILE=
 
 # Log file (if empty, print to stdout/err)
 LOG_FILE=
 
@@ -19,7 +22,7 @@ LOG_FILE=
 CONFIG_PATH=/etc/bacap/hosts
 
 # Name of the local host (so no ssh would be used with this host)
 CONFIG_PATH=/etc/bacap/hosts
 
 # Name of the local host (so no ssh would be used with this host)
-LOCALHOST=localhost
+LOCALHOST=$HOSTNAME
 
 # Where to put the backups
 BACKUP_PATH=/backup
 
 # Where to put the backups
 BACKUP_PATH=/backup
@@ -27,6 +30,10 @@ BACKUP_PATH=/backup
 # Date format used for backed up directories (passed to the date command)
 DATE_FMT="%Y-%m-%d"
 
 # Date format used for backed up directories (passed to the date command)
 DATE_FMT="%Y-%m-%d"
 
+# Ping remote hosts to check if they are up (set to 0 if your hosts don't
+# reply to ICMP pings).
+PING_CHECK=1
+
 # rsync flags to use
 RSYNC_FLAGS="-aAXHx --numeric-ids --delete"
 
 # rsync flags to use
 RSYNC_FLAGS="-aAXHx --numeric-ids --delete"
 
@@ -38,13 +45,17 @@ RSYNC_RSH="ssh -c arcfour -o Compression=no -x"
 
 #_INCLUDE_END_
 
 
 #_INCLUDE_END_
 
+SCRIPT_DIR=$(dirname `readlink -f $0`)
+BACAPRC=$1
 
 # Load configuration files
 
 # Load configuration files
-source "/etc/bacaprc" 2> /dev/null
-source "/etc/bacap/bacaprc" 2> /dev/null
-source `dirname \`readlink -f "$0"\``/bacaprc 2> /dev/null
-test -n "$1" && source "$1"
-
+load_config() {
+       source "/etc/bacaprc" 2> /dev/null
+       source "/etc/bacap/bacaprc" 2> /dev/null
+       source "$SCRIPT_DIR/bacaprc" 2> /dev/null
+       test -n "$BACAPRC" && source "$BACAPRC"
+}
+load_config
 
 export RSYNC_RSH
 
 
 export RSYNC_RSH
 
@@ -73,7 +84,7 @@ perror() {
        echo "$@" >&2
 }
 
        echo "$@" >&2
 }
 
-host_up() {
+ping_host() {
        ping -c1 "$1" > /dev/null 2>&1
 }
 
        ping -c1 "$1" > /dev/null 2>&1
 }
 
@@ -86,6 +97,10 @@ plog "========================================================================="
 ret=0
 for host_path in "$CONFIG_PATH"/*
 do
 ret=0
 for host_path in "$CONFIG_PATH"/*
 do
+       saved_ret=$ret
+       # Load default config and override config if correspond
+       load_config
+       source "$host_path/bacaprc" 2>/dev/null
        host=`basename "$host_path"`
        host_backup_path="$BACKUP_PATH/$host"
        dst="$BACKUP_PATH/$host/$date"
        host=`basename "$host_path"`
        host_backup_path="$BACKUP_PATH/$host"
        dst="$BACKUP_PATH/$host/$date"
@@ -93,35 +108,40 @@ do
        [ "$host" != "$LOCALHOST" ] &&
                src=`awk "{print \"$host:\"\\$1}" "$host_path/paths"`
        exclude="$host_path/excludes"
        [ "$host" != "$LOCALHOST" ] &&
                src=`awk "{print \"$host:\"\\$1}" "$host_path/paths"`
        exclude="$host_path/excludes"
+       include="$host_path/includes"
        current_link="$host_backup_path/current"
        current_dir="$host_backup_path/`readlink \"$current_link\"`"
        current_link="$host_backup_path/current"
        current_dir="$host_backup_path/`readlink \"$current_link\"`"
-       exclude_flags=
+       extra_flags=
        plog "-----------------------------------------------------------------"
        plog "Backup for host $host"
        plog "-----------------------------------------------------------------"
        plog "-----------------------------------------------------------------"
        plog "Backup for host $host"
        plog "-----------------------------------------------------------------"
-       plog "Source:      "$src
+       plog "Source:      $src"
        plog "Destination: $dst"
        plog "Last:        $current_dir"
        plog
        plog "Destination: $dst"
        plog "Last:        $current_dir"
        plog
-       [ -d "$dst" ] &&
+       [ -d "$dst" ] && [ "$FORCE_SYNC" -ne 1 ] &&
                perror "$dst already exists, skipping..." &&
                continue
                perror "$dst already exists, skipping..." &&
                continue
-       ! host_up $host &&
+       [ "$PING_CHECK" -eq 1 ] && ! ping_host $host &&
                perror "$host is down, skipping..." &&
                continue
        [ -r "$exclude" ] &&
                perror "$host is down, skipping..." &&
                continue
        [ -r "$exclude" ] &&
-               exclude_flags=" --exclude-from=$exclude --delete-excluded"
-       plog "Rotating backup..."
-       $run cp -al $V "$current_dir" "$dst" ||
-               ret=$(($ret+1))
+               extra_flags="--exclude-from=$exclude --delete-excluded"
+       [ -r "$include" ] &&
+               extra_flags="$extra_flags --include-from=$include"
        plog "Running rsync..."
        plog "Running rsync..."
-       $run rsync $RSYNC_FLAGS $exclude_flags $src "$dst/" ||
+       $run rsync $RSYNC_FLAGS $extra_flags \
+                               --link-dest="$current_dir" $src "$dst/" ||
                ret=$(($ret+1))
        plog "Moving current..."
        $run rm $V "$current_link" ||
                ret=$(($ret+1))
        $run ln -s $V "$date" "$current_link" ||
                ret=$(($ret+1))
                ret=$(($ret+1))
        plog "Moving current..."
        $run rm $V "$current_link" ||
                ret=$(($ret+1))
        $run ln -s $V "$date" "$current_link" ||
                ret=$(($ret+1))
+       if [ $ret -ne $saved_ret ]
+       then
+               ERROR_HOSTS="$ERROR_HOSTS $host"
+       fi
 done
 
 plog "========================================================================="
 done
 
 plog "========================================================================="
@@ -130,7 +150,7 @@ plog "========================================================================="
 
 if [ $ret -ne 0 ]
 then
 
 if [ $ret -ne 0 ]
 then
-       pout 'There were some errors when running the backup.'
+       pout "There were some errors when running the backup on: $ERROR_HOSTS"
        pout
        pout "Please take a look at the log: $LOG_FILE"
        pout
        pout
        pout "Please take a look at the log: $LOG_FILE"
        pout