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