#!/usr/bin/env bash set -uo pipefail source '{{ healthcheck_install_root }}/health-common.sh' require_command docker require_command curl require_command dig require_command ss require_command df check_compose container='adguardhome' if ! docker inspect "$container" >/dev/null 2>&1; then record critical 'adguardhome_container_missing' else running="$(docker inspect "$container" --format '{{ '{{' }}.State.Running{{ '}}' }}' 2>/dev/null)" [[ "$running" == true ]] || record critical 'adguardhome_container_not_running' fi config_check="$(docker exec "$container" /opt/adguardhome/AdGuardHome --check-config \ -c /opt/adguardhome/conf/AdGuardHome.yaml 2>&1 || true)" if grep -qiE 'error|invalid|fatal' <<<"$config_check"; then record critical 'adguardhome_config_invalid' else record ok 'adguardhome_config_valid' fi if ss -H -ltn 2>/dev/null | awk '{print $4}' | grep -Eq '(^|:)53$'; then record ok 'dns_tcp_53_listening' else record critical 'dns_tcp_53_missing' fi if ss -H -uln 2>/dev/null | awk '{print $4}' | grep -Eq '(^|:)53$'; then record ok 'dns_udp_53_listening' else record critical 'dns_udp_53_missing' fi if ss -H -ltn 2>/dev/null | awk '{print $4}' | grep -Eq '(^|:)80$'; then record ok 'ui_http_80_listening' else record critical 'ui_http_80_missing' fi dns_a="$(dig +time=5 +tries=1 @192.168.66.36 example.com A +noall +answer 2>/dev/null)" [[ -n "$dns_a" ]] && record ok 'dns_example_a' || record critical 'dns_example_a_failed' dns_aaaa="$(dig +time=5 +tries=1 @192.168.66.36 example.com AAAA +noall +answer 2>/dev/null)" [[ -n "$dns_aaaa" ]] && record ok 'dns_example_aaaa' || record warning 'dns_example_aaaa_none' dns_local="$(dig +time=5 +tries=1 @192.168.66.36 hass.windy.lan A +noall +answer 2>/dev/null)" [[ -n "$dns_local" ]] && record ok 'dns_local_name' || record warning 'dns_local_name_unresolved' ui_code="$(curl --silent --show-error --output /dev/null --write-out '%{http_code}' --max-time 10 http://192.168.66.36/ 2>/dev/null || true)" case "$ui_code" in 200|301|302) record ok "ui_http_${ui_code}" ;; '') record critical 'ui_unreachable' ;; *) record critical "ui_http_${ui_code}" ;; esac usage="$(df -P /opt/adguardhome/work 2>/dev/null | awk 'NR==2 {print $5}' | tr -d '%')" if [[ "$usage" =~ ^[0-9]+$ ]]; then if (( usage >= 90 )); then record critical 'disk_usage_high' elif (( usage >= 80 )); then record warning 'disk_usage_elevated' else record ok 'disk_usage_ok'; fi else record unknown 'disk_usage_unknown' fi logs="$(docker logs --since 30m "$container" 2>&1 || true)" if grep -qiE '\[(error|warn|fatal)\]|level=(error|warn|fatal)' <<<"$logs"; then record warning 'adguardhome_log_errors' else record ok 'adguardhome_logs_clean' fi emit_result exit "$EXIT_CODE"