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
|