mirror of
https://github.com/netbirdio/netbird.git
synced 2025-08-13 08:57:28 +02:00
always suffix ephemeral peer name (#4138)
This commit is contained in:
@ -236,11 +236,23 @@ func (am *DefaultAccountManager) UpdatePeer(ctx context.Context, accountID, user
|
|||||||
|
|
||||||
if peer.Name != update.Name {
|
if peer.Name != update.Name {
|
||||||
var newLabel string
|
var newLabel string
|
||||||
newLabel, err = getPeerIPDNSLabel(ctx, transaction, peer.IP, accountID, update.Name)
|
|
||||||
|
newLabel, err = nbdns.GetParsedDomainLabel(update.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to get free DNS label: %w", err)
|
newLabel = ""
|
||||||
|
} else {
|
||||||
|
_, err := transaction.GetPeerIdByLabel(ctx, store.LockingStrengthNone, accountID, update.Name)
|
||||||
|
if err == nil {
|
||||||
|
newLabel = ""
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if newLabel == "" {
|
||||||
|
newLabel, err = getPeerIPDNSLabel(peer.IP, update.Name)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to get free DNS label: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
peer.Name = update.Name
|
peer.Name = update.Name
|
||||||
peer.DNSLabel = newLabel
|
peer.DNSLabel = newLabel
|
||||||
peerLabelChanged = true
|
peerLabelChanged = true
|
||||||
@ -472,6 +484,7 @@ func (am *DefaultAccountManager) AddPeer(ctx context.Context, setupKey, userID s
|
|||||||
var groupsToAdd []string
|
var groupsToAdd []string
|
||||||
var allowExtraDNSLabels bool
|
var allowExtraDNSLabels bool
|
||||||
var accountID string
|
var accountID string
|
||||||
|
var isEphemeral bool
|
||||||
if addedByUser {
|
if addedByUser {
|
||||||
user, err := am.Store.GetUserByUserID(ctx, store.LockingStrengthNone, userID)
|
user, err := am.Store.GetUserByUserID(ctx, store.LockingStrengthNone, userID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -501,7 +514,7 @@ func (am *DefaultAccountManager) AddPeer(ctx context.Context, setupKey, userID s
|
|||||||
setupKeyName = sk.Name
|
setupKeyName = sk.Name
|
||||||
allowExtraDNSLabels = sk.AllowExtraDNSLabels
|
allowExtraDNSLabels = sk.AllowExtraDNSLabels
|
||||||
accountID = sk.AccountID
|
accountID = sk.AccountID
|
||||||
|
isEphemeral = sk.Ephemeral
|
||||||
if !sk.AllowExtraDNSLabels && len(peer.ExtraDNSLabels) > 0 {
|
if !sk.AllowExtraDNSLabels && len(peer.ExtraDNSLabels) > 0 {
|
||||||
return nil, nil, nil, status.Errorf(status.PreconditionFailed, "couldn't add peer: setup key doesn't allow extra DNS labels")
|
return nil, nil, nil, status.Errorf(status.PreconditionFailed, "couldn't add peer: setup key doesn't allow extra DNS labels")
|
||||||
}
|
}
|
||||||
@ -573,11 +586,17 @@ func (am *DefaultAccountManager) AddPeer(ctx context.Context, setupKey, userID s
|
|||||||
}
|
}
|
||||||
|
|
||||||
var freeLabel string
|
var freeLabel string
|
||||||
freeLabel, err = getPeerIPDNSLabel(ctx, am.Store, freeIP, accountID, peer.Meta.Hostname)
|
if isEphemeral || attempt > 1 {
|
||||||
if err != nil {
|
freeLabel, err = getPeerIPDNSLabel(freeIP, peer.Meta.Hostname)
|
||||||
return nil, nil, nil, fmt.Errorf("failed to get free DNS label: %w", err)
|
if err != nil {
|
||||||
|
return nil, nil, nil, fmt.Errorf("failed to get free DNS label: %w", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
freeLabel, err = nbdns.GetParsedDomainLabel(peer.Meta.Hostname)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, nil, fmt.Errorf("failed to get free DNS label: %w", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
newPeer.DNSLabel = freeLabel
|
newPeer.DNSLabel = freeLabel
|
||||||
newPeer.IP = freeIP
|
newPeer.IP = freeIP
|
||||||
|
|
||||||
@ -647,7 +666,7 @@ func (am *DefaultAccountManager) AddPeer(ctx context.Context, setupKey, userID s
|
|||||||
if isUniqueConstraintError(err) {
|
if isUniqueConstraintError(err) {
|
||||||
unlock()
|
unlock()
|
||||||
unlock = nil
|
unlock = nil
|
||||||
log.WithContext(ctx).Debugf("Failed to add peer in attempt %d, retrying: %v", attempt, err)
|
log.WithContext(ctx).WithFields(log.Fields{"dns_label": freeLabel, "ip": freeIP}).Tracef("Failed to add peer in attempt %d, retrying: %v", attempt, err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -681,7 +700,7 @@ func (am *DefaultAccountManager) AddPeer(ctx context.Context, setupKey, userID s
|
|||||||
return am.getValidatedPeerWithMap(ctx, false, accountID, newPeer)
|
return am.getValidatedPeerWithMap(ctx, false, accountID, newPeer)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getPeerIPDNSLabel(ctx context.Context, tx store.Store, ip net.IP, accountID, peerHostName string) (string, error) {
|
func getPeerIPDNSLabel(ip net.IP, peerHostName string) (string, error) {
|
||||||
ip = ip.To4()
|
ip = ip.To4()
|
||||||
|
|
||||||
dnsName, err := nbdns.GetParsedDomainLabel(peerHostName)
|
dnsName, err := nbdns.GetParsedDomainLabel(peerHostName)
|
||||||
@ -689,12 +708,6 @@ func getPeerIPDNSLabel(ctx context.Context, tx store.Store, ip net.IP, accountID
|
|||||||
return "", fmt.Errorf("failed to parse peer host name %s: %w", peerHostName, err)
|
return "", fmt.Errorf("failed to parse peer host name %s: %w", peerHostName, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = tx.GetPeerIdByLabel(ctx, store.LockingStrengthNone, accountID, dnsName)
|
|
||||||
if err != nil {
|
|
||||||
//nolint:nilerr
|
|
||||||
return dnsName, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return fmt.Sprintf("%s-%d-%d", dnsName, ip[2], ip[3]), nil
|
return fmt.Sprintf("%s-%d-%d", dnsName, ip[2], ip[3]), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user