2023-04-21 23:54:17 -06:00
|
|
|
#!/bin/bash
|
|
|
|
|
2023-04-21 23:54:18 -06:00
|
|
|
# Define the usage message
|
2023-04-21 23:54:17 -06:00
|
|
|
usage() {
|
2023-04-21 23:54:18 -06:00
|
|
|
echo "Usage: $0 -u <url> [-w <warning>] [-c <critical>]"
|
|
|
|
exit 3
|
2023-04-21 23:54:17 -06:00
|
|
|
}
|
|
|
|
|
2023-04-21 23:54:18 -06:00
|
|
|
# Parse the command-line arguments
|
|
|
|
while getopts "u:w:c:C:H:R:lhIp" opt; do
|
2023-04-21 23:54:17 -06:00
|
|
|
case $opt in
|
2023-04-21 23:54:18 -06:00
|
|
|
u)
|
|
|
|
URL=$OPTARG
|
|
|
|
;;
|
|
|
|
w)
|
|
|
|
WARNING_LEVEL=$OPTARG
|
|
|
|
;;
|
|
|
|
c)
|
|
|
|
CRITICAL_LEVEL=$OPTARG
|
|
|
|
;;
|
|
|
|
l)
|
|
|
|
FOLLOW_REDIRECTS="-L"
|
|
|
|
;;
|
|
|
|
C)
|
|
|
|
CONTAINS=$OPTARG
|
|
|
|
;;
|
|
|
|
I)
|
|
|
|
INSECURE="--insecure"
|
|
|
|
;;
|
|
|
|
H)
|
|
|
|
HEADERS=$OPTARG
|
|
|
|
;;
|
|
|
|
p)
|
|
|
|
PRINT_ONLY=true
|
|
|
|
;;
|
|
|
|
R)
|
|
|
|
RESOLVE="--resolve $OPTARG"
|
|
|
|
;;
|
|
|
|
h)
|
|
|
|
usage
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
usage
|
|
|
|
;;
|
2023-04-21 23:54:17 -06:00
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
2023-04-21 23:54:18 -06:00
|
|
|
WARNING_LEVEL=${WARNING_LEVEL:-1}
|
|
|
|
CRITICAL_LEVEL=${CRITICAL_LEVEL:-2}
|
|
|
|
#FOLLOW_REDIRECTS=${FOLLOW_REDIRECTS:-""}
|
|
|
|
|
|
|
|
if [ -z "$URL" ]; then
|
2023-04-21 23:54:17 -06:00
|
|
|
usage
|
|
|
|
fi
|
|
|
|
|
2023-04-21 23:54:18 -06:00
|
|
|
HEADER_ARGS=""
|
|
|
|
IFS=',' read -ra values <<<"$HEADERS"
|
|
|
|
for value in "${values[@]}"; do
|
|
|
|
HEADER_ARGS+="-H '$value'"
|
|
|
|
done
|
|
|
|
|
|
|
|
CURL_CMD="-s -w '%{http_code}\n%{time_total}' $HEADER_ARGS $FOLLOW_REDIRECTS $INSECURE $RESOLVE $URL"
|
|
|
|
|
|
|
|
if $PRINT_ONLY; then
|
|
|
|
echo "curl $CURL_CMD"
|
|
|
|
exit 3
|
2023-04-21 23:54:17 -06:00
|
|
|
fi
|
|
|
|
|
2023-04-21 23:54:18 -06:00
|
|
|
TMP_ERROR_LOG=$(mktemp)
|
|
|
|
TMP_RESPONSE=$(mktemp)
|
|
|
|
RESPONSE=$(curl -v -o "$TMP_RESPONSE" "$CURL_CMD" 2>"$TMP_ERROR_LOG")
|
|
|
|
|
|
|
|
# shellcheck disable=SC2181
|
|
|
|
if [ $? -ne 0 ]; then
|
|
|
|
echo "CRITICAL: curl failed!"
|
|
|
|
echo "Error log:"
|
|
|
|
cat "$TMP_ERROR_LOG"
|
|
|
|
exit 2
|
2023-04-21 23:54:17 -06:00
|
|
|
fi
|
2023-04-21 23:54:18 -06:00
|
|
|
rm -rf "$TMP_ERROR_LOG"
|
|
|
|
|
|
|
|
RESPONSE_CODE=$(echo "$RESPONSE" | head -n 1)
|
|
|
|
RESPONSE_TIME=$(printf "%.2f" "$(echo "$RESPONSE" | tail -n 1)")
|
2023-04-21 23:54:17 -06:00
|
|
|
|
2023-04-21 23:54:18 -06:00
|
|
|
OUTPUT_MSG=""
|
|
|
|
OUTPUT_CODE=0
|
|
|
|
|
|
|
|
if [ $RESPONSE_CODE -eq 200 ] && [ "$(echo "$RESPONSE_TIME < $CRITICAL_LEVEL" | bc -l)" -eq 1 ]; then
|
|
|
|
OUTPUT_MSG="OK: website is up and responded in $RESPONSE_TIME seconds."
|
|
|
|
elif [ $RESPONSE_CODE -eq 200 ] && [ "$(echo "$RESPONSE_TIME < $WARNING_LEVEL" | bc -l)" -eq 1 ]; then
|
|
|
|
OUTPUT_MSG="WARNING: response time is slow ($RESPONSE_TIME seconds)."
|
|
|
|
OUTPUT_CODE=1
|
|
|
|
elif [ $RESPONSE_CODE -eq 200 ]; then
|
|
|
|
OUTPUT_MSG"CRITICAL: response time is very slow ($RESPONSE_TIME seconds)."
|
|
|
|
OUTPUT_CODE=2
|
|
|
|
else
|
|
|
|
OUTPUT_MSG="CRITICAL: website is not responding, returned $RESPONSE_CODE code."
|
|
|
|
OUTPUT_CODE=2
|
2023-04-21 23:54:17 -06:00
|
|
|
fi
|
|
|
|
|
2023-04-21 23:54:18 -06:00
|
|
|
if [ ! -z ${CONTAINS+x} ]; then
|
|
|
|
if ! grep -q "$CONTAINS" "$TMP_RESPONSE"; then
|
|
|
|
OUTPUT_MSG+="\nCRITICAL: response did not contain required string!\nFound: $(cat "$TMP_RESPONSE")"
|
|
|
|
OUTPUT_CODE=2
|
|
|
|
else
|
|
|
|
OUTPUT_MSG+="\nOK: response contained required string."
|
2023-04-21 23:54:17 -06:00
|
|
|
fi
|
|
|
|
fi
|
2023-04-21 23:54:18 -06:00
|
|
|
rm -rf "$TMP_RESPONSE"
|
|
|
|
|
|
|
|
OUTPUT_MSG+=" | response_time=${RESPONSE_TIME}s;$WARNING_LEVEL;$CRITICAL_LEVEL;0"
|
2023-04-21 23:54:17 -06:00
|
|
|
|
2023-04-21 23:54:18 -06:00
|
|
|
echo -e "$OUTPUT_MSG"
|
|
|
|
exit $OUTPUT_CODE
|