diff options
Diffstat (limited to 'local')
-rw-r--r-- | local | 123 |
1 files changed, 123 insertions, 0 deletions
@@ -0,0 +1,123 @@ +#!/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 <https://www.gnu.org/licenses/>. +# + + +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 |