diff --git a/main.go b/main.go index 6787ad5..c479923 100644 --- a/main.go +++ b/main.go @@ -297,6 +297,11 @@ persistent_keepalive_interval=5`, fixKey(fmt.Sprintf("%s", privateKey)), fixKey( if len(wgData.Targets.UDP) > 0 { updateTargets(pm, "add", wgData.TunnelIP, "udp", TargetData{Targets: wgData.Targets.UDP}) } + + err = pm.Start() + if err != nil { + logger.Error("Failed to start proxy manager: %v", err) + } }) client.RegisterHandler("newt/tcp/add", func(msg websocket.WSMessage) { @@ -317,6 +322,11 @@ persistent_keepalive_interval=5`, fixKey(fmt.Sprintf("%s", privateKey)), fixKey( if len(targetData.Targets) > 0 { updateTargets(pm, "add", wgData.TunnelIP, "tcp", targetData) } + + err = pm.Start() + if err != nil { + logger.Error("Failed to start proxy manager: %v", err) + } }) client.RegisterHandler("newt/udp/add", func(msg websocket.WSMessage) { @@ -337,6 +347,11 @@ persistent_keepalive_interval=5`, fixKey(fmt.Sprintf("%s", privateKey)), fixKey( if len(targetData.Targets) > 0 { updateTargets(pm, "add", wgData.TunnelIP, "udp", targetData) } + + err = pm.Start() + if err != nil { + logger.Error("Failed to start proxy manager: %v", err) + } }) client.RegisterHandler("newt/udp/remove", func(msg websocket.WSMessage) { @@ -456,13 +471,6 @@ func updateTargets(pm *proxy.ProxyManager, action string, tunnelIP string, proto // Add the new target pm.AddTarget(proto, tunnelIP, port, target) - // Start just this target by calling Start() on the proxy manager - // The Start() function is idempotent and will only start new targets - err = pm.Start() - if err != nil { - logger.Error("Failed to start proxy manager after adding target: %v", err) - return err - } } else if action == "remove" { logger.Info("Removing target with port %d", port) err := pm.RemoveTarget(proto, tunnelIP, port) diff --git a/proxy/manager.go b/proxy/manager.go index f5bfd70..3ebedb8 100644 --- a/proxy/manager.go +++ b/proxy/manager.go @@ -22,6 +22,8 @@ func (pm *ProxyManager) AddTarget(protocol, listen string, port int, target stri pm.Lock() defer pm.Unlock() + logger.Info("Adding target: %s://%s:%d -> %s", protocol, listen, port, target) + newTarget := ProxyTarget{ Protocol: protocol, Listen: listen, @@ -99,12 +101,20 @@ func (pm *ProxyManager) Start() error { for i := range pm.targets { target := &pm.targets[i] - // Skip already running targets target.Lock() + // If target is already running, skip it if target.listener != nil || target.udpConn != nil { target.Unlock() continue } + + // Mark the target as starting by creating a nil listener/connection + // This prevents other goroutines from trying to start it + if strings.ToLower(target.Protocol) == "tcp" { + target.listener = nil + } else { + target.udpConn = nil + } target.Unlock() switch strings.ToLower(target.Protocol) {