@@ -29,6 +29,7 @@ func main() {
2929 cfgPath := flag .String ("config" , "" , "YAML config file path" )
3030 modeFlag := flag .String ("mode" , "" , "Component mode: proxy (default), agent, relay" )
3131 relayListenPort := flag .Int ("relay-listen-port" , 9000 , "Port for both Proxy registrations and Agent tunnels (relay mode)" )
32+ retryFlag := flag .Int ("retry" , 10 , "Maximum number of retries" )
3233 registerFlag := flag .Bool ("register" , false , "Proxy registers its availability to Relay server" )
3334 relayAddr := flag .String ("relay-addr" , "" , "Relay server address (IP:port) for registration or agent dialing" )
3435 flag .Parse ()
@@ -42,11 +43,6 @@ func main() {
4243 os .Exit (0 )
4344 }()
4445
45- // ensure shared secret is provided
46- if * secretFlag == "" {
47- logger .Fatal ("Shared secret required: use -secret flag or config" )
48- }
49-
5046 // Optional YAML config override
5147 if * cfgPath != "" {
5248 data , err := os .ReadFile (* cfgPath )
@@ -57,20 +53,52 @@ func main() {
5753 SocksListenAddr string `yaml:"socks_listen_addr"`
5854 TunnelListenPort int `yaml:"tunnel_listen_port"`
5955 TunnelAddr string `yaml:"tunnel_addr"`
56+ MaxRetries int `yaml:"max_retries"`
57+ Secret string `yaml:"secret"`
58+ RelayListenPort int `yaml:"relay_listen_port"`
59+ RelayAddr string `yaml:"relay_addr"`
6060 }
6161 if err := yaml .Unmarshal (data , & cfg ); err != nil {
6262 logger .Fatalf ("Failed to parse config: %v" , err )
6363 }
64- if cfg .SocksListenAddr != "" {
64+
65+ // Apply config values only if CLI flags are at their defaults
66+ if * socksAddr == "127.0.0.1:1080" && cfg .SocksListenAddr != "" {
6567 * socksAddr = cfg .SocksListenAddr
6668 }
67- if cfg .TunnelListenPort != 0 {
69+ if * tunnelPort == 9000 && cfg .TunnelListenPort != 0 {
6870 * tunnelPort = cfg .TunnelListenPort
6971 }
70- if cfg .TunnelAddr != "" {
72+ if * tunnelAddr == "" && cfg .TunnelAddr != "" {
7173 * tunnelAddr = cfg .TunnelAddr
7274 }
73- logger .Debug ("Loaded config from %s: socks_listen_addr=%s, tunnel_listen_port=%d, tunnel_addr=%s" , * cfgPath , cfg .SocksListenAddr , cfg .TunnelListenPort , cfg .TunnelAddr )
75+ if * secretFlag == "" && cfg .Secret != "" {
76+ * secretFlag = cfg .Secret
77+ }
78+ if * relayListenPort == 9000 && cfg .RelayListenPort != 0 {
79+ * relayListenPort = cfg .RelayListenPort
80+ }
81+ if * relayAddr == "" && cfg .RelayAddr != "" {
82+ * relayAddr = cfg .RelayAddr
83+ }
84+ if * retryFlag == 10 && cfg .MaxRetries != 0 {
85+ * retryFlag = cfg .MaxRetries
86+ }
87+
88+ logger .Debug ("Loaded config from %s: socks_listen_addr=%s, tunnel_listen_port=%d, tunnel_addr=%s, secret=%s, relay_listen_port=%d, relay_addr=%s, max_retries=%d" ,
89+ * cfgPath ,
90+ cfg .SocksListenAddr ,
91+ cfg .TunnelListenPort ,
92+ cfg .TunnelAddr ,
93+ cfg .Secret ,
94+ cfg .RelayListenPort ,
95+ cfg .RelayAddr ,
96+ cfg .MaxRetries )
97+ }
98+
99+ // ensure shared secret is provided
100+ if * secretFlag == "" {
101+ logger .Fatal ("Shared secret required: use -secret flag or config" )
74102 }
75103
76104 // validate tunnelAddr if provided
@@ -103,10 +131,10 @@ func main() {
103131 proxy .RunProxyRelay (* relayAddr , * socksAddr , * secretFlag )
104132 } else if * relayAddr != "" {
105133 // agent via relay
106- proxy .RunRelayAgent (* relayAddr , * secretFlag )
134+ proxy .RunAgentRelay (* relayAddr , * secretFlag , * retryFlag )
107135 } else if * tunnelAddr != "" {
108136 // direct agent
109- proxy .RunAgent (* tunnelAddr , * secretFlag )
137+ proxy .RunAgent (* tunnelAddr , * secretFlag , * retryFlag )
110138 } else {
111139 proxy .RunProxy (* socksAddr , * tunnelPort , * secretFlag )
112140 }
0 commit comments