#!/bin/bash
# 配置 Netdata 采集器：nvidia_smi（GPU）+ portcheck（服务端口存活），并自检
set -u
PW=yueling408
SUDO() { printf '%s\n' "$PW" | sudo -S -p '' "$@"; }
API=http://127.0.0.1:19999

echo "== 写采集器配置 =="
SUDO install -d -m 0755 /etc/netdata/go.d
SUDO tee /etc/netdata/go.d/nvidia_smi.conf >/dev/null <<'EOF'
# GPU 监控：走 nvidia-smi（官方 go.d 采集器）
update_every: 5
jobs:
  - name: gpu0
EOF
SUDO tee /etc/netdata/go.d/portcheck.conf >/dev/null <<'EOF'
# 服务端口存活探测（在听=1 / 没听=0）
update_every: 5
jobs:
  - name: local-services
    host: 127.0.0.1
    ports:
      - 8189    # ComfyUI
      - 8080    # LLM (llama.cpp / ridge / bucoid)
      - 1234    # LM Studio
      - 3013    # H3 Studio UI
      - 6020    # H3 Studio API
      - 22      # SSH
    timeout: 2
EOF
SUDO chown -R netdata:netdata /etc/netdata/go.d 2>/dev/null || true
ls -l /etc/netdata/go.d/

echo "== 重启 netdata =="
SUDO systemctl restart netdata
sleep 12

echo "== 采集器配置是否被接受 =="
SUDO journalctl -u netdata --since "-2min" --no-pager 2>/dev/null | grep -iE "nvidia_smi|portcheck" | tail -5

echo "== 相关图表 =="
curl -s --noproxy '*' "$API/api/v1/charts" | python3 -c "
import sys,json
d=json.load(sys.stdin)['charts']
hits=[k for k in d if 'nvidia' in k.lower() or 'portcheck' in k.lower()]
print('  命中图表数:', len(hits))
for k in sorted(hits)[:12]: print('   ', k)
" 2>/dev/null || echo "  (API 解析失败)"

echo "== GPU 实时值抽查 =="
curl -s --noproxy '*' "$API/api/v1/data?chart=nvidia_smi.gpu_utilization&after=-10&points=1&format=json" 2>/dev/null | head -c 300; echo
echo "== 端口探测实时值抽查 =="
curl -s --noproxy '*' "$API/api/v1/data?chart=portcheck.port_available&after=-10&points=1&format=json" 2>/dev/null | head -c 400; echo

echo "== 监听地址（局域网可访问性）=="
ss -ltnp 2>/dev/null | grep 19999 || ss -ltn | grep 19999
echo -n "局域网入口: http://192.168.31.31:19999  ->  "
curl -s --noproxy '*' -o /dev/null -w "%{http_code}\n" http://192.168.31.31:19999
