#!/usr/bin/env bash
# MAX ServiceCheck — 服务与端口健康巡检
# 风险等级: 🟢 只读 — 不修改任何系统设置
# 用法: bash <(curl -fsSL https://dl.unvmax.com/linux/scripts/max-tools/max-service-check.sh)
set -Eeuo pipefail

BC='\033[38;5;220m'; BG='\033[38;5;220m'; Y='\033[1;33m'; R='\033[0;31m'
BW='\033[38;5;255m'; W='\033[38;5;250m'; GR='\033[38;5;242m'; N='\033[0m'
PASS=0 WARN=0 FAIL=0
ok(){ printf '  %b✔%b %s\n' "$BG" "$N" "$*"; PASS=$((PASS+1)); }
warn(){ printf '  %b⚠%b %s\n' "$Y" "$N" "$*"; WARN=$((WARN+1)); }
bad(){ printf '  %b✘%b %s\n' "$R" "$N" "$*"; FAIL=$((FAIL+1)); }
section(){ printf '\n  %b── %s ─────────────────────────────────%b\n' "$BC" "$1" "$N"; }

printf '\n  %b┌──────────────────────────────────────────────────┐%b\n' "$BC" "$N"
printf '  %b│     MAX 服务与端口健康巡检  %b(只读诊断)%b\n' "$BG" "$GR" "$N"
printf '  %b└──────────────────────────────────────────────────┘%b\n' "$BC" "$N"
printf '  %b主机: %s  ·  %s%b\n' "$GR" "$(hostname -f 2>/dev/null || hostname)" "$(date '+%F %T')" "$N"

section 'systemd 服务状态'
if command -v systemctl >/dev/null 2>&1; then
  mapfile -t failed < <(systemctl --failed --no-legend --plain 2>/dev/null | awk '{print $1}')
  if ((${#failed[@]})); then
    bad "失败服务: ${failed[*]}"
  else
    ok '没有失败的 systemd 服务'
  fi
  running=$(systemctl list-units --type=service --state=running --no-legend 2>/dev/null | wc -l)
  printf '  %b运行中服务: %b%s\n' "$W" "$BW" "$running"
else
  warn '未检测到 systemd，跳过服务状态检查'
fi

section '监听端口与进程'
if command -v ss >/dev/null 2>&1; then
  listeners=$(ss -ltnp 2>/dev/null | awk 'NR>1 {print $4}' | sort -u)
  count=$(printf '%s\n' "$listeners" | sed '/^$/d' | wc -l)
  ok "发现 $count 个 TCP 监听地址"
  printf '%s\n' "$listeners" | sed '/^$/d' | head -20 | while read -r item; do printf '    %b%s%b\n' "$W" "$item" "$N"; done
  (( count <= 20 )) || warn '仅展示前 20 个监听地址'
else
  warn 'ss 不可用，无法列出监听端口'
fi

section '关键日志错误（最近 24 小时）'
if command -v journalctl >/dev/null 2>&1; then
  errors=$(journalctl -p err..alert --since '24 hours ago' --no-pager 2>/dev/null | wc -l)
  if (( errors == 0 )); then ok '最近 24 小时没有 error 级别系统日志';
  elif (( errors <= 10 )); then warn "最近 24 小时有 $errors 条 error 级别日志";
  else bad "最近 24 小时有 $errors 条 error 级别日志"; fi
  journalctl -p err..alert --since '24 hours ago' --no-pager 2>/dev/null | tail -5 | while read -r line; do printf '    %b%s%b\n' "$GR" "$line" "$N"; done
else
  warn 'journalctl 不可用，跳过日志检查'
fi

printf '\n  %b────────────────────────────────────────────────────%b\n' "$GR" "$N"
printf '  %b巡检完成%b  通过: %s  警告: %s  异常: %s\n\n' "$BG" "$N" "$PASS" "$WARN" "$FAIL"
