63 lines
1.8 KiB
Go
63 lines
1.8 KiB
Go
// 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()
|
||
}
|