|
| 1 | +#!/bin/sh |
| 2 | + |
| 3 | +TIMEOUT=15 |
| 4 | +QUIET=0 |
| 5 | +HOST="127.0.0.1" |
| 6 | + |
| 7 | +echoerr() { |
| 8 | + if [ "$QUIET" -ne 1 ]; then printf "%s\n" "$*" 1>&2; fi |
| 9 | +} |
| 10 | + |
| 11 | +usage() { |
| 12 | + exitcode="$1" |
| 13 | + cat << USAGE >&2 |
| 14 | +Usage: |
| 15 | + $cmdname service [-h host] [-P port] [-u username] [-p password] [-t timeout] [-- command args] |
| 16 | +
|
| 17 | + service REQUIRED pgsql | mysql | web |
| 18 | +
|
| 19 | + -h HOST | --host=HOST Domain/IP host (default: 127.0.0.1) |
| 20 | + -P PORT | --port=PORT Port (default: 5432 for psql, 3306 for mysql, 80 for web) |
| 21 | +
|
| 22 | + -u USERNAME | --username=USERNAME MySQL username (required for mysql only) |
| 23 | + -p PASSWORD | --password=PASSWORD MySQL password for the given username (required for mysql only) |
| 24 | +
|
| 25 | + -q | --quiet Do not output any status messages |
| 26 | + -t TIMEOUT | --timeout=TIMEOUT Timeout in seconds, zero for no timeout (default: 15 seconds) |
| 27 | + -- COMMAND ARGS Execute command with args after the test finishes |
| 28 | +USAGE |
| 29 | + exit "$exitcode" |
| 30 | +} |
| 31 | + |
| 32 | +get_params() { |
| 33 | + if [ "$SERVICE" = pgsql ]; then |
| 34 | + if [ -z "$PORT" ]; then PORT=5432; fi |
| 35 | + PARAMS="pg_isready -h ${HOST} -p ${PORT}" |
| 36 | + |
| 37 | + elif [ "$SERVICE" = mysql ]; then |
| 38 | + if [ -z "$PORT" ]; then PORT=3306; fi |
| 39 | + PARAMS="mysqladmin ping -h ${HOST} -P ${PORT} -u ${USERNAME} -p${PASSWORD}" |
| 40 | + |
| 41 | + else |
| 42 | + if [ -z "$PORT" ]; then PORT=80; fi |
| 43 | + PARAMS="curl ${HOST}:${PORT} --connect-timeout 1" |
| 44 | + fi |
| 45 | + |
| 46 | + echo $PARAMS |
| 47 | +} |
| 48 | + |
| 49 | +wait_for() { |
| 50 | + echo "Waiting for ${SERVICE} server at ${HOST}:${PORT} to be ready..." |
| 51 | + |
| 52 | + for i in `seq $TIMEOUT` ; do |
| 53 | + eval $(get_params) > /dev/null 2>&1 |
| 54 | + |
| 55 | + result=$? |
| 56 | + if [ $result -eq 0 ] ; then |
| 57 | + echo "${SERVICE} server at ${HOST}:${PORT} is ready for connection" |
| 58 | + if [ $# -gt 0 ] ; then |
| 59 | + exec "$@" |
| 60 | + fi |
| 61 | + exit 0 |
| 62 | + fi |
| 63 | + sleep 1 |
| 64 | + done |
| 65 | + echo "Operation timed out" >&2 |
| 66 | + exit 1 |
| 67 | +} |
| 68 | + |
| 69 | +while [ $# -gt 0 ] |
| 70 | +do |
| 71 | + case "$1" in |
| 72 | + pgsql | mysql | web) |
| 73 | + SERVICE=$1 |
| 74 | + if [ "$SERVICE" = "" ]; then break; fi |
| 75 | + shift 1 |
| 76 | + ;; |
| 77 | + -h) |
| 78 | + HOST="$2" |
| 79 | + if [ "$HOST" = "" ]; then break; fi |
| 80 | + shift 2 |
| 81 | + ;; |
| 82 | + --host=*) |
| 83 | + HOST="${1#*=}" |
| 84 | + shift 1 |
| 85 | + ;; |
| 86 | + -P) |
| 87 | + PORT="$2" |
| 88 | + if [ "$PORT" = "" ]; then break; fi |
| 89 | + shift 2 |
| 90 | + ;; |
| 91 | + --port=*) |
| 92 | + PORT="${1#*=}" |
| 93 | + shift 1 |
| 94 | + ;; |
| 95 | + -u) |
| 96 | + USERNAME="$2" |
| 97 | + if [ "$USERNAME" = "" ]; then break; fi |
| 98 | + shift 2 |
| 99 | + ;; |
| 100 | + --username=*) |
| 101 | + USERNAME="${1#*=}" |
| 102 | + shift 1 |
| 103 | + ;; |
| 104 | + -p) |
| 105 | + PASSWORD="$2" |
| 106 | + if [ "$PASSWORD" = "" ]; then break; fi |
| 107 | + shift 2 |
| 108 | + ;; |
| 109 | + --password=*) |
| 110 | + PASSWORD="${1#*=}" |
| 111 | + shift 1 |
| 112 | + ;; |
| 113 | + -q | --quiet) |
| 114 | + QUIET=1 |
| 115 | + shift 1 |
| 116 | + ;; |
| 117 | + -t) |
| 118 | + TIMEOUT="$2" |
| 119 | + if [ "$TIMEOUT" = "" ]; then break; fi |
| 120 | + shift 2 |
| 121 | + ;; |
| 122 | + --timeout=*) |
| 123 | + TIMEOUT="${1#*=}" |
| 124 | + shift 1 |
| 125 | + ;; |
| 126 | + --) |
| 127 | + shift |
| 128 | + break |
| 129 | + ;; |
| 130 | + --help) |
| 131 | + usage 0 |
| 132 | + ;; |
| 133 | + *) |
| 134 | + echoerr "Unknown argument: $1" |
| 135 | + usage 1 |
| 136 | + ;; |
| 137 | + esac |
| 138 | +done |
| 139 | + |
| 140 | +if [ "$SERVICE" = "" ]; then |
| 141 | + echoerr "Error: you must provide a service name: pgsql | mysql | web" |
| 142 | + usage 2 |
| 143 | +fi |
| 144 | + |
| 145 | +if [ "$SERVICE" = mysql ]; then |
| 146 | + if [ "$USERNAME" = "" ] || [ "$PASSWORD" = "" ]; then |
| 147 | + echoerr "Error: you must provide username and password for mysql service" |
| 148 | + usage 2 |
| 149 | + fi |
| 150 | +fi |
| 151 | + |
| 152 | +wait_for "$@" |
0 commit comments