From a9b4ecc8e304e9a352cd925d5951073c13d328de Mon Sep 17 00:00:00 2001 From: ehco1996 Date: Sat, 16 Apr 2022 17:07:00 +0800 Subject: [PATCH] ctl: fix some bugs Docs (or detailed usage help) needed #96 --- cmd/ehco/main.go | 24 ++++++++++-------------- internal/config/config.go | 17 +++++++++++++++-- internal/relay/relay.go | 37 ++++++++++++++++++++----------------- 3 files changed, 45 insertions(+), 33 deletions(-) diff --git a/cmd/ehco/main.go b/cmd/ehco/main.go index ba371d9c7..c63570e36 100644 --- a/cmd/ehco/main.go +++ b/cmd/ehco/main.go @@ -24,7 +24,7 @@ import ( var LocalAddr string var ListenType string -var RemoteAddr string +var TCPRemoteAddr string var UDPRemoteAddr string var TransportType string var ConfigPath string @@ -64,7 +64,6 @@ func createCliAPP() *cli.App { &cli.StringFlag{ Name: "l,local", Usage: "监听地址,例如 0.0.0.0:1234", - EnvVars: []string{"EHCO_LOCAL_ADDR"}, Destination: &LocalAddr, Required: true, }, @@ -72,53 +71,46 @@ func createCliAPP() *cli.App { Name: "lt,listen_type", Value: "raw", Usage: "监听类型,可选项有 raw,ws,wss,mwss", - EnvVars: []string{"EHCO_LISTEN_TYPE"}, Destination: &ListenType, Required: false, }, &cli.StringFlag{ Name: "r,remote", Usage: "TCP 转发地址,例如 0.0.0.0:5201,通过 ws 隧道转发时应为 ws://0.0.0.0:2443", - EnvVars: []string{"EHCO_REMOTE_ADDR"}, - Destination: &RemoteAddr, + Destination: &TCPRemoteAddr, }, &cli.StringFlag{ Name: "ur,udp_remote", Usage: "UDP 转发地址,例如 0.0.0.0:1234", - EnvVars: []string{"EHCO_UDP_REMOTE_ADDR"}, Destination: &UDPRemoteAddr, }, &cli.StringFlag{ Name: "tt,transport_type", Value: "raw", Usage: "传输类型,可选选有 raw,ws,wss,mwss", - EnvVars: []string{"EHCO_TRANSPORT_TYPE"}, Destination: &TransportType, Required: false, }, &cli.StringFlag{ Name: "c,config", - Usage: "配置文件地址", + Usage: "配置文件地址,支持文件类型或 http api", Destination: &ConfigPath, }, &cli.IntFlag{ Name: "web_port", Usage: "prometheus web expoter 的监听端口", - EnvVars: []string{"EHCO_WEB_PORT"}, Value: 0, Destination: &WebPort, }, &cli.BoolFlag{ Name: "enable_ping", Usage: "是否打开 ping metrics", - EnvVars: []string{"EHCO_ENABLE_PING"}, Value: true, Destination: &EnablePing, }, &cli.StringFlag{ Name: "web_token", - Usage: "访问web的token,如果访问不带着正确的token,会直接reset连接", - EnvVars: []string{"EHCO_WEB_TOKEN"}, + Usage: "如果访问webui时不带着正确的token,会直接reset连接", Destination: &WebToken, }, } @@ -164,11 +156,13 @@ func loadConfig() (cfg *config.Config, err error) { { Listen: LocalAddr, ListenType: ListenType, - TCPRemotes: []string{RemoteAddr}, TransportType: TransportType, }, }, } + if TCPRemoteAddr != "" { + cfg.RelayConfigs[0].TCPRemotes = []string{TCPRemoteAddr} + } if UDPRemoteAddr != "" { cfg.RelayConfigs[0].UDPRemotes = []string{UDPRemoteAddr} } @@ -337,5 +331,7 @@ func main() { // register start command app.Action = start // main thread start - logger.Fatal(app.Run(os.Args)) + if err := app.Run(os.Args); err != nil { + logger.Fatal(err) + } } diff --git a/internal/config/config.go b/internal/config/config.go index 71d1c8f11..a9a903800 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -2,6 +2,7 @@ package config import ( "encoding/json" + "errors" "fmt" "io/ioutil" "net/http" @@ -41,8 +42,20 @@ func (r *RelayConfig) Validate() error { return fmt.Errorf("invalid listen:%s", r.Listen) } - if len(r.TCPRemotes) == 0 { - return fmt.Errorf("invalid remote:%s", r.TCPRemotes) + for _, addr := range r.TCPRemotes { + if addr == "" { + return fmt.Errorf("invalid tcp remote addr:%s", addr) + } + } + + for _, addr := range r.UDPRemotes { + if addr == "" { + return fmt.Errorf("invalid udp remote addr:%s", addr) + } + } + + if len(r.TCPRemotes) == 0 && len(r.UDPRemotes) == 0 { + return errors.New("both tcp and udp remotes are empty") } return nil } diff --git a/internal/relay/relay.go b/internal/relay/relay.go index 90668cd4f..fdb69ea44 100644 --- a/internal/relay/relay.go +++ b/internal/relay/relay.go @@ -87,23 +87,26 @@ func (r *Relay) ListenAndServe() error { }) errCh := make(chan error) - switch r.ListenType { - case constant.Listen_RAW: - go func() { - errCh <- r.RunLocalTCPServer() - }() - case constant.Listen_WS: - go func() { - errCh <- r.RunLocalWSServer() - }() - case constant.Listen_WSS: - go func() { - errCh <- r.RunLocalWSSServer() - }() - case constant.Listen_MWSS: - go func() { - errCh <- r.RunLocalMWSSServer() - }() + + if len(r.cfg.TCPRemotes) > 0 { + switch r.ListenType { + case constant.Listen_RAW: + go func() { + errCh <- r.RunLocalTCPServer() + }() + case constant.Listen_WS: + go func() { + errCh <- r.RunLocalWSServer() + }() + case constant.Listen_WSS: + go func() { + errCh <- r.RunLocalWSSServer() + }() + case constant.Listen_MWSS: + go func() { + errCh <- r.RunLocalMWSSServer() + }() + } } if len(r.cfg.UDPRemotes) > 0 {