mirror of
https://github.com/fosrl/newt.git
synced 2025-05-13 05:30:39 +01:00
Fix some port overlap problems
This commit is contained in:
parent
e99853422c
commit
49580f1a3c
2 changed files with 26 additions and 8 deletions
22
main.go
22
main.go
|
@ -297,6 +297,11 @@ persistent_keepalive_interval=5`, fixKey(fmt.Sprintf("%s", privateKey)), fixKey(
|
||||||
if len(wgData.Targets.UDP) > 0 {
|
if len(wgData.Targets.UDP) > 0 {
|
||||||
updateTargets(pm, "add", wgData.TunnelIP, "udp", TargetData{Targets: wgData.Targets.UDP})
|
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) {
|
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 {
|
if len(targetData.Targets) > 0 {
|
||||||
updateTargets(pm, "add", wgData.TunnelIP, "tcp", targetData)
|
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) {
|
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 {
|
if len(targetData.Targets) > 0 {
|
||||||
updateTargets(pm, "add", wgData.TunnelIP, "udp", targetData)
|
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) {
|
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
|
// Add the new target
|
||||||
pm.AddTarget(proto, tunnelIP, port, 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" {
|
} else if action == "remove" {
|
||||||
logger.Info("Removing target with port %d", port)
|
logger.Info("Removing target with port %d", port)
|
||||||
err := pm.RemoveTarget(proto, tunnelIP, port)
|
err := pm.RemoveTarget(proto, tunnelIP, port)
|
||||||
|
|
|
@ -22,6 +22,8 @@ func (pm *ProxyManager) AddTarget(protocol, listen string, port int, target stri
|
||||||
pm.Lock()
|
pm.Lock()
|
||||||
defer pm.Unlock()
|
defer pm.Unlock()
|
||||||
|
|
||||||
|
logger.Info("Adding target: %s://%s:%d -> %s", protocol, listen, port, target)
|
||||||
|
|
||||||
newTarget := ProxyTarget{
|
newTarget := ProxyTarget{
|
||||||
Protocol: protocol,
|
Protocol: protocol,
|
||||||
Listen: listen,
|
Listen: listen,
|
||||||
|
@ -99,12 +101,20 @@ func (pm *ProxyManager) Start() error {
|
||||||
for i := range pm.targets {
|
for i := range pm.targets {
|
||||||
target := &pm.targets[i]
|
target := &pm.targets[i]
|
||||||
|
|
||||||
// Skip already running targets
|
|
||||||
target.Lock()
|
target.Lock()
|
||||||
|
// If target is already running, skip it
|
||||||
if target.listener != nil || target.udpConn != nil {
|
if target.listener != nil || target.udpConn != nil {
|
||||||
target.Unlock()
|
target.Unlock()
|
||||||
continue
|
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()
|
target.Unlock()
|
||||||
|
|
||||||
switch strings.ToLower(target.Protocol) {
|
switch strings.ToLower(target.Protocol) {
|
||||||
|
|
Loading…
Reference in a new issue