|
func (o *Olm) handleWgPeerUpdate(msg websocket.WSMessage) { |
|
logger.Debug("Received update-peer message: %v", msg.Data) |
|
|
|
// Check if tunnel is still running |
|
if !o.tunnelRunning { |
|
logger.Debug("Tunnel stopped, ignoring update-peer message") |
|
return |
|
} |
|
|
|
if o.peerManager == nil { |
|
logger.Debug("Ignoring update-peer message: peerManager is nil (shutdown in progress)") |
|
return |
|
} |
|
|
|
jsonData, err := json.Marshal(msg.Data) |
|
if err != nil { |
|
logger.Error("Error marshaling data: %v", err) |
|
return |
|
} |
|
|
|
var updateData peers.SiteConfig |
|
if err := json.Unmarshal(jsonData, &updateData); err != nil { |
|
logger.Error("Error unmarshaling update data: %v", err) |
|
return |
|
} |
|
|
|
// Get existing peer from PeerManager |
|
existingPeer, exists := o.peerManager.GetPeer(updateData.SiteId) |
|
if !exists { |
|
logger.Warn("Peer with site ID %d not found", updateData.SiteId) |
|
return |
|
} |
|
|
|
// Create updated site config by merging with existing data |
|
siteConfig := existingPeer |
|
|
|
if updateData.Endpoint != "" { |
|
siteConfig.Endpoint = updateData.Endpoint |
|
} |
|
if updateData.RelayEndpoint != "" { |
|
siteConfig.RelayEndpoint = updateData.RelayEndpoint |
|
} |
|
if updateData.PublicKey != "" { |
|
siteConfig.PublicKey = updateData.PublicKey |
|
} |
|
if updateData.ServerIP != "" { |
|
siteConfig.ServerIP = updateData.ServerIP |
|
} |
|
if updateData.ServerPort != 0 { |
|
siteConfig.ServerPort = updateData.ServerPort |
|
} |
|
if updateData.RemoteSubnets != nil { |
|
siteConfig.RemoteSubnets = updateData.RemoteSubnets |
|
} |
|
|
|
if err := o.peerManager.UpdatePeer(siteConfig); err != nil { |
|
logger.Error("Failed to update peer: %v", err) |
|
return |
|
} |
|
|
|
// If the endpoint changed, trigger holepunch to refresh NAT mappings |
|
if updateData.Endpoint != "" && updateData.Endpoint != existingPeer.Endpoint { |
|
logger.Info("Endpoint changed for site %d, triggering holepunch to refresh NAT mappings", updateData.SiteId) |
|
_ = o.holePunchManager.TriggerHolePunch() |
|
o.holePunchManager.ResetServerHolepunchInterval() |
|
} |
|
|
|
logger.Info("Successfully updated peer for site %d", updateData.SiteId) |
|
} |
In handleWgPeerUpdate
olm/olm/peer.go
Lines 117 to 185 in 703fe4f
we merge several mutable fields from peers.SiteConfig, but we never copy Aliases.
As a result, alias changes delivered via the update-peer websocket path never reach PeerManager.UpdatePeer(), even though UpdatePeer() already removes and re-adds alias DNS records when siteConfig.Aliases changes.
Expected:
Actual: