X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=handlers%2Frdiff;h=bdc1cbd25ddc7eb3b4916eea96794bfd57873db1;hb=d395ae94a5657afcc878adcd851d8e8c53df98de;hp=9de8650e1a289414d659bddc9036b1b9a36ec7b5;hpb=a116f435ce8b97fdbea9fd25f91517b1fb850881;p=matthijs%2Fupstream%2Fbackupninja.git diff --git a/handlers/rdiff b/handlers/rdiff index 9de8650..bdc1cbd 100644 --- a/handlers/rdiff +++ b/handlers/rdiff @@ -1,3 +1,4 @@ +# -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*- # # rdiff-backup handler script for backupninja # requires rdiff-backup @@ -16,8 +17,8 @@ function test_connection() { fi local user=$1 local host=$2 - debug "ssh -o PasswordAuthentication=no $host -l $user 'echo -n 1'" - local ret=`ssh -o PasswordAuthentication=no $host -l $user 'echo -n host is alive'` + debug "ssh $sshoptions -o PasswordAuthentication=no $host -l $user 'echo -n 1'" + local ret=`ssh $sshoptions -o PasswordAuthentication=no $host -l $user 'echo -n host is alive'` if echo $ret | grep "host is alive"; then debug "Connected to $host as $user successfully" else @@ -35,8 +36,8 @@ function get_version() { else local user=$1 local host=$2 - debug "ssh $host -l $user '$RDIFFBACKUP -V'" - echo `ssh $host -l $user "$RDIFFBACKUP -V | grep rdiff-backup"` + debug "ssh $sshoptions $host -l $user '$RDIFFBACKUP -V'" + echo `ssh $sshoptions $host -l $user "$RDIFFBACKUP -V | grep rdiff-backup"` fi } @@ -77,6 +78,7 @@ check_consistency "source" "$type" "$user" "$host" getconf label getconf keep 60 getconf include +getconf vsnames all getconf vsinclude getconf exclude @@ -87,24 +89,32 @@ destdir=${destdir%/} getconf type; desttype=$type getconf user; destuser=$user getconf host; desthost=$host +getconf sshoptions check_consistency "destination" "$type" "$user" "$host" ### CHECK CONFIG ### -# See if vservers are configured -if [ "$vservers" = "yes" ] -then - if [ ! -d $VROOTDIR ] - then - fatal "vservers enabled, but $VROOTDIR does not exist!" - else - info "vserver method enabled" - usevserver=1 - fi +# If vservers are configured, check that the ones listed in $vsnames do exist. +local usevserver=no +if [ $vservers_are_available = yes ]; then + if [ "$vsnames" = all ]; then + vsnames="$found_vservers" + else + if ! vservers_exist "$vsnames" ; then + fatal "At least one of the vservers listed in vsnames ($vsnames) does not exist." + fi + fi + if [ -n "$vsinclude" ]; then + info "Using vservers '$vsnames'" + usevserver=yes + fi +else + [ -z "$vsinclude" ] || warning 'vservers support disabled in backupninja.conf, vsincludes configuration lines will be ignored' fi # check the connection at the source and destination -if [ "$testconnect" == "yes" -o $test ]; then +[ -n "$test" ] || test=0 +if [ "$testconnect" = "yes" ] || [ "${test}" -eq 1 ]; then test_connection $sourceuser $sourcehost test_connection $destuser $desthost fi @@ -118,7 +128,6 @@ fi # source specific checks [ "$include" != "" -o "$vsinclude" != "" ] || fatal "No source includes specified" -#TODO should I test for vsinclude if usevservers=1? case $sourcetype in remote ) execstr_sourcepart="$sourceuser@$sourcehost::/" ;; local ) execstr_sourcepart="/" ;; @@ -140,15 +149,15 @@ if [ "`echo $keep | tr -d 0-9`" == "" ]; then keep="${keep}D" fi -removestr="$RDIFFBACKUP --force --remove-older-than $keep " +removestr="$RDIFFBACKUP $options --force --remove-older-than $keep " if [ "$desttype" == "remote" ]; then removestr="${removestr}${destuser}@${desthost}::" fi removestr="${removestr}${destdir}/${label}"; debug "$removestr" -if [ ! $test ]; then - output=`$removestr 2>&1` +if [ $test = 0 ]; then + output="`su -c "$removestr" 2>&1`" if [ $? = 0 ]; then debug $output info "Removing backups older than $keep days succeeded." @@ -162,29 +171,40 @@ fi execstr="$RDIFFBACKUP $options --print-statistics " +set -o noglob + +symlinks_warning="Maybe you have mixed symlinks and '*' in this statement, which is not supported." + # TODO: order the includes and excludes # excludes for i in $exclude; do - str="${i//__star__/*}" - execstr="${execstr}--exclude '$str' " + str="${i//__star__/*}" + execstr="${execstr}--exclude '$str' " done # includes for i in $include; do - [ "$i" != "/" ] || fatal "Sorry, you cannot use 'include = /'" - str="${i//__star__/*}" - execstr="${execstr}--include '$str' " + [ "$i" != "/" ] || fatal "Sorry, you cannot use 'include = /'" + str="${i//__star__/*}" + execstr="${execstr}--include '$str' " done # vsinclude -if [ $usevserver ]; then - for vserver in `ls $VROOTDIR|grep -v lost+found`; do - for vi in $vsinclude; do - str="${vi//__star__/*}" - execstr="${execstr}--include '$VROOTDIR/$vserver$str' " - done - done +if [ $usevserver = yes ]; then + for vserver in $vsnames; do + for vi in $vsinclude; do + str="${vi//__star__/*}" + str="$VROOTDIR/$vserver$str" + if [ -n "$str" ]; then + execstr="${execstr}--include '$str' " + else + warning "vsinclude statement '${vi//__star__/*}' will be ignored for VServer $vserver. $symlinks_warning" + fi + done + done fi +set +o noglob + # exclude everything else execstr="${execstr}--exclude '/*' " @@ -192,7 +212,7 @@ execstr="${execstr}--exclude '/*' " execstr="${execstr}$execstr_sourcepart $execstr_destpart" debug "$execstr" -if [ ! $test ]; then +if [ $test = 0 ]; then output=`nice -n $nicelevel su -c "$execstr" 2>&1` if [ $? = 0 ]; then debug $output