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