aboutsummaryrefslogtreecommitdiff
path: root/variables
diff options
context:
space:
mode:
Diffstat (limited to 'variables')
-rw-r--r--variables211
1 files changed, 211 insertions, 0 deletions
diff --git a/variables b/variables
new file mode 100644
index 0000000..e3eb451
--- /dev/null
+++ b/variables
@@ -0,0 +1,211 @@
+#!/usr/bin/env bash
+#
+# variables.
+#
+# 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/>.
+#
+
+
+## CONSTANTS
+typeset -r CONFIG=/etc/rsync-backup/config
+
+typeset -r RET_TYPES='
+ RET_SUCCESS RET_FAILURE RET_BADSYNTAX RET_FILE_ERR RET_ERROR'
+typeset -r RET_SUCCESS=0
+typeset -r RET_FAILURE=1
+typeset -r RET_BADSYNTAX=2
+typeset -r RET_FILE_ERR=4
+typeset -r RET_ERROR=8
+
+typeset -r DATEFMT='%Y-%m-%d_%H%M%S'
+
+# Shell options:
+# nullglob: In case of a non-matching glob, return nothing.
+# dotglob: Include dotfiles (except . and ..) in glob matching.
+typeset -r SHOPTS='dotglob'
+typeset -r SHOPTS_AFTER_GET_ARGS='nullglob'
+
+# Always give these variables and functions to remotely executed commands,
+# as they are very commonly used.
+# These will not be listed as required.
+# Note that $host is given as argument to run_function.
+typeset -r REMOTE_DEFAULT_VARS="$RET_TYPES verbose debug host"
+typeset -r REMOTE_DEFAULT_FUNS='prefixed_write message debug error
+ debug_error'
+
+
+## Global program variables.
+typeset src src_path src_host
+typeset dest dest_path dest_host
+typeset -a filter_args
+typeset -i n
+
+
+## Variables that may be configured.
+typeset RSYNC=rsync
+
+typeset verbose=true
+typeset debug=true
+
+# Location to put mirrored trees on the source.
+typeset src_mirror_reldir='.backup'
+
+typeset -a rsync_base_args
+typeset -a rsync_mirror_args
+typeset -a rsync_transfer_args
+typeset -A bakpath
+typeset -A filter_file
+typeset filter_file_all # Applied after specific filter.
+
+# Base arguments for rsync (-rptogAXlHS, --timeout=, --numeric-ids, --info=).
+# These are used both for creation of the source mirror and the transfer of
+# that mirror to the destination. In both cases, attributes may be added.
+rsync_args=(
+ --recursive
+ --perms --times --owner --group
+ --acls --xattrs
+ --links
+ --hard-links
+ --sparse
+ --numeric-ids
+ --timeout=60
+ #-vv
+ --info=progress2
+ )
+
+source "$CONFIG"
+
+
+# Set the globabl variables $src, $dest_path and $filter_args according to
+# command line parameters and the configuration.
+#
+# $@: command line parameters
+#
+# requires the shell option nullglob to be _unset_. (for test -v to work)
+#
+function get_args
+{
+ if [ $# -eq 0 ]
+ then
+ message "Usage: $exec_name <src> [<dest>]" 2>&1
+ return $RET_BADSYNTAX
+ fi
+
+ local l_src="$1"
+ local l_dest
+
+ # Set $src_path, $src_host and $src.
+ resolve_host_path src "$l_src" || return $?
+
+ if [ $# -gt 1 ]
+ then
+ l_dest="$2"
+ elif [[ -v bakpath[$src] ]] # $# -eq 1
+ then
+ l_dest="${bakpath[$src]}"
+ else
+ error "Backup path for \"$src\" neither configured" \
+ "nor specified on command line."
+
+ return $RET_BADSYNTAX
+ fi
+
+ # Set $dest_path, $dest_host and $dest.
+ resolve_host_path dest "$l_dest" || return $?
+
+ filter_args=()
+ if [[ -v filter_file[$src] && -f "${filter_file[$src]}" ]]
+ then
+ filter_args+=("--filter=merge ${filter_file[$src]}")
+ fi
+ if [[ -v filter_file_all && -f "$filter_file_all" ]]
+ then
+ filter_args+=("--filter=merge ${filter_file_all}")
+ fi
+
+ return $RET_SUCCESS
+}
+
+
+# Split host:target like rsync and convert local (!) relative paths to
+# absolute ones. This is needed at least for $src_path which is used as
+# key for associative arrays.
+#
+# The results are written to the global variables $<vtype>, $<vtype>_host
+# and $<vtype>_path, where <vtype> is either src or dest. $<vtype> gets
+# set to the original to be resolved string, unless we are local, i.e.
+# there is no host.
+#
+# Note: This is not a place for bash to shine. Perl for instance would do
+# this much more easily.
+#
+# Examples:
+# - a:b -> (a, b)
+# - a/b:c -> ('', a/b:c)
+#
+# $1: which global variables to set: (src|dest)
+# $2: path string potentially containing host prefix
+#
+# sets: ${$1}_host: host name (may be empty)
+# ${$1}_path: path (absolute, if local, i.e. ${$1}_host='')
+# ${$1}: ${$1}_path, if ${$1}_host='',
+# ${$1}_host:${$1}_path (= $2), elsewise.
+#
+function resolve_host_path
+{
+ local vtype="$1"
+ local combined="$2"
+ local host path
+
+ # Split host and path.
+ host=${combined%%:*}
+ if [[ "$host" == "$combined" || "$host" =~ '/' ]]
+ then
+ host=''
+ path="$combined"
+
+ # Resolve to absolute directory.
+ # pwd -P avoids symlinks.
+ # Do not resolve symlimks in ${path} or test for its existance.
+ # `- realpath could do that.
+ if ! [[ "$path" =~ / ]]
+ then
+ path="$(pwd -P)/${path}"
+ fi
+
+ combined="$path"
+ else
+ path="${combined#*:}"
+ fi
+
+ # Set global variables.
+ if [[ "$vtype" == 'src' ]]
+ then
+ src_host="$host"
+ src_path="$path"
+ src="$combined"
+ else # "$vtype" == 'dest'
+ dest_host="$host"
+ dest_path="$path"
+ dest="$combined"
+ fi
+
+ return $RET_SUCCESS
+}
+
+# vi: ft=bash ts=2 sw=2 noet