mirror of
https://github.com/lloeki/rsync-backup.git
synced 2025-12-06 01:34:39 +01:00
Add public-ready version
This commit is contained in:
commit
ef07b8e57b
2 changed files with 131 additions and 0 deletions
21
LICENSE
Normal file
21
LICENSE
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2019 Loic Nageleisen
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
110
rsync-backup.sh
Executable file
110
rsync-backup.sh
Executable file
|
|
@ -0,0 +1,110 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
set -u
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
# TODO: update from github
|
||||||
|
# TODO: reexec with caffeinate
|
||||||
|
# TODO: take arguments: config, verbose, progress
|
||||||
|
# TODO: purge old backups
|
||||||
|
# TODO: purge previous progress
|
||||||
|
# TODO: lock, and unlock on trap exit
|
||||||
|
# TODO: non-darwin compatibility
|
||||||
|
|
||||||
|
if [[ -z "${HOME}" ]]; then
|
||||||
|
echo "error: \$HOME unset" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
excluded=()
|
||||||
|
excluded+=('.DS_Store')
|
||||||
|
|
||||||
|
included=()
|
||||||
|
|
||||||
|
config="${HOME}/.config/rsync-backup/rsync-backup.conf"
|
||||||
|
|
||||||
|
if [[ -f "${config}" ]]; then
|
||||||
|
# shellcheck disable=SC1090
|
||||||
|
source "${config}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
name="${name:-$(hostname -s)}"
|
||||||
|
|
||||||
|
if [[ -z "${name}" ]]; then
|
||||||
|
echo "error: \$name unset" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z "${tgt}" ]]; then
|
||||||
|
echo "error: \$tgt unset" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
src="${src:-${HOME}}"
|
||||||
|
port="${port:-22}"
|
||||||
|
ts="${ts:-$(date -u '+%Y-%m-%d-%H%M%S')}"
|
||||||
|
|
||||||
|
ssh=()
|
||||||
|
if [[ ${tgt} = *:* ]]; then
|
||||||
|
ssh-add -l > /dev/null || ssh-add -A
|
||||||
|
ssh+=(ssh -p "${port}" "${tgt%%:*}")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# TODO: create only when no latest
|
||||||
|
# TODO: remove after first backup
|
||||||
|
"${ssh[@]}" mkdir -p "${tgt#*:}/1970-01-01-000000"
|
||||||
|
|
||||||
|
"${ssh[@]}" mkdir -p "${tgt#*:}/${ts}.progress"
|
||||||
|
|
||||||
|
function latest() {
|
||||||
|
"${ssh[@]}" ls -1 "${tgt#*:}/" | grep -v '\.progress$' | grep -v latest | tail -1
|
||||||
|
}
|
||||||
|
latest="${tgt#*:}/$(latest)"
|
||||||
|
echo "latest: '${latest}'"
|
||||||
|
|
||||||
|
args=()
|
||||||
|
args+=(--verbose)
|
||||||
|
args+=(--progress)
|
||||||
|
args+=(--compress)
|
||||||
|
args+=(--rsh "ssh -p ${port}")
|
||||||
|
args+=(--archive)
|
||||||
|
args+=(--delete)
|
||||||
|
args+=(--delete-excluded)
|
||||||
|
|
||||||
|
for inc in "${included[@]}"; do
|
||||||
|
args+=(--include "${inc}")
|
||||||
|
done
|
||||||
|
|
||||||
|
for exc in "${excluded[@]}"; do
|
||||||
|
args+=(--exclude "${exc}")
|
||||||
|
done
|
||||||
|
|
||||||
|
# TODO: add multiple --link-dest
|
||||||
|
args+=(--link-dest "${latest}/")
|
||||||
|
args+=("${src}/")
|
||||||
|
args+=("${tgt}/${ts}.progress/")
|
||||||
|
|
||||||
|
# TODO: create local snapshot, and delete on trap exit
|
||||||
|
# tmutil localsnapshot # => Created local snapshot with date: 2021-05-18-184103
|
||||||
|
# tmutil listlocalsnapshots / # => com.apple.TimeMachine.2021-05-18-184302.local
|
||||||
|
# diskutil apfs listvolumesnapshots disk1s2 # => Name: com.apple.TimeMachine.2021-05-18-184302.local
|
||||||
|
# mkdir -p /tmp/rsync-backup.snapshot.2021-05-18-184302
|
||||||
|
# mount_apfs -s com.apple.TimeMachine.2021-05-18-184302.local /Users /tmp/rsync-backup.snapshot.2021-05-18-184302
|
||||||
|
# ls /tmp/rsync-backup.snapshot.2021-05-18-184302/Users/
|
||||||
|
# diskutil unmount /tmp/rsync-backup.snapshot.2021-05-18-184302
|
||||||
|
# tmutil deletelocalsnapshots 2021-05-18-184302
|
||||||
|
# tmutil deletelocalsnapshots /
|
||||||
|
|
||||||
|
rc="0"
|
||||||
|
set -x
|
||||||
|
rsync "${args[@]}" || rc="$?"
|
||||||
|
set +x
|
||||||
|
|
||||||
|
case $rc in
|
||||||
|
24|0) : ;;
|
||||||
|
*) exit "$rc" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
"${ssh[@]}" mv -v "${tgt#*:}/${ts}.progress" "${tgt#*:}/${ts}"
|
||||||
|
"${ssh[@]}" ln -svhf "${tgt#*:}/${ts}" "${tgt#*:}/latest"
|
||||||
Loading…
Add table
Add a link
Reference in a new issue