|  | #!/usr/bin/env bash | 
|  | # https://github.com/vishnubob/wait-for-it/blob/master/wait-for-it.sh | 
|  | #   Use this script to test if a given TCP host/port are available | 
|  |  | 
|  | cmdname=$(basename $0) | 
|  |  | 
|  | echoerr() { if [[ $QUIET -ne 1 ]]; then echo "$@" 1>&2; fi } | 
|  |  | 
|  | usage() | 
|  | { | 
|  | cat << USAGE >&2 | 
|  | Usage: | 
|  | $cmdname host:port [-s] [-t timeout] [-- command args] | 
|  | -h HOST | --host=HOST       Host or IP under test | 
|  | -p PORT | --port=PORT       TCP port under test | 
|  | Alternatively, you specify the host and port as host:port | 
|  | -s | --strict               Only execute subcommand if the test succeeds | 
|  | -q | --quiet                Don't output any status messages | 
|  | -t TIMEOUT | --timeout=TIMEOUT | 
|  | Timeout in seconds, zero for no timeout | 
|  | -- COMMAND ARGS             Execute command with args after the test finishes | 
|  | USAGE | 
|  | exit 1 | 
|  | } | 
|  |  | 
|  | wait_for() | 
|  | { | 
|  | if [[ $TIMEOUT -gt 0 ]]; then | 
|  | echoerr "$cmdname: waiting $TIMEOUT seconds for $HOST:$PORT" | 
|  | else | 
|  | echoerr "$cmdname: waiting for $HOST:$PORT without a timeout" | 
|  | fi | 
|  | start_ts=$(date +%s) | 
|  | while : | 
|  | do | 
|  | (echo > /dev/tcp/$HOST/$PORT) >/dev/null 2>&1 | 
|  | result=$? | 
|  | if [[ $result -eq 0 ]]; then | 
|  | end_ts=$(date +%s) | 
|  | echoerr "$cmdname: $HOST:$PORT is available after $((end_ts - start_ts)) seconds" | 
|  | break | 
|  | fi | 
|  | sleep 1 | 
|  | done | 
|  | return $result | 
|  | } | 
|  |  | 
|  | wait_for_wrapper() | 
|  | { | 
|  | # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692 | 
|  | if [[ $QUIET -eq 1 ]]; then | 
|  | timeout $TIMEOUT $0 --quiet --child --host=$HOST --port=$PORT --timeout=$TIMEOUT & | 
|  | else | 
|  | timeout $TIMEOUT $0 --child --host=$HOST --port=$PORT --timeout=$TIMEOUT & | 
|  | fi | 
|  | PID=$! | 
|  | trap "kill -INT -$PID" INT | 
|  | wait $PID | 
|  | RESULT=$? | 
|  | if [[ $RESULT -ne 0 ]]; then | 
|  | echoerr "$cmdname: timeout occurred after waiting $TIMEOUT seconds for $HOST:$PORT" | 
|  | fi | 
|  | return $RESULT | 
|  | } | 
|  |  | 
|  | # process arguments | 
|  | while [[ $# -gt 0 ]] | 
|  | do | 
|  | case "$1" in | 
|  | *:* ) | 
|  | hostport=(${1//:/ }) | 
|  | HOST=${hostport[0]} | 
|  | PORT=${hostport[1]} | 
|  | shift 1 | 
|  | ;; | 
|  | --child) | 
|  | CHILD=1 | 
|  | shift 1 | 
|  | ;; | 
|  | -q | --quiet) | 
|  | QUIET=1 | 
|  | shift 1 | 
|  | ;; | 
|  | -s | --strict) | 
|  | STRICT=1 | 
|  | shift 1 | 
|  | ;; | 
|  | -h) | 
|  | HOST="$2" | 
|  | if [[ $HOST == "" ]]; then break; fi | 
|  | shift 2 | 
|  | ;; | 
|  | --host=*) | 
|  | HOST="${1#*=}" | 
|  | shift 1 | 
|  | ;; | 
|  | -p) | 
|  | PORT="$2" | 
|  | if [[ $PORT == "" ]]; then break; fi | 
|  | shift 2 | 
|  | ;; | 
|  | --port=*) | 
|  | PORT="${1#*=}" | 
|  | shift 1 | 
|  | ;; | 
|  | -t) | 
|  | TIMEOUT="$2" | 
|  | if [[ $TIMEOUT == "" ]]; then break; fi | 
|  | shift 2 | 
|  | ;; | 
|  | --timeout=*) | 
|  | TIMEOUT="${1#*=}" | 
|  | shift 1 | 
|  | ;; | 
|  | --) | 
|  | shift | 
|  | CLI="$@" | 
|  | break | 
|  | ;; | 
|  | --help) | 
|  | usage | 
|  | ;; | 
|  | *) | 
|  | echoerr "Unknown argument: $1" | 
|  | usage | 
|  | ;; | 
|  | esac | 
|  | done | 
|  |  | 
|  | if [[ "$HOST" == "" || "$PORT" == "" ]]; then | 
|  | echoerr "Error: you need to provide a host and port to test." | 
|  | usage | 
|  | fi | 
|  |  | 
|  | TIMEOUT=${TIMEOUT:-15} | 
|  | STRICT=${STRICT:-0} | 
|  | CHILD=${CHILD:-0} | 
|  | QUIET=${QUIET:-0} | 
|  |  | 
|  | if [[ $CHILD -gt 0 ]]; then | 
|  | wait_for | 
|  | RESULT=$? | 
|  | exit $RESULT | 
|  | else | 
|  | if [[ $TIMEOUT -gt 0 ]]; then | 
|  | wait_for_wrapper | 
|  | RESULT=$? | 
|  | else | 
|  | wait_for | 
|  | RESULT=$? | 
|  | fi | 
|  | fi | 
|  |  | 
|  | if [[ $CLI != "" ]]; then | 
|  | if [[ $RESULT -ne 0 && $STRICT -eq 1 ]]; then | 
|  | echoerr "$cmdname: strict mode, refusing to execute subprocess" | 
|  | exit $RESULT | 
|  | fi | 
|  | exec $CLI | 
|  | else | 
|  | exit $RESULT | 
|  | fi |