1
+ #! /usr/bin/env bash
2
+ # Use this script to test if a given TCP host/port are available
3
+
4
+ # #####################################################
5
+ # Copied from https://github.com/vishnubob/wait-for-it
6
+ # #####################################################
7
+
8
+ WAITFORIT_cmdname=${0##*/ }
9
+
10
+ echoerr () { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo " $@ " 1>&2 ; fi }
11
+
12
+ usage ()
13
+ {
14
+ cat << USAGE >&2
15
+ Usage:
16
+ $WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args]
17
+ -h HOST | --host=HOST Host or IP under test
18
+ -p PORT | --port=PORT TCP port under test
19
+ Alternatively, you specify the host and port as host:port
20
+ -s | --strict Only execute subcommand if the test succeeds
21
+ -q | --quiet Don't output any status messages
22
+ -t TIMEOUT | --timeout=TIMEOUT
23
+ Timeout in seconds, zero for no timeout
24
+ -- COMMAND ARGS Execute command with args after the test finishes
25
+ USAGE
26
+ exit 1
27
+ }
28
+
29
+ wait_for ()
30
+ {
31
+ if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
32
+ echoerr " $WAITFORIT_cmdname : waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST :$WAITFORIT_PORT "
33
+ else
34
+ echoerr " $WAITFORIT_cmdname : waiting for $WAITFORIT_HOST :$WAITFORIT_PORT without a timeout"
35
+ fi
36
+ WAITFORIT_start_ts=$( date +%s)
37
+ while :
38
+ do
39
+ if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then
40
+ nc -z $WAITFORIT_HOST $WAITFORIT_PORT
41
+ WAITFORIT_result=$?
42
+ else
43
+ (echo -n > /dev/tcp/$WAITFORIT_HOST /$WAITFORIT_PORT ) > /dev/null 2>&1
44
+ WAITFORIT_result=$?
45
+ fi
46
+ if [[ $WAITFORIT_result -eq 0 ]]; then
47
+ WAITFORIT_end_ts=$( date +%s)
48
+ echoerr " $WAITFORIT_cmdname : $WAITFORIT_HOST :$WAITFORIT_PORT is available after $(( WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds"
49
+ break
50
+ fi
51
+ sleep 1
52
+ done
53
+ return $WAITFORIT_result
54
+ }
55
+
56
+ wait_for_wrapper ()
57
+ {
58
+ # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
59
+ if [[ $WAITFORIT_QUIET -eq 1 ]]; then
60
+ timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
61
+ else
62
+ timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
63
+ fi
64
+ WAITFORIT_PID=$!
65
+ trap " kill -INT -$WAITFORIT_PID " INT
66
+ wait $WAITFORIT_PID
67
+ WAITFORIT_RESULT=$?
68
+ if [[ $WAITFORIT_RESULT -ne 0 ]]; then
69
+ echoerr " $WAITFORIT_cmdname : timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST :$WAITFORIT_PORT "
70
+ fi
71
+ return $WAITFORIT_RESULT
72
+ }
73
+
74
+ # process arguments
75
+ while [[ $# -gt 0 ]]
76
+ do
77
+ case " $1 " in
78
+ * :* )
79
+ WAITFORIT_hostport=(${1//:/ } )
80
+ WAITFORIT_HOST=${WAITFORIT_hostport[0]}
81
+ WAITFORIT_PORT=${WAITFORIT_hostport[1]}
82
+ shift 1
83
+ ;;
84
+ --child)
85
+ WAITFORIT_CHILD=1
86
+ shift 1
87
+ ;;
88
+ -q | --quiet)
89
+ WAITFORIT_QUIET=1
90
+ shift 1
91
+ ;;
92
+ -s | --strict)
93
+ WAITFORIT_STRICT=1
94
+ shift 1
95
+ ;;
96
+ -h)
97
+ WAITFORIT_HOST=" $2 "
98
+ if [[ $WAITFORIT_HOST == " " ]]; then break ; fi
99
+ shift 2
100
+ ;;
101
+ --host=* )
102
+ WAITFORIT_HOST=" ${1#* =} "
103
+ shift 1
104
+ ;;
105
+ -p)
106
+ WAITFORIT_PORT=" $2 "
107
+ if [[ $WAITFORIT_PORT == " " ]]; then break ; fi
108
+ shift 2
109
+ ;;
110
+ --port=* )
111
+ WAITFORIT_PORT=" ${1#* =} "
112
+ shift 1
113
+ ;;
114
+ -t)
115
+ WAITFORIT_TIMEOUT=" $2 "
116
+ if [[ $WAITFORIT_TIMEOUT == " " ]]; then break ; fi
117
+ shift 2
118
+ ;;
119
+ --timeout=* )
120
+ WAITFORIT_TIMEOUT=" ${1#* =} "
121
+ shift 1
122
+ ;;
123
+ --)
124
+ shift
125
+ WAITFORIT_CLI=(" $@ " )
126
+ break
127
+ ;;
128
+ --help)
129
+ usage
130
+ ;;
131
+ * )
132
+ echoerr " Unknown argument: $1 "
133
+ usage
134
+ ;;
135
+ esac
136
+ done
137
+
138
+ if [[ " $WAITFORIT_HOST " == " " || " $WAITFORIT_PORT " == " " ]]; then
139
+ echoerr " Error: you need to provide a host and port to test."
140
+ usage
141
+ fi
142
+
143
+ WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:- 45}
144
+ WAITFORIT_STRICT=${WAITFORIT_STRICT:- 0}
145
+ WAITFORIT_CHILD=${WAITFORIT_CHILD:- 0}
146
+ WAITFORIT_QUIET=${WAITFORIT_QUIET:- 0}
147
+
148
+ # Check to see if timeout is from busybox?
149
+ WAITFORIT_TIMEOUT_PATH=$( type -p timeout)
150
+ WAITFORIT_TIMEOUT_PATH=$( realpath $WAITFORIT_TIMEOUT_PATH 2> /dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH )
151
+
152
+ WAITFORIT_BUSYTIMEFLAG=" "
153
+ if [[ $WAITFORIT_TIMEOUT_PATH =~ " busybox" ]]; then
154
+ WAITFORIT_ISBUSY=1
155
+ # Check if busybox timeout uses -t flag
156
+ # (recent Alpine versions don't support -t anymore)
157
+ if timeout & > /dev/stdout | grep -q -e ' -t ' ; then
158
+ WAITFORIT_BUSYTIMEFLAG=" -t"
159
+ fi
160
+ else
161
+ WAITFORIT_ISBUSY=0
162
+ fi
163
+
164
+ if [[ $WAITFORIT_CHILD -gt 0 ]]; then
165
+ wait_for
166
+ WAITFORIT_RESULT=$?
167
+ exit $WAITFORIT_RESULT
168
+ else
169
+ if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
170
+ wait_for_wrapper
171
+ WAITFORIT_RESULT=$?
172
+ else
173
+ wait_for
174
+ WAITFORIT_RESULT=$?
175
+ fi
176
+ fi
177
+
178
+ if [[ $WAITFORIT_CLI != " " ]]; then
179
+ if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then
180
+ echoerr " $WAITFORIT_cmdname : strict mode, refusing to execute subprocess"
181
+ exit $WAITFORIT_RESULT
182
+ fi
183
+ exec " ${WAITFORIT_CLI[@]} "
184
+ else
185
+ exit $WAITFORIT_RESULT
186
+ fi
0 commit comments