#!/usr/bin/env bash
# SPDX-License-Identifier: MIT
# Uses the configured resolver; does not alter network files or restart services.
set -u
if (( $# == 1 )) && [[ ${1-} == --help ]]; then
  printf '用法: bash dns-check.sh example.com\n只检查指定主机名的系统名称解析，不修改 DNS、不上传报告。\n'
  exit 0
fi
if (( $# != 1 )) || (( ${#1} > 253 )) ||
  [[ ! $1 =~ ^[a-zA-Z0-9]([a-zA-Z0-9.-]*[a-zA-Z0-9])?$ ]] ||
  [[ ! $1 =~ [a-zA-Z] ]] || [[ $1 == *..* ]]; then
  printf '请输入一个主机名，例如 example.com；不要带协议、端口、路径或账号。\n' >&2
  exit 2
fi
host=$1
IFS=. read -r -a labels <<< "$host"
for label in "${labels[@]}"; do
  if (( ${#label} > 63 )) || [[ $label == -* || $label == *- ]]; then
    printf '主机名标签格式不正确。\n' >&2
    exit 2
  fi
done
for tool in getent timeout awk; do
  if ! command -v "$tool" >/dev/null 2>&1; then
    printf '缺少命令 %s：请按系统软件管理方式准备后重试。\n' "$tool" >&2
    exit 3
  fi
done
printf '检查主机名: %s\n' "$host"
result=$(timeout 8s getent ahosts "$host" 2>/dev/null)
lookup_exit=$?
if (( lookup_exit == 0 )) && [[ -n $result ]]; then
  printf '系统名称解析: 成功（结果可能来自 DNS、缓存或 hosts）\n'
  printf '%s\n' "$result" | awk '!seen[$1]++ {print "地址: " $1}'
else
  printf '系统名称解析: 未取得地址，退出码=%s\n' "$lookup_exit"
fi
if command -v resolvectl >/dev/null 2>&1; then
  timeout 5s resolvectl query "$host" >/dev/null 2>&1
  resolved_exit=$?
  printf 'systemd-resolved 查询退出码: %s\n' "$resolved_exit"
  printf '非零不一定是 DNS 故障，也可能是该服务未运行或容器没有连接系统总线。\n'
else
  printf '未提供 resolvectl：跳过，不影响上面的系统解析检查。\n'
fi
printf '没有改动任何设置。查看教程中的结果分支；不要仅凭一次失败覆盖 resolv.conf。\n'
if (( lookup_exit != 0 )) || [[ -z $result ]]; then
  exit 1
fi
