#!/usr/bin/env python3
import json, subprocess, sys, os

green  = lambda s: f"\033[32m{s}\033[0m"
red    = lambda s: f"\033[31m{s}\033[0m"
yellow = lambda s: f"\033[33m{s}\033[0m"
cyan   = lambda s: f"\033[36m{s}\033[0m"

cfg = json.load(open('/var/www/html/config.json'))
servers = cfg['servers']

print()
print(cyan("╔══════════════════════════════════════════╗"))
print(cyan("║           检 查 所 有 节 点                 ║"))
print(cyan("╚══════════════════════════════════════════╝"))

for i, s in enumerate(servers, 1):
    print()
    print(yellow(f"--- [{i}] {s['name']} ({s['ip']}:{s['port']}) ---"))

    # SSH 连接
    print("  SSH 连接: ", end="", flush=True)
    try:
        r = subprocess.run(
            ["sshpass", "-p", s["password"], "ssh",
             "-o", "ConnectTimeout=5", "-o", "StrictHostKeyChecking=no",
             "-p", str(s["port"]), f"{s['user']}@{s['ip']}", "echo ok"],
            capture_output=True, text=True, timeout=10
        )
        if r.returncode == 0:
            print(green("正常"))
        else:
            print(red("失败"))
            continue
    except Exception as e:
        print(red(f"失败 ({e})"))
        continue

    # vnstat 检测
    print("  vnstat 组件: ", end="", flush=True)
    try:
        r = subprocess.run(
            ["sshpass", "-p", s["password"], "ssh",
             "-o", "ConnectTimeout=5", "-o", "StrictHostKeyChecking=no",
             "-p", str(s["port"]), f"{s['user']}@{s['ip']}",
             "vnstat --version 2>/dev/null | head -1"],
            capture_output=True, text=True, timeout=10
        )
        if "vnstat" in r.stdout.lower():
            print(green("已安装"))
        else:
            print(red("未安装"))
    except:
        print(red("未安装"))

    # vnstat 服务
    print("  vnstat 服务: ", end="", flush=True)
    try:
        r = subprocess.run(
            ["sshpass", "-p", s["password"], "ssh",
             "-o", "ConnectTimeout=5", "-o", "StrictHostKeyChecking=no",
             "-p", str(s["port"]), f"{s['user']}@{s['ip']}",
             "systemctl is-active vnstat 2>/dev/null"],
            capture_output=True, text=True, timeout=10
        )
        if r.stdout.strip() == "active":
            print(green("运行中"))
        else:
            print(red("未运行"))
    except:
        print(red("未运行"))

print()
print(cyan("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"))
