#!/usr/bin/env bash # # local - functions acting on the local host. # # Copyright 2015 - 2019 Einhard Leichtfuß # # This file is part of rsync-backup. # # rsync-backup is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # rsync-backup is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with rsync-backup. If not, see . # function main { local src_old_date local src_new_date local src_mirrors_path shopt -s $SHOPTS # Set $src, $dest_path and $filter_args. get_args "$@" || return $? shopt -s $SHOPTS_AFTER_GET_ARGS run_function "$src_host" src_prepare \ 'assert_is_dir create_dir replace_symlink' \ 'src_path src_mirror_reldir RSYNC rsync_args[@] filter_args[@] DATEFMT' \ || return $? src_mirrors_path="${src_path}/${src_mirror_reldir}" src_old_date="$( run_command "$src_host" readlink "${src_mirrors_path}/old")" src_new_date="$( run_command "$src_host" readlink "${src_mirrors_path}/new")" if [[ "$src_old_date" == 'none' ]] then run_function "$dest_host" dest_prepare_initial 'create_new_dir' '' \ || return $? transfer_initial_backup "$src_new_date" || return $? else run_function "$dest_host" dest_prepare_incremental \ 'assert_is_dir dest_list_backup_dirs create_new_dir' 'dest_path' \ "$src_old_date" "$src_new_date" \ || return $? transfer_incremental_backup "$src_old_date" "$src_new_date" || return $? fi run_function "$dest_host" dest_finalize \ 'dest_refresh_symlinks assert_is_dir dest_list_backup_dirs replace_symlink_target create_dir' \ 'dest_path' \ "$src_old_date" "$src_new_date" \ || return $? return $RET_SUCCESS } # Transfer the very first backup from source to destination. To be run after # src_prepare and dest_prepare. # # $1: date of the backup: date in $DATEFMT # function transfer_initial_backup { local date="$1" message "Transfer new (initial) backup..." "$RSYNC" "${rsync_args[@]}" \ "${src}/${src_mirror_reldir}/${date}" \ "${dest}/work" \ || return $RET_ERROR message "Finished transfer." return $RET_SUCCESS } # Transfer new backup from source to destination. To be run after # src_prepare and dest_prepare. # # $1: old date: date in $DATEFMT # $2: new date: date in $DATEFMT # function transfer_incremental_backup { local old_date="$1" local new_date="$2" message "Transfer new (incremental) backup..." # Note: Use --link-dest instead of making the old backup part of the target # directory, since src/old_date may have changed due to in-place # modifications. "$RSYNC" "${rsync_args[@]}" --link-dest='..' \ "${src}/${src_mirror_reldir}"/{"$old_date","$new_date"} \ "${dest}/work" \ || return $RET_ERROR message "Finished transfer." return $RET_SUCCESS } # vi: ft=bash ts=2 sw=2 noet