#!/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 . # # 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