MCPcopy Create free account
hub / github.com/PasarGuard/node / syncUsersPartialReconcile

Method syncUsersPartialReconcile

backend/wireguard/user_partial_sync.go:22–72  ·  view source on GitHub ↗
(users []*common.User)

Source from the content-addressed store, hash-verified

20}
21
22func (wg *WireGuard) syncUsersPartialReconcile(users []*common.User) error {
23 normalizedUsers := normalizeUsers(users)
24 touchedEmails := make(map[string]struct{}, len(normalizedUsers))
25 for _, user := range normalizedUsers {
26 touchedEmails[user.GetEmail()] = struct{}{}
27 }
28
29 existingSubset := wg.buildExistingPeersSubsetForTouched(touchedEmails)
30
31 desiredPeers, err := wg.collectDesiredPeers(normalizedUsers)
32 if err != nil {
33 return err
34 }
35
36 currentOwners := wg.peerStore.GetEmailMap()
37 for key, desired := range desiredPeers {
38 currentOwner, exists := currentOwners[key]
39 if !exists || currentOwner == desired.Email {
40 continue
41 }
42 if _, touched := touchedEmails[currentOwner]; !touched {
43 return fmt.Errorf("wireguard public key %s is already assigned to user %s", key, currentOwner)
44 }
45 }
46
47 diff, err := wg.buildSyncDiff(existingSubset, desiredPeers)
48 if err != nil {
49 return err
50 }
51
52 if len(diff.PeerConfigs) > 0 {
53 wg.mu.RLock()
54 if err := wg.ensureRunningWithManagerLocked(); err != nil {
55 wg.mu.RUnlock()
56 return err
57 }
58 manager := wg.manager
59 wg.mu.RUnlock()
60
61 if err := manager.ApplyPeers(diff.PeerConfigs); err != nil {
62 return fmt.Errorf("failed to apply peer changes: %w", err)
63 }
64 }
65
66 removedKeys := wg.peerStore.ApplyChanges(diff.RemoveKeys, diff.UpsertPeers)
67 for _, key := range removedKeys {
68 wg.statsTracker.RemoveStats(key)
69 }
70
71 return nil
72}

Callers 3

SyncUserMethod · 0.95
UpdateUsersMethod · 0.95
UpdateUsersAndRestartMethod · 0.95

Calls 10

collectDesiredPeersMethod · 0.95
buildSyncDiffMethod · 0.95
normalizeUsersFunction · 0.85
GetEmailMapMethod · 0.80
ApplyPeersMethod · 0.80
ApplyChangesMethod · 0.80
RemoveStatsMethod · 0.80
GetEmailMethod · 0.65

Tested by

no test coverage detected