2022-09-12 10:56:15 +00:00
|
|
|
#! /bin/sh
|
|
|
|
#
|
passt: Relicense to GPL 2.0, or any later version
In practical terms, passt doesn't benefit from the additional
protection offered by the AGPL over the GPL, because it's not
suitable to be executed over a computer network.
Further, restricting the distribution under the version 3 of the GPL
wouldn't provide any practical advantage either, as long as the passt
codebase is concerned, and might cause unnecessary compatibility
dilemmas.
Change licensing terms to the GNU General Public License Version 2,
or any later version, with written permission from all current and
past contributors, namely: myself, David Gibson, Laine Stump, Andrea
Bolognani, Paul Holzinger, Richard W.M. Jones, Chris Kuhn, Florian
Weimer, Giuseppe Scrivano, Stefan Hajnoczi, and Vasiliy Ulyanov.
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
2023-04-05 18:11:44 +00:00
|
|
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
2022-09-12 10:56:15 +00:00
|
|
|
#
|
|
|
|
# PASST - Plug A Simple Socket Transport
|
|
|
|
# for qemu/UNIX domain socket mode
|
|
|
|
#
|
|
|
|
# PASTA - Pack A Subtle Tap Abstraction
|
|
|
|
# for network namespace/tap device mode
|
|
|
|
#
|
|
|
|
# test/lib/context - Run commands in different contexts (host, guest, namespace etc.)
|
|
|
|
#
|
|
|
|
# Copyright Red Hat
|
|
|
|
# Author: David Gibson <david@gibson.dropbear.id.au>
|
|
|
|
|
2023-04-06 03:28:17 +00:00
|
|
|
NSTOOL="${BASEPATH}/nstool"
|
|
|
|
|
2022-09-12 10:56:21 +00:00
|
|
|
# context_setup_common() - Create outline of a new context
|
|
|
|
# $1: Context name
|
|
|
|
context_setup_common() {
|
|
|
|
__name="$1"
|
2022-09-13 04:35:21 +00:00
|
|
|
__log="${LOGDIR}/context_${__name}.log"
|
|
|
|
echo -n "${__name}$ " > "${__log}"
|
2022-09-12 10:56:21 +00:00
|
|
|
}
|
|
|
|
|
2022-09-12 10:56:15 +00:00
|
|
|
# context_setup_host() - Create a new context for running commands on the host
|
|
|
|
# $1: Context name
|
|
|
|
context_setup_host() {
|
|
|
|
__name="$1"
|
2022-09-13 04:35:21 +00:00
|
|
|
__enter="${STATESETUP}/context_${__name}.enter"
|
2022-09-12 10:56:21 +00:00
|
|
|
context_setup_common "${__name}"
|
2022-09-13 04:35:21 +00:00
|
|
|
echo sh -c > "${__enter}"
|
2022-09-12 10:56:21 +00:00
|
|
|
}
|
|
|
|
|
2023-04-06 03:28:17 +00:00
|
|
|
# context_setup_nstool() - Create a new context for running commands with nstool exec
|
2022-09-12 10:56:21 +00:00
|
|
|
# $1: Context name
|
2023-04-06 03:28:17 +00:00
|
|
|
# $2: nstool control socket
|
|
|
|
context_setup_nstool() {
|
2022-09-12 10:56:21 +00:00
|
|
|
__name="$1"
|
2023-04-06 03:28:17 +00:00
|
|
|
__sock="$2"
|
2022-09-13 04:35:21 +00:00
|
|
|
__enter="${STATESETUP}/context_${__name}.enter"
|
2023-04-06 03:28:17 +00:00
|
|
|
# Wait for the ns to be ready
|
|
|
|
${NSTOOL} info -w "${__sock}" > /dev/null
|
2022-09-12 10:56:21 +00:00
|
|
|
context_setup_common "${__name}"
|
2023-04-06 03:28:17 +00:00
|
|
|
echo "${NSTOOL} exec ${__sock} -- sh -c" > "${__enter}"
|
2022-09-12 10:56:15 +00:00
|
|
|
}
|
|
|
|
|
2022-09-12 10:56:22 +00:00
|
|
|
# context_setup_guest() - Create a new context for running commands in a guest
|
|
|
|
# $1: Context name
|
|
|
|
# $2: CID to use for vsock
|
|
|
|
context_setup_guest() {
|
|
|
|
__name="$1"
|
|
|
|
__cid="$2"
|
2022-09-13 04:35:21 +00:00
|
|
|
__enter="${STATESETUP}/context_${__name}.enter"
|
|
|
|
__ssh="${STATESETUP}/context_${__name}.ssh"
|
2022-09-12 10:56:22 +00:00
|
|
|
context_setup_common "${__name}"
|
|
|
|
|
2022-09-13 04:35:21 +00:00
|
|
|
cat > "${__ssh}" <<EOF
|
2022-09-12 10:56:22 +00:00
|
|
|
Host ${__name}
|
|
|
|
User root
|
2022-09-13 04:35:21 +00:00
|
|
|
UserKnownHostsFile ${STATESETUP}/context_${__name}.hosts
|
2022-09-12 10:56:22 +00:00
|
|
|
StrictHostKeyChecking no
|
|
|
|
IdentityFile ${BASEPATH}/guest-key
|
|
|
|
IdentityAgent none
|
|
|
|
ProxyCommand socat - VSOCK-CONNECT:${__cid}:22
|
|
|
|
EOF
|
2022-09-13 04:35:21 +00:00
|
|
|
echo "ssh -F ${__ssh} ${__name}" > "${__enter}"
|
2022-09-12 10:56:22 +00:00
|
|
|
|
|
|
|
# Wait for the guest to be booted and accepting connections
|
2022-09-26 10:43:36 +00:00
|
|
|
wait_for ssh -F "${__ssh}" "${__name}" :
|
2022-09-12 10:56:22 +00:00
|
|
|
}
|
|
|
|
|
2022-09-12 10:56:15 +00:00
|
|
|
# context_teardown() - Remove a context (leave log files intact)
|
|
|
|
# $1: Context name
|
|
|
|
context_teardown() {
|
|
|
|
__name="$1"
|
2022-09-13 04:35:21 +00:00
|
|
|
__prefix="${STATESETUP}/context_${__name}"
|
2022-09-12 10:56:22 +00:00
|
|
|
rm -f "${__prefix}.enter" "${__prefix}.ssh" "${__prefix}.hosts"
|
2022-09-12 10:56:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# context_exists() - Test if a context currently exists
|
|
|
|
# $1: Context name
|
|
|
|
context_exists() {
|
|
|
|
__name="$1"
|
2022-09-13 04:35:21 +00:00
|
|
|
__enter="${STATESETUP}/context_${__name}.enter"
|
|
|
|
[ -f "${__enter}" ]
|
2022-09-12 10:56:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# context_run() - Run a shell command in a context, and wait for it to finish
|
|
|
|
# $1: Context name
|
|
|
|
# $*: Command to start
|
|
|
|
context_run() {
|
|
|
|
__name="$1"
|
2022-09-13 04:35:21 +00:00
|
|
|
__log="${LOGDIR}/context_${__name}.log"
|
|
|
|
__enter="${STATESETUP}/context_${__name}.enter"
|
2023-04-05 01:56:42 +00:00
|
|
|
__stdout="$(mktemp -u "${STATESETUP}/context_${__name}.stdout.XXXXXXXX")"
|
|
|
|
__stderr="$(mktemp -u "${STATESETUP}/context_${__name}.stderr.XXXXXXXX")"
|
2022-09-12 10:56:15 +00:00
|
|
|
shift
|
2022-09-13 04:35:21 +00:00
|
|
|
echo "$*" >> "${__log}"
|
|
|
|
mkfifo "${__stdout}" "${__stderr}"
|
|
|
|
tee -a "${__log}" < "${__stdout}" &
|
|
|
|
tee -a "${__log}" < "${__stderr}" >&2 &
|
|
|
|
$(cat ${__enter}) "$*" >> "${__stdout}" 2>> "${__stderr}"
|
2022-09-12 10:56:15 +00:00
|
|
|
rc=$?
|
2022-09-13 04:35:21 +00:00
|
|
|
rm "${__stdout}" "${__stderr}"
|
|
|
|
[ ${DEBUG} -eq 1 ] && echo "[Exit code: $rc]" >> "${__log}"
|
|
|
|
echo -n "${__name}$ " >> "${__log}"
|
2022-09-12 10:56:15 +00:00
|
|
|
return $rc
|
|
|
|
}
|
|
|
|
|
|
|
|
# context_run_bg() - Start a shell command in a context
|
|
|
|
# $1: Context name
|
|
|
|
# $*: Command to start
|
|
|
|
context_run_bg() {
|
|
|
|
__name="$1"
|
2022-09-13 04:35:21 +00:00
|
|
|
__pidfile="${STATESETUP}/context_${__name}.pid"
|
2022-09-12 10:56:15 +00:00
|
|
|
context_run "$@" &
|
2022-09-13 04:35:21 +00:00
|
|
|
echo $! > "${__pidfile}"
|
2022-09-12 10:56:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# context_wait() - Wait for background command in a context to complete
|
|
|
|
# $1: Context name
|
|
|
|
# Returns the status of the completed command
|
|
|
|
context_wait() {
|
|
|
|
__name="$1"
|
2022-09-13 04:35:21 +00:00
|
|
|
__pidfile="${STATESETUP}/context_${__name}.pid"
|
|
|
|
__pid=$(cat "${__pidfile}")
|
|
|
|
rm "${__pidfile}"
|
2022-09-12 10:56:15 +00:00
|
|
|
wait ${__pid}
|
|
|
|
}
|