123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- #!/bin/sh
- # The MIT License (MIT)
- #
- # Copyright (c) 2017 Eficode Oy
- #
- # Permission is hereby granted, free of charge, to any person obtaining a copy
- # of this software and associated documentation files (the "Software"), to deal
- # in the Software without restriction, including without limitation the rights
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- # copies of the Software, and to permit persons to whom the Software is
- # furnished to do so, subject to the following conditions:
- #
- # The above copyright notice and this permission notice shall be included in all
- # copies or substantial portions of the Software.
- #
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- # SOFTWARE.
- VERSION="2.2.3"
- set -- "$@" -- "$TIMEOUT" "$QUIET" "$PROTOCOL" "$HOST" "$PORT" "$result"
- TIMEOUT=15
- QUIET=0
- # The protocol to make the request with, either "tcp" or "http"
- PROTOCOL="tcp"
- echoerr() {
- if [ "$QUIET" -ne 1 ]; then printf "%s\n" "$*" 1>&2; fi
- }
- usage() {
- exitcode="$1"
- cat << USAGE >&2
- Usage:
- $0 host:port|url [-t timeout] [-- command args]
- -q | --quiet Do not output any status messages
- -t TIMEOUT | --timeout=timeout Timeout in seconds, zero for no timeout
- -v | --version Show the version of this tool
- -- COMMAND ARGS Execute command with args after the test finishes
- USAGE
- exit "$exitcode"
- }
- wait_for() {
- case "$PROTOCOL" in
- tcp)
- if ! command -v nc >/dev/null; then
- echoerr 'nc command is missing!'
- exit 1
- fi
- ;;
- http)
- if ! command -v wget >/dev/null; then
- echoerr 'wget command is missing!'
- exit 1
- fi
- ;;
- esac
- TIMEOUT_END=$(($(date +%s) + TIMEOUT))
- while :; do
- case "$PROTOCOL" in
- tcp)
- nc -w 1 -z "$HOST" "$PORT" > /dev/null 2>&1
- ;;
- http)
- wget --timeout=1 -q "$HOST" -O /dev/null > /dev/null 2>&1
- ;;
- *)
- echoerr "Unknown protocol '$PROTOCOL'"
- exit 1
- ;;
- esac
- result=$?
- if [ $result -eq 0 ] ; then
- if [ $# -gt 7 ] ; then
- for result in $(seq $(($# - 7))); do
- result=$1
- shift
- set -- "$@" "$result"
- done
- TIMEOUT=$2 QUIET=$3 PROTOCOL=$4 HOST=$5 PORT=$6 result=$7
- shift 7
- exec "$@"
- fi
- exit 0
- fi
- if [ $TIMEOUT -ne 0 -a $(date +%s) -ge $TIMEOUT_END ]; then
- echo "Operation timed out" >&2
- exit 1
- fi
- sleep 1
- done
- }
- while :; do
- case "$1" in
- http://*|https://*)
- HOST="$1"
- PROTOCOL="http"
- shift 1
- ;;
- *:* )
- HOST=$(printf "%s\n" "$1"| cut -d : -f 1)
- PORT=$(printf "%s\n" "$1"| cut -d : -f 2)
- shift 1
- ;;
- -v | --version)
- echo $VERSION
- exit
- ;;
- -q | --quiet)
- QUIET=1
- shift 1
- ;;
- -q-*)
- QUIET=0
- echoerr "Unknown option: $1"
- usage 1
- ;;
- -q*)
- QUIET=1
- result=$1
- shift 1
- set -- -"${result#-q}" "$@"
- ;;
- -t | --timeout)
- TIMEOUT="$2"
- shift 2
- ;;
- -t*)
- TIMEOUT="${1#-t}"
- shift 1
- ;;
- --timeout=*)
- TIMEOUT="${1#*=}"
- shift 1
- ;;
- --)
- shift
- break
- ;;
- --help)
- usage 0
- ;;
- -*)
- QUIET=0
- echoerr "Unknown option: $1"
- usage 1
- ;;
- *)
- QUIET=0
- echoerr "Unknown argument: $1"
- usage 1
- ;;
- esac
- done
- if ! [ "$TIMEOUT" -ge 0 ] 2>/dev/null; then
- echoerr "Error: invalid timeout '$TIMEOUT'"
- usage 3
- fi
- case "$PROTOCOL" in
- tcp)
- if [ "$HOST" = "" ] || [ "$PORT" = "" ]; then
- echoerr "Error: you need to provide a host and port to test."
- usage 2
- fi
- ;;
- http)
- if [ "$HOST" = "" ]; then
- echoerr "Error: you need to provide a host to test."
- usage 2
- fi
- ;;
- esac
- wait_for "$@"
|