aboutsummaryrefslogtreecommitdiff
path: root/remote
blob: 1b04197ff43a68bd4e0626fc4253ef6a4e3c1dee (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
#!/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