aboutsummaryrefslogtreecommitdiff
path: root/local
blob: 37b257456e24e66a2e967e1d4d9a34083180d5b5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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