diff --git a/management/server/peer.go b/management/server/peer.go index 742ff7e8a..325f4c0f1 100644 --- a/management/server/peer.go +++ b/management/server/peer.go @@ -1043,8 +1043,8 @@ func (am *DefaultAccountManager) SyncPeer(ctx context.Context, sync types.PeerSy return nil, nil, nil, 0, err } - metaDiffAffectsPosture := posture.AffectsPosture(&metaDiff, resPostureChecks) - if isStatusChanged || sync.UpdateAccountPeers || ipv6CapabilityChanged || metaDiffAffectsPosture || metaDiff.VersionChanged || metaDiff.Hostname { + metaDiffAffectsPosture := posture.AffectsPosture(ctx, &metaDiff, resPostureChecks) + if requiresPeerUpdate(ctx, isStatusChanged, sync.UpdateAccountPeers, ipv6CapabilityChanged, metaDiffAffectsPosture, metaDiff.VersionChanged, metaDiff.Hostname) { changedPeerIDs := []string{peer.ID} affectedPeerIDs := am.syncPeerAffectedPeers(ctx, accountID, peer.ID, nmap, peerNotValid, metaDiffAffectsPosture) if err = am.networkMapController.OnPeersUpdated(ctx, accountID, changedPeerIDs, affectedPeerIDs); err != nil { @@ -1055,6 +1055,29 @@ func (am *DefaultAccountManager) SyncPeer(ctx context.Context, sync types.PeerSy return peer, nmap, resPostureChecks, dnsFwdPort, nil } +func requiresPeerUpdate(ctx context.Context, isStatusChanged, updateAccountPeers, ipv6CapabilityChanged, metaDiffAffectsPosture, versionChanged, hostname bool) bool { + reason := "" + switch { + case isStatusChanged: + reason = "status changed" + case updateAccountPeers: + reason = "update account peers" + case ipv6CapabilityChanged: + reason = "ipv6 capability changed" + case metaDiffAffectsPosture: + reason = "meta diff affects posture" + case versionChanged: + reason = "version changed" + case hostname: + reason = "hostname changed" + default: + return false + } + + log.WithContext(ctx).Tracef("peer update required: %s", reason) + return true +} + // syncPeerAffectedPeers resolves the peers affected by a SyncPeer change. The // peer's own validated network map is bidirectional for policy and routing // reachability, so when the peer stays valid and no source-posture gate is in diff --git a/management/server/posture/checks.go b/management/server/posture/checks.go index b1d49bf76..6087c3aa6 100644 --- a/management/server/posture/checks.go +++ b/management/server/posture/checks.go @@ -7,6 +7,7 @@ import ( "regexp" "github.com/hashicorp/go-version" + log "github.com/sirupsen/logrus" nbpeer "github.com/netbirdio/netbird/management/server/peer" "github.com/netbirdio/netbird/shared/management/http/api" @@ -56,29 +57,35 @@ type Checks struct { // alter the outcome of any of the given posture checks. It maps each check kind to // the metadata fields it inspects, so an unrelated change (e.g. a hostname update) // does not force a posture re-evaluation. -func AffectsPosture(diff *nbpeer.MetaDiff, checks []*Checks) bool { +func AffectsPosture(ctx context.Context, diff *nbpeer.MetaDiff, checks []*Checks) bool { if diff == nil { return false } for _, c := range checks { if c.Checks.ProcessCheck != nil && diff.Files { + log.WithContext(ctx).Tracef("posture check %s is affected by files change", c.Name) return true } if c.Checks.OSVersionCheck != nil && (diff.OSVersion || diff.OS || diff.KernelVersion) { + log.WithContext(ctx).Tracef("posture check %s is affected by OS version check", c.Name) return true } if c.Checks.NBVersionCheck != nil && diff.WtVersion { + log.WithContext(ctx).Tracef("posture check %s is affected by NB version change", c.Name) return true } if c.Checks.GeoLocationCheck != nil && diff.LocationChanged { + log.WithContext(ctx).Tracef("posture check %s is affected by location change", c.Name) return true } if c.Checks.PeerNetworkRangeCheck != nil && (diff.NetworkAddresses || diff.LocationChanged) { if diff.LocationChanged { + log.WithContext(ctx).Tracef("posture check %s is affected by location change", c.Name) return true } for _, r := range c.Checks.PeerNetworkRangeCheck.Ranges { if r.Addr().IsPrivate() { + log.WithContext(ctx).Tracef("posture check %s is affected by network address change", c.Name) return true } }