aboutsummaryrefslogtreecommitdiff
path: root/local
diff options
context:
space:
mode:
Diffstat (limited to 'local')
-rw-r--r--local123
1 files changed, 123 insertions, 0 deletions
diff --git a/local b/local
new file mode 100644
index 0000000..37b2574
--- /dev/null
+++ b/local
@@ -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