From 130f3bbf71a9ce28925dd27c05b6887870fb3a0f Mon Sep 17 00:00:00 2001 From: Helmut Grohne Date: Tue, 3 Jan 2023 12:04:00 +0100 Subject: add a debvm-waitssh utility --- debvm-waitssh | 76 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/create-and-run.sh | 2 +- tests/dist-upgrades.sh | 4 +-- tests/test_common.sh | 11 ------- 4 files changed, 79 insertions(+), 14 deletions(-) create mode 100755 debvm-waitssh 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 +# SPDX-License-Identifier: MIT + +: <<'POD2MAN' +=head1 NAME + +debvm-waitssh - Wait for a ssh server to be reachable + +=head1 SYNOPSIS + +B [I:]I + +=head1 DESCRIPTION + +B 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 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 " >&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 -} -- cgit v1.2.3