diff options
Diffstat (limited to 'handlers/rdiff.in')
-rw-r--r-- | handlers/rdiff.in | 216 |
1 files changed, 116 insertions, 100 deletions
diff --git a/handlers/rdiff.in b/handlers/rdiff.in index 0f93429..60386fa 100644 --- a/handlers/rdiff.in +++ b/handlers/rdiff.in @@ -1,4 +1,5 @@ # -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*- +# vim: set filetype=sh sw=3 sts=3 expandtab autoindent: # # rdiff-backup handler script for backupninja # requires rdiff-backup @@ -7,68 +8,74 @@ ### FUNCTIONS ### function test_connection() { - # given a user and host, - # tests the connection. - # if user or host is missing, returns 0 - # (ie, assume it's a local connection). - if [ $# -lt 2 ]; then - debug "(local is assumed to be a good connection)" - return 0 - fi - local user=$1 - local host=$2 - 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 - fatal "Can't connect to $host as $user." - fi + # given a user and host, + # tests the connection. + # if user or host is missing, returns 0 + # (ie, assume it's a local connection). + if [ $# -lt 2 ]; then + debug "(local is assumed to be a good connection)" + return 0 + fi + local user=$1 + local host=$2 + 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 + fatal "Can't connect to $host as $user." + fi } function get_version() { - # given no arguments, returns the local version. - # given a user and host, returns the remote version. - # if user or host is missing, returns the local version. - if [ "$#" -lt 2 ]; then - debug "$RDIFFBACKUP -V" - echo `$RDIFFBACKUP -V` - else - local user=$1 - local host=$2 - debug "ssh $sshoptions $host -l $user '$RDIFFBACKUP -V'" - echo `ssh $sshoptions $host -l $user "$RDIFFBACKUP -V | grep rdiff-backup"` - fi + # given no arguments, returns the local version. + # given a user and host, returns the remote version. + # if user or host is missing, returns the local version. + local version + if [ "$#" -lt 2 ]; then + debug "$RDIFFBACKUP -V" + echo `$RDIFFBACKUP -V` + else + local user=$1 + local host=$2 + debug "ssh $sshoptions $host -l $user '$RDIFFBACKUP -V'" + version=`ssh $sshoptions $host -l $user "$RDIFFBACKUP -V"` + if [ $? = 127 ]; then + fatal "Unable to execute rdiff-backup on remote server. It probably isn't installed" + else + echo "$version" | grep rdiff-backup + fi + fi } function check_consistency() { - local section=$1 - local type=$2 - local user=$3 - local host=$4 - if [ "$type" == "local" ]; then - if [ "$user" != "" ]; then - warning "User should not be specified for local $section." - fi - if [ "$host" != "" ]; then - warning "Host should not be specified for local $section." - fi - fi - if [ "$type" == "remote" ]; then - if [ "$user" == "" ]; then - fatal "User must be specified for remote $section." - fi - if [ "host" == "" ]; then - fatal "Host must be specifed for remote $section." - fi - fi + local section=$1 + local type=$2 + local user=$3 + local host=$4 + if [ "$type" == "local" ]; then + if [ "$user" != "" ]; then + warning "User should not be specified for local $section." + fi + if [ "$host" != "" ]; then + warning "Host should not be specified for local $section." + fi + fi + if [ "$type" == "remote" ]; then + if [ "$user" == "" ]; then + fatal "User must be specified for remote $section." + fi + if [ "$host" == "" ]; then + fatal "Host must be specifed for remote $section." + fi + fi } function check_cstream() { - local cstream=$1 - if [ ! -x $cstream ]; then - fatal "Can't find your cstream binary (trying: $cstream). If you use bwlimit you must have cstream installed." - fi + local cstream=$1 + if [ ! -x $cstream ]; then + fatal "Can't find your cstream binary (trying: $cstream). If you use bwlimit you must have cstream installed." + fi } ### GET CONFIG ### @@ -102,7 +109,7 @@ getconf sshoptions check_consistency "destination" "$type" "$user" "$host" if [ -n "$sshoptions" ] && echo $options | grep -qv "remote-schema"; then - options="$options --remote-schema 'ssh -C $sshoptions %s rdiff-backup --server'" + options="$options --remote-schema 'ssh -C $sshoptions %s rdiff-backup --server'" fi ### CHECK CONFIG ### @@ -114,7 +121,7 @@ if [ $vservers_are_available = yes ]; then vsnames="$found_vservers" else if ! vservers_exist "$vsnames" ; then - fatal "At least one of the vservers listed in vsnames ($vsnames) does not exist." + fatal "At least one of the vservers listed in vsnames ($vsnames) does not exist." fi fi if [ -n "$vsinclude" ]; then @@ -128,40 +135,40 @@ fi # check the connection at the source and destination [ -n "$test" ] || test=0 if [ "$testconnect" = "yes" ] || [ "${test}" -eq 1 ]; then - test_connection $sourceuser $sourcehost - test_connection $destuser $desthost + test_connection $sourceuser $sourcehost + test_connection $destuser $desthost fi if [ "$ignore_version" != "yes" ]; then - # see that rdiff-backup has the same version at the source and destination - sourceversion=`get_version $sourceuser $sourcehost` - destversion=`get_version $destuser $desthost` - if [ "$sourceversion" != "$destversion" ]; then - fatal "rdiff-backup does not have the same version at the source and at the destination." - fi + # see that rdiff-backup has the same version at the source and destination + sourceversion=`get_version $sourceuser $sourcehost` + destversion=`get_version $destuser $desthost` + if [ "$sourceversion" != "$destversion" ]; then + fatal "rdiff-backup does not have the same version at the source and at the destination." + fi fi # source specific checks -case $sourcetype in - remote ) execstr_sourcepart="$sourceuser@$sourcehost::/" ;; - local ) execstr_sourcepart="/" ;; - * ) fatal "sourcetype '$sourcetype' is neither local nor remote" ;; +case $sourcetype in + remote ) execstr_sourcepart="$sourceuser@$sourcehost::/" ;; + local ) execstr_sourcepart="/" ;; + * ) fatal "sourcetype '$sourcetype' is neither local nor remote" ;; esac # destination specific checks [ "$destdir" != "" ] || fatal "Destination directory not set" -case $desttype in - remote ) execstr_destpart="$destuser@$desthost::$destdir/$label" ;; - local ) execstr_destpart="$destdir/$label" ;; - * ) fatal "desttype '$desttype' is neither local nor remote" ;; +case $desttype in + remote ) execstr_destpart="$destuser@$desthost::$destdir/$label" ;; + local ) execstr_destpart="$destdir/$label" ;; + * ) fatal "desttype '$desttype' is neither local nor remote" ;; esac - + ### REMOVE OLD BACKUPS ### if [ "$keep" != yes ]; then if [ "`echo $keep | tr -d 0-9`" == "" ]; then - # add D if no other date unit is specified + # add D if no other date unit is specified keep="${keep}D" fi @@ -175,27 +182,27 @@ if [ "$keep" != yes ]; then if [ $test = 0 ]; then output="`su -c "$removestr" 2>&1`" if [ $? = 0 ]; then - debug $output - info "Removing backups older than $keep days succeeded." + debug $output + info "Removing backups older than $keep days succeeded." else - warning $output - warning "Failed removing backups older than $keep." + warning $output + warning "Failed removing backups older than $keep." fi fi fi -# Add cstream +# Add cstream if [ ! -z $bwlimit ]; then - check_cstream $CSTREAM; - if [ "$desttype" = "remote" ]; then - RDIFFBACKUP="$RDIFFBACKUP --remote-schema 'cstream -t $bwlimit | ssh %s \''rdiff-backup --server\'''" - elif [ "$sourcetype" = "remote" ]; then - RDIFFBACKUP="$RDIFFBACKUP --remote-schema 'ssh %s \''rdiff-backup --server\'' | cstream -t $bwlimit'" - else - fatal "You specified a bandwidth limit but neither your source nor destination types are remote." - fi + check_cstream $CSTREAM; + if [ "$desttype" = "remote" ]; then + RDIFFBACKUP="$RDIFFBACKUP --remote-schema 'cstream -t $bwlimit | ssh %s \''rdiff-backup --server\'''" + elif [ "$sourcetype" = "remote" ]; then + RDIFFBACKUP="$RDIFFBACKUP --remote-schema 'ssh %s \''rdiff-backup --server\'' | cstream -t $bwlimit'" + else + fatal "You specified a bandwidth limit but neither your source nor destination types are remote." + fi fi ### EXECUTE ### @@ -208,29 +215,38 @@ symlinks_warning="Maybe you have mixed symlinks and '*' in this statement, which # TODO: order the includes and excludes # excludes +SAVEIFS=$IFS +IFS=$(echo -en "\n\b") for i in $exclude; do str="${i//__star__/*}" execstr="${execstr}--exclude '$str' " done -# includes +IFS=$SAVEIFS +# includes +SAVEIFS=$IFS +IFS=$(echo -en "\n\b") for i in $include; do [ "$i" != "/" ] || fatal "Sorry, you cannot use 'include = /'" str="${i//__star__/*}" execstr="${execstr}--include '$str' " done +IFS=$SAVEIFS # vsinclude if [ $usevserver = yes ]; then for vserver in $vsnames; do + SAVEIFS=$IFS + IFS=$(echo -en "\n\b") for vi in $vsinclude; do - str="${vi//__star__/*}" - str="$VROOTDIR/$vserver$str" + str="${vi//__star__/*}" + str="$VROOTDIR/$vserver$str" if [ -n "$str" ]; then - execstr="${execstr}--include '$str' " + execstr="${execstr}--include '$str' " else warning "vsinclude statement '${vi//__star__/*}' will be ignored for VServer $vserver. $symlinks_warning" fi done + IFS=$SAVEIFS done fi @@ -238,20 +254,20 @@ set +o noglob # exclude everything else [ "$include" != "" -o "$vsinclude" != "" ] && execstr="${execstr}--exclude '/*' " - + # include client-part and server-part execstr="${execstr}$execstr_sourcepart $execstr_destpart" debug "$execstr" if [ $test = 0 ]; then - output=`nice -n $nicelevel su -c "$execstr" 2>&1` - if [ $? = 0 ]; then - debug $output - info "Successfully finished backing up source $label" - else - warning $output - warning "Failed backup up source $label" - fi -fi + output=`nice -n $nicelevel su -c "$execstr" 2>&1` + if [ $? = 0 ]; then + debug $output + info "Successfully finished backing up source $label" + else + warning $output + warning "Failed backup up source $label" + fi +fi return 0 |