summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHelmut Grohne <helmut@subdivi.de>2023-01-03 12:04:00 +0100
committerHelmut Grohne <helmut@subdivi.de>2023-01-03 12:11:25 +0100
commit130f3bbf71a9ce28925dd27c05b6887870fb3a0f (patch)
tree474d67664956f79e3f72ec1b57bd0b898ca457b8
parent84cc5e4258ce543e72d082565e167cf71a25f5cc (diff)
downloaddebvm-130f3bbf71a9ce28925dd27c05b6887870fb3a0f.tar.gz
add a debvm-waitssh utility
-rwxr-xr-xdebvm-waitssh76
-rwxr-xr-xtests/create-and-run.sh2
-rwxr-xr-xtests/dist-upgrades.sh4
-rw-r--r--tests/test_common.sh11
4 files changed, 79 insertions, 14 deletions
diff --git a/debvm-waitssh b/debvm-waitssh
new file mode 100755
index 0000000..092b46f
--- /dev/null
+++ b/debvm-waitssh
@@ -0,0 +1,76 @@
+#!/bin/sh
+# Copyright 2023 Helmut Grohne <helmut@subdivi.de>
+# SPDX-License-Identifier: MIT
+
+: <<'POD2MAN'
+=head1 NAME
+
+debvm-waitssh - Wait for a ssh server to be reachable
+
+=head1 SYNOPSIS
+
+B<debvm-waitssh> [I<hostname>:]I<port>
+
+=head1 DESCRIPTION
+
+B<debvm-waitssh> can be used to wait for a virtual machine with exposed ssh port to be reachable on that port.
+If no hostname is given, B<localhost> is assumed.
+
+=head1 EXIT VALUES
+
+=over 8
+
+=item B<0>
+
+The server is reachable.
+
+=item B<1>
+
+A timeout was reached before the server answered.
+
+=item B<2>
+
+Usage error.
+
+=back
+
+=head1 SEE ALSO
+
+ debvm-run(1)
+
+=cut
+POD2MAN
+
+set -u
+
+case "${1:-}" in
+ "")
+ echo "usage: $0 <port>" >&2
+ exit 2
+ ;;
+ *:*)
+ HOST=${1%:*}
+ PORT=${1##*:}
+ ;;
+ *)
+ HOST=localhost
+ PORT=$1
+ ;;
+esac
+
+TOTALTIMEOUT=60
+SCANTIMEOUT=10
+SCANDELAY=1
+now=$(date +%s)
+deadline=$((now + TOTALTIMEOUT))
+while test "$now" -lt "$deadline"; do
+ start=$now
+ ssh-keyscan -T "$SCANTIMEOUT" -p "$PORT" "$HOST" >/dev/null 2>&1 && exit 0
+ now=$(date +%s)
+ if test "$((now - start))" -lt "$SCANTIMEOUT"; then
+ sleep "$SCANDELAY"
+ now=$(date +%s)
+ fi
+done
+exit 1
+
diff --git a/tests/create-and-run.sh b/tests/create-and-run.sh
index 540e6c4..4ec07eb 100755
--- a/tests/create-and-run.sh
+++ b/tests/create-and-run.sh
@@ -26,6 +26,6 @@ SSH_PORT=2222
timeout 240s debvm-run -s "$SSH_PORT" -i "$IMAGE" &
set -- localhost
test "$RELEASE" = jessie && set -- -o PubkeyAcceptedKeyTypes=+ssh-rsa "$@"
-wait_ssh "$@"
+debvm-waitssh "$SSH_PORT"
run_ssh "$@" poweroff
wait
diff --git a/tests/dist-upgrades.sh b/tests/dist-upgrades.sh
index 85c9f4a..3bab4ab 100755
--- a/tests/dist-upgrades.sh
+++ b/tests/dist-upgrades.sh
@@ -44,12 +44,12 @@ for RELEASE in stretch buster bullseye bookworm sid; do
timeout 15m debvm-run -s "$SSH_PORT" &
set -- localhost
test "$RELEASE" = stretch && set -- -o PubkeyAcceptedKeyTypes=+ssh-rsa "$@"
- wait_ssh "$@"
+ debvm-waitssh "$SSH_PORT"
run_ssh "$@" "upgrade $RELEASE"
wait
done
timeout 5m debvm-run -s "$SSH_PORT" &
-wait_ssh localhost
+debvm-waitssh "$SSH_PORT"
run_ssh localhost poweroff
wait
diff --git a/tests/test_common.sh b/tests/test_common.sh
index f42a26a..cba9693 100644
--- a/tests/test_common.sh
+++ b/tests/test_common.sh
@@ -5,14 +5,3 @@ run_ssh() {
test -n "${SSH_PORT:-}" && set -- -p "$SSH_PORT" "$@"
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -l root "$@"
}
-
-wait_ssh() {
- wait_ssh_timeout=5
- wait_ssh_ts=$(sleepenh 0 || [ $? -eq 1 ])
- for _ in $(seq 30); do
- run_ssh -o ConnectTimeout="$wait_ssh_timeout" "$@" echo success && return 0
- wait_ssh_ts=$(sleepenh "$wait_ssh_ts" "$wait_ssh_timeout" || [ $? -eq 1 ])
- done
- echo "timeout reached" >&2
- return 1
-}