#!/bin/bash # #/ #/ Usage: #/ check-url.sh --proxy= --warning= --critical= --help #/ #/ Checks if URL is available #/ #/ Options: #/ -p, --proxy= The proxy server to use #/ -w, --warning= The amount of response time to trigger a warning (in sec) #/ -c, --critical= The amount of response time to trigger a critcal warning (in sec) #/ -h, --help Display this help message #/ #/ Exit Codes: #/ 0 Everything OK #/ 1 Warning level exceeded #/ 2 Critical level exceeded #/ 3 Unknown status #/ Usage() { grep '^#/' "${script_dir}/${script_name}" | sed 's/^#\/\w*//' } GetOptions() { # https://stackoverflow.com/a/29754866 OPTIONS=p:w:c:h LONGOPTS=proxy:,warning:,critical:,help # -use ! and PIPESTATUS to get exit code with errexit set # -temporarily store output to be able to check for errors # -activate quoting/enhanced mode (e.g. by writing out “--options”) # -pass arguments only via -- "$@" to separate them correctly ! PARSED=$(getopt --options=$OPTIONS --longoptions=$LONGOPTS --name "$0" -- "$@") if [[ ${PIPESTATUS[0]} -ne 0 ]]; then # e.g. return value is 1 # then getopt has complained about wrong arguments to stdout Usage exit 2 fi # read getopt's output this way to handle the quoting right: eval set -- "$PARSED" # now enjoy the options in order and nicely split until we see -- while true; do case "$1" in -p|--proxy) proxy="$2" shift 2 ;; -w|--warning) warn="$2" shift 2 ;; -c|--critical) crit="$2" shift 2 ;; -h|--help) Usage exit 0 ;; --) shift break ;; *) echo "URL UNKNOWN - ${1} is not a valid parameter" exit 3 ;; esac done if [ -z ${1+x} ]; then echo "URL UNKNOWN - url not given" exit 3 else url=${1} fi } LC_NUMERIC="C" warn=1 crit=2 script_name=$(basename "${0}") script_dir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) url='' GetOptions "$@" eval $(curl -L -o /dev/null -s -w 'RESPONSE_CODE=%{response_code}\nRESPONSE_TIME=%{time_total}\nDNS_TIME=%{time_namelookup}\nCONNECT_TIME=%{time_connect}' ${proxy:+"--proxy" "$proxy"} $url) response_time=$(printf %.3f $(echo ${RESPONSE_TIME})) dns_time=$(printf %.3f $(echo ${DNS_TIME})) connect_time=$(printf %.3f $(echo ${CONNECT_TIME})) rdetail="" if (( $(echo "$RESPONSE_CODE != 200" | bc -l) )); then rval=2 rmsg="CRITICAL" rdetail="$url was not available" elif (( $(echo "$RESPONSE_TIME < ${warn}" | bc -l) )); then rval=0 rmsg="OK" elif (( $(echo "$RESPONSE_TIME < ${crit}" | bc -l) )); then rval=1 rmsg="WARNING" else rval=2 rmsg="CRITICAL" fi unit='s' echo "URL ${rmsg} - ${rdetail:+"$rdetail - "}Response code: ${RESPONSE_CODE} Response Time: ${response_time} DNS Lookup time: ${dns_time} Connect time: ${connect_time}|response=${response_time}${unit} dns-query=${dns_time}${unit} connect=${connect_time}${unit}" exit $rval