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 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100755 debvm-waitssh (limited to '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 + -- cgit v1.2.3 From 4e959cc83446ab426649425add520d3da58bfdd3 Mon Sep 17 00:00:00 2001 From: Helmut Grohne Date: Tue, 3 Jan 2023 13:08:57 +0100 Subject: debvm-waitssh: make timeout configurable and restore previous value for tests --- debvm-waitssh | 84 ++++++++++++++++++++++++++++++++++++++++++++----- tests/create-and-run.sh | 2 +- tests/dist-upgrades.sh | 4 +-- 3 files changed, 79 insertions(+), 11 deletions(-) (limited to 'debvm-waitssh') diff --git a/debvm-waitssh b/debvm-waitssh index 092b46f..843963d 100755 --- a/debvm-waitssh +++ b/debvm-waitssh @@ -9,13 +9,24 @@ debvm-waitssh - Wait for a ssh server to be reachable =head1 SYNOPSIS -B [I:]I +B [B<-t> I] [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 OPTIONS + +=over 8 + +=item B<-t> I, B<--timeout>=I + +Set the maximum duration for waiting in seconds. +Defaults to one minute. + +=back + =head1 EXIT VALUES =over 8 @@ -43,10 +54,70 @@ POD2MAN set -u -case "${1:-}" in +TOTALTIMEOUT=60 +SCANTIMEOUT=10 +SCANDELAY=1 + +nth_arg() { + shift "$1" + printf "%s" "$1" +} + +die() { + echo "$*" >&2 + exit 2 +} +usage() { + die "usage: $0 [-t ] [:]" +} +usage_error() { + echo "error: $*" >&2 + usage +} + +opt_timeout() { + TOTALTIMEOUT=$1 +} + +while getopts :t:-: OPTCHAR; do + case "$OPTCHAR" in + t) opt_timeout "$OPTARG" ;; + -) + case "$OPTARG" in + help) + usage + ;; + timeout) + test "$OPTIND" -gt "$#" && usage_error "missing argument for --$OPTARG" + "opt_$OPTARG" "$(nth_arg "$OPTIND" "$@")" + OPTIND=$((OPTIND+1)) + ;; + timeout=) + "opt_${OPTARG%%=*}" "${OPTARG#*=}" + ;; + *) + usage_error "unrecognized option --$OPTARG" + ;; + esac + ;; + :) + usage_error "missing argument for -$OPTARG" + ;; + '?') + usage_error "unrecognized option -$OPTARG" + ;; + *) + die "internal error while parsing command options, please report a bug" + ;; + esac +done +shift "$((OPTIND - 1))" + +test "$#" = 1 || usage + +case "$1" in "") - echo "usage: $0 " >&2 - exit 2 + usage ;; *:*) HOST=${1%:*} @@ -58,9 +129,6 @@ case "${1:-}" in ;; esac -TOTALTIMEOUT=60 -SCANTIMEOUT=10 -SCANDELAY=1 now=$(date +%s) deadline=$((now + TOTALTIMEOUT)) while test "$now" -lt "$deadline"; do @@ -68,7 +136,7 @@ while test "$now" -lt "$deadline"; do 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" + sleep "$SCANDELAY" now=$(date +%s) fi done diff --git a/tests/create-and-run.sh b/tests/create-and-run.sh index 4ec07eb..f978052 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 "$@" -debvm-waitssh "$SSH_PORT" +debvm-waitssh -t 150 "$SSH_PORT" run_ssh "$@" poweroff wait diff --git a/tests/dist-upgrades.sh b/tests/dist-upgrades.sh index 3bab4ab..177712b 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 "$@" - debvm-waitssh "$SSH_PORT" + debvm-waitssh -t 150 "$SSH_PORT" run_ssh "$@" "upgrade $RELEASE" wait done timeout 5m debvm-run -s "$SSH_PORT" & -debvm-waitssh "$SSH_PORT" +debvm-waitssh -t 150 "$SSH_PORT" run_ssh localhost poweroff wait -- cgit v1.2.3 From 354f9790fb3706a229b9eb4b1d02d578d4297bdc Mon Sep 17 00:00:00 2001 From: Helmut Grohne Date: Tue, 3 Jan 2023 16:56:38 +0100 Subject: debvm-waitssh: force ipv4 On salsa, localhost resolves to ::1 and ssh-keyscan skips checking 127.0.0.1 there. --- debvm-waitssh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'debvm-waitssh') diff --git a/debvm-waitssh b/debvm-waitssh index 843963d..557ffad 100755 --- a/debvm-waitssh +++ b/debvm-waitssh @@ -14,7 +14,7 @@ B [B<-t> I] [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. +If no hostname is given, B<127.0.0.1> is assumed. =head1 OPTIONS @@ -124,7 +124,7 @@ case "$1" in PORT=${1##*:} ;; *) - HOST=localhost + HOST=127.0.0.1 PORT=$1 ;; esac -- cgit v1.2.3 From 472bc82b69e2785f0fb715efbb796bdd9f5507c0 Mon Sep 17 00:00:00 2001 From: Helmut Grohne Date: Tue, 3 Jan 2023 16:58:30 +0100 Subject: debvm-waitssh: issue fewer test connections ssh-keyscan creates one connection per key type. --- debvm-waitssh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'debvm-waitssh') diff --git a/debvm-waitssh b/debvm-waitssh index 557ffad..4d69657 100755 --- a/debvm-waitssh +++ b/debvm-waitssh @@ -133,7 +133,7 @@ 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 + ssh-keyscan -t rsa -T "$SCANTIMEOUT" -p "$PORT" "$HOST" >/dev/null 2>&1 && exit 0 now=$(date +%s) if test "$((now - start))" -lt "$SCANTIMEOUT"; then sleep "$SCANDELAY" -- cgit v1.2.3