DPS_Manage/libssh2/tests/test_sshd.test

170 lines
4.0 KiB
Bash

#!/usr/bin/env bash
# Copyright (C) Simon Josefsson
# Copyright (C) Viktor Szakats
# SPDX-License-Identifier: BSD-3-Clause
#
# Start sshd, invoke test(s), saving exit code, kill sshd, and
# return exit code.
set -e
set -u
# https://testanything.org/tap-specification.html
d="$(dirname "$0")"
uname="$(uname)"
# Load list of tests
if [ -n "${1:-}" ]; then
# for CMake or manual
tests="$*"
via_args=1
else
# for autotools
via_args=0
# Load list of SSHD tests from Makefile.inc
tests=''
load=0
while read -r l; do
if [[ "${l}" = 'SSHD_TESTS ='* ]]; then
load=1
elif [ "${load}" = '1' ]; then
[[ "${l}" =~ [a-z0-9_]+ ]] && tests+="${tests:+ }./${BASH_REMATCH[0]}${EXEEXT:-}"
[[ ! "${l}" = *"\\" ]] && break
fi
done <<< "$(tr -d $"\r" < "${d}/Makefile.inc")"
fi
if [ -n "${SSHD_TESTS_LIMIT_TO:-}" ]; then
tests="$(echo "${tests}" | cut -d ' ' -f -"${SSHD_TESTS_LIMIT_TO}")"
echo "# limiting tests to the first ${SSHD_TESTS_LIMIT_TO}."
fi
# Init and start sshd
d="$(cd "${d}" || exit; pwd)" # sshd needs absolute paths
SSHD="${SSHD:-/usr/sbin/sshd}"
[[ "${uname}" = *'_NT'* ]] && SSHD="$(cygpath "${SSHD}")"
ver="$("${SSHD}" -V 2>&1 || true)"
if [[ "${ver}" =~ OpenSSH_[a-zA-Z0-9_\ .,]+ ]]; then
ver="${BASH_REMATCH[0]}"
else
ver=''
fi
echo "# sshd executable: '${SSHD}' (${ver})"
# for our test clients:
[ -z "${PRIVKEY:-}" ] && export PRIVKEY="${d}/key_rsa"
[ -z "${PUBKEY:-}" ] && export PUBKEY="${d}/key_rsa.pub"
cakeys="${d}/openssh_server/ca_user_keys.pub"
logfsrv="$(mktemp)"; readonly logfsrv
logfcli="$(mktemp)"; readonly logfcli
echo "# sshd log: '${logfsrv}'"
SSHD_FLAGS="${SSHD_FLAGS:-}"
if [ -n "${DEBUG:-}" ]; then
SSHD_FLAGS+=' -d -d'
else
SSHD_FLAGS+=" -E ${logfsrv}"
fi
chmod go-rwx \
"${d}"/openssh_server/ssh_host_* \
"${cakeys}"
# shellcheck disable=SC2086
"${SSHD}" \
-f "${SSHD_FIXTURE_CONFIG:-${d}/openssh_server/sshd_config}" \
-o 'Port 4711' \
-o 'StrictModes no' \
-h "${d}/openssh_server/ssh_host_rsa_key" \
-h "${d}/openssh_server/ssh_host_ecdsa_key" \
-h "${d}/openssh_server/ssh_host_ed25519_key" \
-o 'PidFile sshd.pid' \
-o "AuthorizedKeysFile ${PUBKEY} ${d}/openssh_server/authorized_keys" \
-o "TrustedUserCAKeys ${cakeys}" \
-o 'PermitRootLogin yes' \
-D \
${SSHD_FLAGS} &
sshdpid=$!
trap 'kill "${sshdpid}"; echo "# signal killing sshd"; exit 1;' EXIT HUP INT TERM
: "started sshd (${sshdpid})"
SSH="$(command -v "${SSH:-ssh}" || true)"
if [ -n "${SSH}" ]; then
echo "# ssh executable: '${SSH}' ($("${SSH}" -V 2>&1 || true))"
echo "# ssh log: '${logfcli}'"
chmod go-rwx "${PRIVKEY}"
if [[ "${uname}" = *'_NT'* ]]; then
export MSYS2_ARG_CONV_EXCL='/reset'
icacls "${PRIVKEY}" /reset
icacls "${PRIVKEY}" /grant:r "${USERNAME}:(R)"
icacls "${PRIVKEY}" /inheritance:r
fi
count=1
# shellcheck disable=SC2086
while ! "${SSH:-ssh}" -q -a -k \
-F /dev/null \
-o 'BatchMode yes' \
-o 'StrictHostKeyChecking no' \
-o 'UserKnownHostsFile /dev/null' \
-o 'ConnectTimeout 3' \
-i "${PRIVKEY}" \
-p 4711 ${SSH_FLAGS:-} localhost exit 2>>"${logfcli}"; do
((count++))
if [[ "${count}" -gt 8 ]]; then
echo '# giving up waiting for sshd. Tests are expected to fail.'
echo '# sshd log:'
sed 's/^/# /' < "${logfsrv}"
echo '# ssh test connect log:'
sed 's/^/# /' < "${logfcli}"
break
fi
echo '# waiting for sshd...'
sleep 1
done
else
echo '# giving time for sshd to launch...'
sleep 5
fi
# Run tests
ec=0
count=1
total="$(echo "${tests}" | wc -w | tr -d ' ')"
anyerror=0
echo "${count}..${total}"
export OPENSSH_NO_DOCKER=1
for test in ${tests}; do
if "${test}"; then
res='ok'
else
testerr=$?
anyerror=1
[ "${via_args}" = '1' ] && [ "${total}" = '1' ] && ec="${testerr}"
res='not ok'
fi
echo "${res} ${count} - sshd-$(basename "${test}")"
((count++))
done
# Stop sshd
: "killing sshd (${sshdpid})"
kill "${sshdpid}" > /dev/null 2>&1
trap '' EXIT HUP INT TERM
[ "${via_args}" = '1' ] && [ "${total}" != '1' ] && ec="${anyerror}"
exit "${ec}"