summaryrefslogtreecommitdiff
path: root/debvm-waitssh
diff options
context:
space:
mode:
Diffstat (limited to 'debvm-waitssh')
-rwxr-xr-xdebvm-waitssh76
1 files changed, 76 insertions, 0 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
+