80 lines
2.3 KiB
Bash
80 lines
2.3 KiB
Bash
|
#!/bin/bash
|
||
|
|
||
|
# Default values
|
||
|
server_domain="cloudflare-dns.com"
|
||
|
port="443"
|
||
|
resolve_domain=""
|
||
|
warning_level=900
|
||
|
critical_level=1000
|
||
|
|
||
|
# Parse flag arguments
|
||
|
while getopts ":d:p:r:w:c:" opt; do
|
||
|
case $opt in
|
||
|
d)
|
||
|
server_domain="$OPTARG"
|
||
|
;;
|
||
|
p)
|
||
|
port="$OPTARG"
|
||
|
;;
|
||
|
r)
|
||
|
resolve_domain="$OPTARG"
|
||
|
;;
|
||
|
w)
|
||
|
warning_level="$OPTARG"
|
||
|
;;
|
||
|
c)
|
||
|
critical_level="$OPTARG"
|
||
|
;;
|
||
|
\?)
|
||
|
echo "Invalid option: -$OPTARG" >&2
|
||
|
exit 1
|
||
|
;;
|
||
|
:)
|
||
|
echo "Option -$OPTARG requires an argument." >&2
|
||
|
exit 1
|
||
|
;;
|
||
|
esac
|
||
|
done
|
||
|
|
||
|
# Check if the -r flag is provided
|
||
|
if [ -z "$resolve_domain" ]; then
|
||
|
echo "The -r flag is required. Please provide a domain to resolve." >&2
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
# Perform DNS-over-HTTPS check and measure the time taken
|
||
|
start_time=$(date +%s%N)
|
||
|
response=$(curl -s -o /dev/null -w "%{http_code}" "https://$server_domain:$port/dns-query?ct=application/dns-json&name=$resolve_domain&type=A")
|
||
|
end_time=$(date +%s%N)
|
||
|
time_taken=$(((end_time - start_time) / 1000000))
|
||
|
|
||
|
if [ "$response" == "200" ]; then
|
||
|
echo "OK - successfully resolved $resolve_domain using DoH on $server_domain:$port in $time_taken ms | response_time=${time_taken}ms"
|
||
|
exit 0
|
||
|
else
|
||
|
echo "CRITICAL - failed to resolve $resolve_domain using DoH on $server_domain:$port "
|
||
|
exit 2
|
||
|
fi
|
||
|
|
||
|
start_time=$(date +%s%N)
|
||
|
response=$(curl -s -o /dev/null -w "%{http_code}" "https://$server_domain:$port/dns-query?ct=application/dns-json&name=$resolve_domain&type=A")
|
||
|
end_time=$(date +%s%N)
|
||
|
response_time=$(( (end_time - start_time) / 1000000 ))
|
||
|
perfdata="response_time=${response_time}ms;${warning_level};${critical_level};0;"
|
||
|
|
||
|
# Check response time against warning and critical levels
|
||
|
if [ -n "$critical_level" ] && [ "$time_taken" -ge "$critical_level" ]; then
|
||
|
echo "CRITICAL - $server_domain:$port response time is high: $time_taken ms | $perfdata"
|
||
|
exit 2
|
||
|
elif [ -n "$warning_level" ] && [ "$time_taken" -ge "$warning_level" ]; then
|
||
|
echo "WARNING - $server_domain:$port response time is high: $time_taken ms | $perfdata"
|
||
|
exit 1
|
||
|
elif [ "$response" == "200" ]; then
|
||
|
echo "OK - successfully resolved $resolve_domain using DoH on $server_domain:$port in $time_taken ms | response_time=${time_taken}ms"
|
||
|
exit 0
|
||
|
else
|
||
|
echo "CRITICAL - $server_domain:$port is not responding"
|
||
|
exit 3
|
||
|
fi
|
||
|
|