// zonat 节点入口:TCP 桥接监听 + 隧道注册表 + 纯 TCP 隧道监听。 // 无管理 API、无数据库;隧道由 agent 经桥接控制流注册。 // agent 登录用 JWT 校验(HS256);token 正式部署由 cloud 签发, // 手工/测试场景可用 -print-token 现场签发。 package main import ( "flag" "fmt" "log/slog" "os" "os/signal" "syscall" "time" "git.zeroonesoft.cn/golib/zonat/internal/node" ) func main() { addr := flag.String("addr", ":5212", "桥接监听地址") tunnelBind := flag.String("tunnel-bind", "0.0.0.0", "隧道监听绑定地址") jwtSecret := flag.String("jwt-secret", "", "agent 登录 JWT 校验密钥(HS256)") sweep := flag.Duration("sweep", 30*time.Second, "TTL 清扫间隔") // 便捷签发:node -jwt-secret s3cret -print-token -agent a1 -ttl 24h printToken := flag.Bool("print-token", false, "用 -jwt-secret 签发一张 agent 登录 token 后退出") tokenAgent := flag.String("agent", "", "print-token 时写入 agentId claim") tokenTTL := flag.Duration("ttl", 24*time.Hour, "print-token 签发的有效期") flag.Parse() if *printToken { if *jwtSecret == "" || *tokenTTL <= 0 { slog.Error("print-token 需要 -jwt-secret 与正的 -ttl") os.Exit(1) } tok, err := node.SignToken(*jwtSecret, *tokenAgent, *tokenTTL) if err != nil { slog.Error("签发失败", "err", err.Error()) os.Exit(1) } fmt.Println(tok) return } if *jwtSecret == "" { slog.Error("缺少 -jwt-secret(agent 登录 JWT 校验密钥)") os.Exit(1) } n := node.New() n.JwtSecret = *jwtSecret n.BindTunnel = *tunnelBind n.SweepInterval = *sweep if err := n.Start(*addr); err != nil { slog.Error("节点启动失败", "err", err.Error()) os.Exit(1) } quit := make(chan os.Signal, 1) signal.Notify(quit, os.Interrupt, syscall.SIGTERM) <-quit n.Stop() }