summaryrefslogtreecommitdiff
path: root/debvm-waitssh
blob: 092b46f8c2671f023bb1d6c6cd608cbdca13348a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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