aboutsummaryrefslogtreecommitdiff
path: root/remote
diff options
context:
space:
mode:
Diffstat (limited to 'remote')
-rw-r--r--remote92
1 files changed, 92 insertions, 0 deletions
diff --git a/remote b/remote
new file mode 100644
index 0000000..1b04197
--- /dev/null
+++ b/remote
@@ -0,0 +1,92 @@
+#!/usr/bin/env bash
+#
+# remote - execute functions remotely.
+#
+# 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/>.
+#
+
+
+# Run command remotely.
+#
+# $1: host: name
+# ${@:2}: command with arguments: string+
+#
+function run_command
+{
+ local host="$1"
+ shift
+
+ if [[ -z "$host" ]]
+ then
+ "$@"
+ else
+ # Use ssh to run command remotely.
+ # Make sure to properly escape the strings.
+ ssh "$host" "shopt -s ${SHOPTS}; $(printf "'%s' " "$@")"
+ fi
+
+ return $?
+}
+
+
+# Run a function on a remote host.
+# If the host parameter is empty, run locally.
+#
+# $1: host: name
+# $2: function to run: name
+# $3: other functions to export: [name (. ' ' . name)*]
+# $4: variables to export: [name (. '[@]')? (. ' ' . name (. '[@]')?)*]
+# ${@:5}: function arguments: string+
+#
+function run_function
+{
+ local host="$1"
+ local fun=$2
+ local funs="$fun $3 $REMOTE_DEFAULT_FUNS"
+ local vars="$4 $REMOTE_DEFAULT_VARS"
+ local vars_set
+
+ shift 4
+
+ if [[ -z "$host" ]]
+ then
+ $fun "$@"
+ else
+ # Create string to export variables.
+ vars_set=
+
+ # Avoid surprises of Bash's globbing (due to brackets in, e.g., a[@]).
+ set -o noglob
+
+ for var in $vars
+ do
+ vars_set+="$(eval echo "\${${var}@A}"); "
+ done
+
+ set +o noglob
+
+ # Use ssh to run command remotely.
+ # Make sure to properly escape the strings.
+ ssh "$host" "shopt -s ${SHOPTS}; ${vars_set} $(typeset -f $funs);" \
+ "$fun $(printf "'%s' " "$@")"
+ fi
+
+ return $?
+}
+
+# vi: ft=bash ts=2 sw=2 noet