Add Android client support and unify cross-platform builds

This commit is contained in:
2026-03-22 21:25:09 +08:00
parent 6558d1acdb
commit 4210ab7675
44 changed files with 2241 additions and 328 deletions

View File

@@ -3,6 +3,7 @@ package main
import (
"flag"
"log"
"time"
"github.com/gotunnel/internal/client/config"
"github.com/gotunnel/internal/client/tunnel"
@@ -10,7 +11,7 @@ import (
"github.com/gotunnel/pkg/version"
)
// 版本信息(通过 ldflags 注入)
// Version information injected by ldflags.
var Version string
var BuildTime string
var GitCommit string
@@ -24,9 +25,13 @@ func main() {
server := flag.String("s", "", "server address (ip:port)")
token := flag.String("t", "", "auth token")
configPath := flag.String("c", "", "config file path")
dataDir := flag.String("data-dir", "", "client data directory")
clientName := flag.String("name", "", "client display name")
clientID := flag.String("id", "", "client id")
reconnectMin := flag.Int("reconnect-min", 0, "minimum reconnect delay in seconds")
reconnectMax := flag.Int("reconnect-max", 0, "maximum reconnect delay in seconds")
flag.Parse()
// 优先加载配置文件
var cfg *config.ClientConfig
if *configPath != "" {
var err error
@@ -38,26 +43,53 @@ func main() {
cfg = &config.ClientConfig{}
}
// 命令行参数覆盖配置文件
if *server != "" {
cfg.Server = *server
}
if *token != "" {
cfg.Token = *token
}
if *dataDir != "" {
cfg.DataDir = *dataDir
}
if *clientName != "" {
cfg.Name = *clientName
}
if *clientID != "" {
cfg.ClientID = *clientID
}
if *reconnectMin > 0 {
cfg.ReconnectMinSec = *reconnectMin
}
if *reconnectMax > 0 {
cfg.ReconnectMaxSec = *reconnectMax
}
if cfg.Server == "" || cfg.Token == "" {
log.Fatal("Usage: client [-c config.yaml] | [-s <server:port> -t <token>]")
}
client := tunnel.NewClient(cfg.Server, cfg.Token)
opts := tunnel.ClientOptions{
DataDir: cfg.DataDir,
ClientID: cfg.ClientID,
ClientName: cfg.Name,
}
if cfg.ReconnectMinSec > 0 {
opts.ReconnectDelay = time.Duration(cfg.ReconnectMinSec) * time.Second
}
if cfg.ReconnectMaxSec > 0 {
opts.ReconnectMaxDelay = time.Duration(cfg.ReconnectMaxSec) * time.Second
}
client := tunnel.NewClientWithOptions(cfg.Server, cfg.Token, opts)
// TLS 默认启用,默认跳过证书验证(类似 frp
if !cfg.NoTLS {
client.TLSEnabled = true
client.TLSConfig = crypto.ClientTLSConfig()
log.Printf("[Client] TLS enabled")
}
client.Run()
if err := client.Run(); err != nil {
log.Fatalf("Client stopped: %v", err)
}
}