# # rdiff-backup handler script for backupninja # requires rdiff-backup # getconf options getconf testconnect yes getconf nicelevel 0 setsection source getconf type; sourcetype=$type getconf label getconf keep 60 getconf include getconf vsinclude getconf exclude ### DESTINATION ### setsection dest getconf directory; destdir=$directory # strip trailing / destdir=${destdir%/} getconf type; desttype=$type getconf user; destuser=$user getconf host; desthost=$host # 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 fi [ "$destdir" != "" ] || fatal "Destination directory not set" if [ "$desttype" == "remote" ]; then # see if we can login if [ "$testconnect" == "yes" ]; then hostalive=0 debug "ssh -o PasswordAuthentication=no $desthost -l $destuser 'echo -n 1'" ret=`ssh -o PasswordAuthentication=no $desthost -l $destuser 'echo -n host is alive'` if echo $ret | grep "host is alive"; then debug "Connected to $desthost as $destuser successfully" else fatal "Can't connect to $desthost as $destuser." fi fi # see that rdiff-backup has the same version as here debug "ssh $desthost -l $destuser '$RDIFFBACKUP -V'\"" remoteversion=`ssh $desthost -l $destuser "$RDIFFBACKUP -V | grep rdiff-backup"` localversion=`$RDIFFBACKUP -V` if [ "$remoteversion" != "$localversion" ]; then fatal "rdiff-backup does not have the same version on this computer and the backup server." fi execstr_serverpart="$destuser@$desthost::$destdir/$label" else execstr_serverpart="$destdir/$label" fi ### SOURCE ### [ "$label" != "" ] || fatal "Source missing label" [ "$sourcetype" == "local" ] || fatal "Only local source type supported" [ "$include" != "" -o "$vsinclude" != "" ] || fatal "No source includes specified" #TODO should I test for vsinclude if usevservers=1? execstr_clientpart="/" ## REMOVE OLD BACKUPS if [ "`echo $keep | tr -d 0-9`" == "" ]; then keep="${keep}D" fi removestr="rdiff-backup --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` code=$? if [ "$code" == "0" ]; then debug $output info "Removing backups older than $keep days succeeded." else warning $output warning "Failed removing backups older than $keep." fi fi ## EXECUTE ## execstr="$RDIFFBACKUP $options --print-statistics " # TODO: order the includes and excludes # excludes for i in $exclude; do str="${i//__star__/*}" execstr="${execstr}--exclude '$str' " done # includes for i in $include; do 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 fi # exclude everything else execstr="${execstr}--exclude '/*' " # include client-part and server-part execstr="${execstr}$execstr_clientpart $execstr_serverpart" debug "$execstr" if [ ! $test ]; then output=`nice -n $nicelevel su -c "$execstr" 2>&1` code=$? if [ "$code" == "0" ]; then debug $output info "Successfully finished backing up source '$label'" else warning $output warning "Failed backup up source '$label'" fi fi return 0