nagios-scripts/check-url.sh

115 lines
3.3 KiB
Bash

#!/bin/bash
#
#/
#/ Usage:
#/ check-url.sh --proxy=<proxy-url> --warning=<level> --critical=<level> --help <URL>
#/
#/ Checks if URL is available
#/
#/ Options:
#/ -p, --proxy=<proxy-url> The proxy server to use
#/ -w, --warning=<sec> The amount of response time to trigger a warning (in sec)
#/ -c, --critical=<sec> 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