| #! /bin/bash |
| # Run a testcase on a remote system, via ssh. |
| # Copyright (C) 2012-2014 Free Software Foundation, Inc. |
| # This file is part of the GNU C Library. |
| |
| # The GNU C Library is free software; you can redistribute it and/or |
| # modify it under the terms of the GNU Lesser General Public |
| # License as published by the Free Software Foundation; either |
| # version 2.1 of the License, or (at your option) any later version. |
| |
| # The GNU C Library 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 |
| # Lesser General Public License for more details. |
| |
| # You should have received a copy of the GNU Lesser General Public |
| # License along with the GNU C Library; if not, see |
| # <http://www.gnu.org/licenses/>. |
| |
| # usage: cross-test-ssh.sh [--ssh SSH] HOST COMMAND ... |
| # Run with --help flag to get more detailed help. |
| |
| progname="$(basename $0)" |
| env_blacklist='HOME LOGNAME MAIL PATH SHELL SHLVL SSH_CLIENT SSH_CONNECTION |
| USER TERM TERMCAP PWD' |
| |
| usage="usage: ${progname} [--ssh SSH] HOST COMMAND ..." |
| help="Run a glibc test COMMAND on the remote machine HOST, via ssh, |
| passing environment variables, preserving the current working directory, |
| and respecting quoting. |
| |
| If the '--ssh SSH' flag is present, use SSH as the SSH command, |
| instead of ordinary 'ssh'. |
| |
| To use this to run glibc tests, invoke the tests as follows: |
| |
| $ make test-wrapper='ABSPATH/cross-test-ssh.sh HOST' tests |
| |
| where ABSPATH is the absolute path to this script, and HOST is the |
| name of the machine to connect to via ssh. |
| |
| If you need to connect to the test machine as a different user, you |
| may specify that just as you would to SSH: |
| |
| $ make test-wrapper='ABSPATH/cross-test-ssh.sh USER@HOST' tests |
| |
| Naturally, the remote user must have an appropriate public key, and |
| you will want to ensure that SSH does not prompt interactively for a |
| password on each connection. |
| |
| HOST and the build machines (on which 'make check' is being run) must |
| share a filesystem; all files needed by the tests must be visible at |
| the same paths on both machines. |
| |
| ${progname} runs COMMAND in the same directory on the HOST that |
| ${progname} itself is run in on the build machine. |
| |
| The command and arguments are passed to the remote host in a way that |
| avoids any further shell substitution or expansion, on the assumption |
| that the shell on the build machine has already done them |
| appropriately. |
| |
| ${progname} propagates the values all environment variables through to |
| the remote target, except the following: |
| ${env_blacklist}" |
| |
| ssh='ssh' |
| while [ $# -gt 0 ]; do |
| case "$1" in |
| |
| "--ssh") |
| shift |
| if [ $# -lt 1 ]; then |
| break |
| fi |
| ssh="$1" |
| ;; |
| |
| "--help") |
| echo "$usage" |
| echo "$help" |
| exit 0 |
| ;; |
| |
| *) |
| break |
| ;; |
| esac |
| shift |
| done |
| |
| if [ $# -lt 1 ]; then |
| echo "$usage" >&2 |
| echo "Type '${progname} --help' for more detailed help." >&2 |
| exit 1 |
| fi |
| |
| host="$1"; shift |
| |
| # Print the sequence of arguments as strings properly quoted for the |
| # Bourne shell, separated by spaces. |
| bourne_quote () |
| { |
| local arg qarg |
| for arg in "$@"; do |
| qarg=${arg//\'/\'\\\'\'} |
| echo -n "'$qarg' " |
| done |
| } |
| |
| # Unset all variables from the blacklist. Then echo all exported |
| # variables. |
| blacklist_exports () |
| { |
| (unset ${env_blacklist}; export -p) | sed 's/^declare -x/export/' |
| } |
| |
| # Produce commands to carry over the current environment, less blacklisted |
| # variables. |
| exports="$(blacklist_exports)" |
| |
| # Transform the current argument list into a properly quoted Bourne shell |
| # command string. |
| command="$(bourne_quote "$@")" |
| |
| # Add commands to set environment variables and the current directory. |
| command="${exports} |
| cd $(bourne_quote "$PWD") |
| ${command}" |
| |
| # HOST's sshd simply concatenates its arguments with spaces and |
| # passes them to some shell. We want to force the use of /bin/sh, |
| # so we need to re-quote the whole command to ensure it appears as |
| # the sole argument of the '-c' option. |
| full_command="$(bourne_quote "${command}")" |
| $ssh "$host" /bin/sh -c "$full_command" |