mirror of
https://github.com/juanfont/headscale.git
synced 2025-08-14 13:51:01 +02:00
relog
This commit is contained in:
parent
49acf689e7
commit
3ec9ce9f33
@ -1069,7 +1069,25 @@ func (s *State) HandleNodeFromAuthPath(
|
|||||||
node.NodeKey = nodeToRegister.NodeKey
|
node.NodeKey = nodeToRegister.NodeKey
|
||||||
node.DiscoKey = nodeToRegister.DiscoKey
|
node.DiscoKey = nodeToRegister.DiscoKey
|
||||||
node.Hostname = nodeToRegister.Hostname
|
node.Hostname = nodeToRegister.Hostname
|
||||||
|
|
||||||
|
// Preserve NetInfo from existing node to maintain DERP connectivity during relogin
|
||||||
|
// Registration requests typically don't include NetInfo with PreferredDERP,
|
||||||
|
// but we need to preserve it to avoid nodes appearing as disconnected
|
||||||
|
if nodeToRegister.Hostinfo != nil && node.Hostinfo != nil &&
|
||||||
|
nodeToRegister.Hostinfo.NetInfo == nil && node.Hostinfo.NetInfo != nil {
|
||||||
|
log.Debug().
|
||||||
|
Uint64("node.id", node.ID.Uint64()).
|
||||||
|
Int("preferredDERP", node.Hostinfo.NetInfo.PreferredDERP).
|
||||||
|
Msg("preserving NetInfo during node re-registration")
|
||||||
|
|
||||||
|
// Create a copy of the new Hostinfo and preserve the existing NetInfo
|
||||||
|
newHostinfo := *nodeToRegister.Hostinfo
|
||||||
|
newHostinfo.NetInfo = node.Hostinfo.NetInfo
|
||||||
|
node.Hostinfo = &newHostinfo
|
||||||
|
} else {
|
||||||
node.Hostinfo = nodeToRegister.Hostinfo
|
node.Hostinfo = nodeToRegister.Hostinfo
|
||||||
|
}
|
||||||
|
|
||||||
node.Endpoints = nodeToRegister.Endpoints
|
node.Endpoints = nodeToRegister.Endpoints
|
||||||
node.RegisterMethod = nodeToRegister.RegisterMethod
|
node.RegisterMethod = nodeToRegister.RegisterMethod
|
||||||
}
|
}
|
||||||
@ -1159,8 +1177,25 @@ func (s *State) HandleNodeFromPreAuthKey(
|
|||||||
}
|
}
|
||||||
// Update machine key if it changed
|
// Update machine key if it changed
|
||||||
node.MachineKey = machineKey
|
node.MachineKey = machineKey
|
||||||
// Update hostinfo
|
|
||||||
|
// Preserve NetInfo from existing node to maintain DERP connectivity during relogin
|
||||||
|
// Registration requests typically don't include NetInfo with PreferredDERP,
|
||||||
|
// but we need to preserve it to avoid nodes appearing as disconnected
|
||||||
|
if regReq.Hostinfo != nil && node.Hostinfo != nil &&
|
||||||
|
regReq.Hostinfo.NetInfo == nil && node.Hostinfo.NetInfo != nil {
|
||||||
|
log.Debug().
|
||||||
|
Uint64("node.id", node.ID.Uint64()).
|
||||||
|
Int("preferredDERP", node.Hostinfo.NetInfo.PreferredDERP).
|
||||||
|
Msg("preserving NetInfo during pre-auth key re-registration")
|
||||||
|
|
||||||
|
// Create a copy of the new Hostinfo and preserve the existing NetInfo
|
||||||
|
newHostinfo := *regReq.Hostinfo
|
||||||
|
newHostinfo.NetInfo = node.Hostinfo.NetInfo
|
||||||
|
node.Hostinfo = &newHostinfo
|
||||||
|
} else {
|
||||||
node.Hostinfo = regReq.Hostinfo
|
node.Hostinfo = regReq.Hostinfo
|
||||||
|
}
|
||||||
|
|
||||||
// Node is re-registering, so it's coming online
|
// Node is re-registering, so it's coming online
|
||||||
node.IsOnline = ptr.To(true)
|
node.IsOnline = ptr.To(true)
|
||||||
node.LastSeen = ptr.To(time.Now())
|
node.LastSeen = ptr.To(time.Now())
|
||||||
@ -1257,7 +1292,25 @@ func (s *State) HandleNodeFromPreAuthKey(
|
|||||||
updateFunc := func(node *types.Node) {
|
updateFunc := func(node *types.Node) {
|
||||||
node.NodeKey = nodeToRegister.NodeKey
|
node.NodeKey = nodeToRegister.NodeKey
|
||||||
node.Hostname = nodeToRegister.Hostname
|
node.Hostname = nodeToRegister.Hostname
|
||||||
|
|
||||||
|
// Preserve NetInfo from existing node to maintain DERP connectivity during relogin
|
||||||
|
// Registration requests typically don't include NetInfo with PreferredDERP,
|
||||||
|
// but we need to preserve it to avoid nodes appearing as disconnected
|
||||||
|
if nodeToRegister.Hostinfo != nil && node.Hostinfo != nil &&
|
||||||
|
nodeToRegister.Hostinfo.NetInfo == nil && node.Hostinfo.NetInfo != nil {
|
||||||
|
log.Debug().
|
||||||
|
Uint64("node.id", node.ID.Uint64()).
|
||||||
|
Int("preferredDERP", node.Hostinfo.NetInfo.PreferredDERP).
|
||||||
|
Msg("preserving NetInfo during pre-auth key node registration")
|
||||||
|
|
||||||
|
// Create a copy of the new Hostinfo and preserve the existing NetInfo
|
||||||
|
newHostinfo := *nodeToRegister.Hostinfo
|
||||||
|
newHostinfo.NetInfo = node.Hostinfo.NetInfo
|
||||||
|
node.Hostinfo = &newHostinfo
|
||||||
|
} else {
|
||||||
node.Hostinfo = nodeToRegister.Hostinfo
|
node.Hostinfo = nodeToRegister.Hostinfo
|
||||||
|
}
|
||||||
|
|
||||||
node.Endpoints = nodeToRegister.Endpoints
|
node.Endpoints = nodeToRegister.Endpoints
|
||||||
node.RegisterMethod = nodeToRegister.RegisterMethod
|
node.RegisterMethod = nodeToRegister.RegisterMethod
|
||||||
node.ForcedTags = nodeToRegister.ForcedTags
|
node.ForcedTags = nodeToRegister.ForcedTags
|
||||||
@ -1468,12 +1521,22 @@ func (s *State) UpdateNodeFromMapRequest(id types.NodeID, req tailcfg.MapRequest
|
|||||||
// before we take the changes.
|
// before we take the changes.
|
||||||
// Preserve NetInfo only if the existing node actually has valid NetInfo
|
// Preserve NetInfo only if the existing node actually has valid NetInfo
|
||||||
// This prevents copying nil NetInfo which would lose DERP relay assignments
|
// This prevents copying nil NetInfo which would lose DERP relay assignments
|
||||||
if req.Hostinfo.NetInfo == nil && currentNode.Hostinfo != nil && currentNode.Hostinfo.NetInfo != nil {
|
if req.Hostinfo != nil && req.Hostinfo.NetInfo == nil && currentNode.Hostinfo != nil && currentNode.Hostinfo.NetInfo != nil {
|
||||||
log.Debug().
|
log.Debug().
|
||||||
Uint64("node.id", id.Uint64()).
|
Uint64("node.id", id.Uint64()).
|
||||||
Int("preferredDERP", currentNode.Hostinfo.NetInfo.PreferredDERP).
|
Int("preferredDERP", currentNode.Hostinfo.NetInfo.PreferredDERP).
|
||||||
Msg("preserving NetInfo from previous Hostinfo")
|
Msg("preserving NetInfo from previous Hostinfo in MapRequest")
|
||||||
req.Hostinfo.NetInfo = currentNode.Hostinfo.NetInfo
|
req.Hostinfo.NetInfo = currentNode.Hostinfo.NetInfo
|
||||||
|
} else if req.Hostinfo == nil && currentNode.Hostinfo != nil && currentNode.Hostinfo.NetInfo != nil {
|
||||||
|
// When MapRequest has no Hostinfo but we have existing NetInfo, create a minimal
|
||||||
|
// Hostinfo to preserve the NetInfo to maintain DERP connectivity
|
||||||
|
log.Debug().
|
||||||
|
Uint64("node.id", id.Uint64()).
|
||||||
|
Int("preferredDERP", currentNode.Hostinfo.NetInfo.PreferredDERP).
|
||||||
|
Msg("creating minimal Hostinfo to preserve NetInfo in MapRequest")
|
||||||
|
req.Hostinfo = &tailcfg.Hostinfo{
|
||||||
|
NetInfo: currentNode.Hostinfo.NetInfo,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
currentNode.Hostinfo = req.Hostinfo
|
currentNode.Hostinfo = req.Hostinfo
|
||||||
currentNode.ApplyHostnameFromHostInfo(req.Hostinfo)
|
currentNode.ApplyHostnameFromHostInfo(req.Hostinfo)
|
||||||
@ -1672,20 +1735,29 @@ func (s *State) registerOrUpdateNode(helper nodeRegistrationHelper) (*types.Node
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Get the updated node from NodeStore to save to database
|
||||||
|
// This ensures any changes made by updateExistingNode (like preserving NetInfo)
|
||||||
|
// are persisted to the database
|
||||||
|
updatedNodeView, exists := s.nodeStore.GetNode(existingNode.ID)
|
||||||
|
if !exists || !updatedNodeView.Valid() {
|
||||||
|
return nil, fmt.Errorf("failed to get updated node from NodeStore after update")
|
||||||
|
}
|
||||||
|
nodeToSave := updatedNodeView.AsStruct()
|
||||||
|
|
||||||
// Save to database
|
// Save to database
|
||||||
savedNode, err = hsdb.Write(s.db.DB, func(tx *gorm.DB) (*types.Node, error) {
|
savedNode, err = hsdb.Write(s.db.DB, func(tx *gorm.DB) (*types.Node, error) {
|
||||||
if err := tx.Save(helper.node).Error; err != nil {
|
if err := tx.Save(nodeToSave).Error; err != nil {
|
||||||
return nil, fmt.Errorf("failed to save node: %w", err)
|
return nil, fmt.Errorf("failed to save node: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run post-save callback if provided
|
// Run post-save callback if provided
|
||||||
if helper.postSaveCallback != nil {
|
if helper.postSaveCallback != nil {
|
||||||
if err := helper.postSaveCallback(tx, helper.node); err != nil {
|
if err := helper.postSaveCallback(tx, nodeToSave); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return helper.node, nil
|
return nodeToSave, nil
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
Loading…
Reference in New Issue
Block a user