diff options
Diffstat (limited to 'remote')
-rw-r--r-- | remote | 92 |
1 files changed, 92 insertions, 0 deletions
@@ -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 |