Skip to content

Commit ecf1e90

Browse files
Merge branch 'main' into feat/auto-upgrade
2 parents 6025eb1 + 5113c70 commit ecf1e90

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+1476
-329
lines changed

client/cmd/login.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ func doForegroundLogin(ctx context.Context, cmd *cobra.Command, setupKey string,
227227
}
228228

229229
// update host's static platform and system information
230-
system.UpdateStaticInfo()
230+
system.UpdateStaticInfoAsync()
231231

232232
configFilePath, err := activeProf.FilePath()
233233
if err != nil {

client/cmd/service_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ func (p *program) Start(svc service.Service) error {
2727
log.Info("starting NetBird service") //nolint
2828

2929
// Collect static system and platform information
30-
system.UpdateStaticInfo()
30+
system.UpdateStaticInfoAsync()
3131

3232
// in any case, even if configuration does not exists we run daemon to serve CLI gRPC API.
3333
p.serv = grpc.NewServer()

client/cmd/testutil_test.go

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,29 +9,26 @@ import (
99
"github.com/golang/mock/gomock"
1010
"github.com/stretchr/testify/require"
1111
"go.opentelemetry.io/otel"
12+
"google.golang.org/grpc"
1213

14+
"github.com/netbirdio/management-integrations/integrations"
15+
clientProto "github.com/netbirdio/netbird/client/proto"
16+
client "github.com/netbirdio/netbird/client/server"
1317
"github.com/netbirdio/netbird/management/internals/server/config"
18+
mgmt "github.com/netbirdio/netbird/management/server"
1419
"github.com/netbirdio/netbird/management/server/activity"
1520
"github.com/netbirdio/netbird/management/server/groups"
1621
"github.com/netbirdio/netbird/management/server/integrations/port_forwarding"
22+
"github.com/netbirdio/netbird/management/server/peers"
1723
"github.com/netbirdio/netbird/management/server/permissions"
1824
"github.com/netbirdio/netbird/management/server/settings"
1925
"github.com/netbirdio/netbird/management/server/store"
2026
"github.com/netbirdio/netbird/management/server/telemetry"
2127
"github.com/netbirdio/netbird/management/server/types"
22-
23-
"github.com/netbirdio/netbird/util"
24-
25-
"google.golang.org/grpc"
26-
27-
"github.com/netbirdio/management-integrations/integrations"
28-
29-
clientProto "github.com/netbirdio/netbird/client/proto"
30-
client "github.com/netbirdio/netbird/client/server"
31-
mgmt "github.com/netbirdio/netbird/management/server"
3228
mgmtProto "github.com/netbirdio/netbird/shared/management/proto"
3329
sigProto "github.com/netbirdio/netbird/shared/signal/proto"
3430
sig "github.com/netbirdio/netbird/signal/server"
31+
"github.com/netbirdio/netbird/util"
3532
)
3633

3734
func startTestingServices(t *testing.T) string {
@@ -90,15 +87,20 @@ func startManagement(t *testing.T, config *config.Config, testFile string) (*grp
9087
if err != nil {
9188
return nil, nil
9289
}
93-
iv, _ := integrations.NewIntegratedValidator(context.Background(), eventStore)
9490

95-
metrics, err := telemetry.NewDefaultAppMetrics(context.Background())
96-
require.NoError(t, err)
9791
ctrl := gomock.NewController(t)
9892
t.Cleanup(ctrl.Finish)
9993

100-
settingsMockManager := settings.NewMockManager(ctrl)
10194
permissionsManagerMock := permissions.NewMockManager(ctrl)
95+
peersmanager := peers.NewManager(store, permissionsManagerMock)
96+
settingsManagerMock := settings.NewMockManager(ctrl)
97+
98+
iv, _ := integrations.NewIntegratedValidator(context.Background(), peersmanager, settingsManagerMock, eventStore)
99+
100+
metrics, err := telemetry.NewDefaultAppMetrics(context.Background())
101+
require.NoError(t, err)
102+
103+
settingsMockManager := settings.NewMockManager(ctrl)
102104
groupsManager := groups.NewManagerMock()
103105

104106
settingsMockManager.EXPECT().

client/internal/engine_test.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,13 @@ import (
1919
"github.com/stretchr/testify/assert"
2020
"github.com/stretchr/testify/require"
2121
"go.opentelemetry.io/otel"
22+
wgdevice "golang.zx2c4.com/wireguard/device"
23+
"golang.zx2c4.com/wireguard/tun/netstack"
2224
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
2325
"google.golang.org/grpc"
2426
"google.golang.org/grpc/keepalive"
2527

26-
wgdevice "golang.zx2c4.com/wireguard/device"
27-
"golang.zx2c4.com/wireguard/tun/netstack"
28-
2928
"github.com/netbirdio/management-integrations/integrations"
30-
"github.com/netbirdio/netbird/management/internals/server/config"
31-
"github.com/netbirdio/netbird/management/server/groups"
32-
3329
"github.com/netbirdio/netbird/client/iface"
3430
"github.com/netbirdio/netbird/client/iface/bind"
3531
"github.com/netbirdio/netbird/client/iface/configurer"
@@ -45,9 +41,12 @@ import (
4541
"github.com/netbirdio/netbird/client/ssh"
4642
"github.com/netbirdio/netbird/client/system"
4743
nbdns "github.com/netbirdio/netbird/dns"
44+
"github.com/netbirdio/netbird/management/internals/server/config"
4845
"github.com/netbirdio/netbird/management/server"
4946
"github.com/netbirdio/netbird/management/server/activity"
47+
"github.com/netbirdio/netbird/management/server/groups"
5048
"github.com/netbirdio/netbird/management/server/integrations/port_forwarding"
49+
"github.com/netbirdio/netbird/management/server/peers"
5150
"github.com/netbirdio/netbird/management/server/permissions"
5251
"github.com/netbirdio/netbird/management/server/settings"
5352
"github.com/netbirdio/netbird/management/server/store"
@@ -1555,7 +1554,11 @@ func startManagement(t *testing.T, dataDir, testFile string) (*grpc.Server, stri
15551554
if err != nil {
15561555
return nil, "", err
15571556
}
1558-
ia, _ := integrations.NewIntegratedValidator(context.Background(), eventStore)
1557+
1558+
permissionsManager := permissions.NewManager(store)
1559+
peersManager := peers.NewManager(store, permissionsManager)
1560+
1561+
ia, _ := integrations.NewIntegratedValidator(context.Background(), peersManager, nil, eventStore)
15591562

15601563
metrics, err := telemetry.NewDefaultAppMetrics(context.Background())
15611564
require.NoError(t, err)
@@ -1572,7 +1575,6 @@ func startManagement(t *testing.T, dataDir, testFile string) (*grpc.Server, stri
15721575
Return(&types.ExtraSettings{}, nil).
15731576
AnyTimes()
15741577

1575-
permissionsManager := permissions.NewManager(store)
15761578
groupsManager := groups.NewManagerMock()
15771579

15781580
accountManager, err := server.BuildManager(context.Background(), store, peersUpdateManager, nil, "", "netbird.selfhosted", eventStore, nil, false, ia, metrics, port_forwarding.NewControllerMock(), settingsMockManager, permissionsManager, false)

client/internal/peer/handshaker.go

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,21 +43,14 @@ type OfferAnswer struct {
4343
SessionID *ICESessionID
4444
}
4545

46-
func (oa *OfferAnswer) SessionIDString() string {
47-
if oa.SessionID == nil {
48-
return "unknown"
49-
}
50-
return oa.SessionID.String()
51-
}
52-
5346
type Handshaker struct {
5447
mu sync.Mutex
5548
log *log.Entry
5649
config ConnConfig
5750
signaler *Signaler
5851
ice *WorkerICE
5952
relay *WorkerRelay
60-
onNewOfferListeners []func(*OfferAnswer)
53+
onNewOfferListeners []*OfferListener
6154

6255
// remoteOffersCh is a channel used to wait for remote credentials to proceed with the connection
6356
remoteOffersCh chan OfferAnswer
@@ -78,7 +71,8 @@ func NewHandshaker(log *log.Entry, config ConnConfig, signaler *Signaler, ice *W
7871
}
7972

8073
func (h *Handshaker) AddOnNewOfferListener(offer func(remoteOfferAnswer *OfferAnswer)) {
81-
h.onNewOfferListeners = append(h.onNewOfferListeners, offer)
74+
l := NewOfferListener(offer)
75+
h.onNewOfferListeners = append(h.onNewOfferListeners, l)
8276
}
8377

8478
func (h *Handshaker) Listen(ctx context.Context) {
@@ -91,13 +85,13 @@ func (h *Handshaker) Listen(ctx context.Context) {
9185
continue
9286
}
9387
for _, listener := range h.onNewOfferListeners {
94-
listener(&remoteOfferAnswer)
88+
listener.Notify(&remoteOfferAnswer)
9589
}
9690
h.log.Infof("received offer, running version %s, remote WireGuard listen port %d, session id: %s", remoteOfferAnswer.Version, remoteOfferAnswer.WgListenPort, remoteOfferAnswer.SessionIDString())
9791
case remoteOfferAnswer := <-h.remoteAnswerCh:
9892
h.log.Infof("received answer, running version %s, remote WireGuard listen port %d, session id: %s", remoteOfferAnswer.Version, remoteOfferAnswer.WgListenPort, remoteOfferAnswer.SessionIDString())
9993
for _, listener := range h.onNewOfferListeners {
100-
listener(&remoteOfferAnswer)
94+
listener.Notify(&remoteOfferAnswer)
10195
}
10296
case <-ctx.Done():
10397
h.log.Infof("stop listening for remote offers and answers")
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package peer
2+
3+
import (
4+
"sync"
5+
)
6+
7+
type callbackFunc func(remoteOfferAnswer *OfferAnswer)
8+
9+
func (oa *OfferAnswer) SessionIDString() string {
10+
if oa.SessionID == nil {
11+
return "unknown"
12+
}
13+
return oa.SessionID.String()
14+
}
15+
16+
type OfferListener struct {
17+
fn callbackFunc
18+
running bool
19+
latest *OfferAnswer
20+
mu sync.Mutex
21+
}
22+
23+
func NewOfferListener(fn callbackFunc) *OfferListener {
24+
return &OfferListener{
25+
fn: fn,
26+
}
27+
}
28+
29+
func (o *OfferListener) Notify(remoteOfferAnswer *OfferAnswer) {
30+
o.mu.Lock()
31+
defer o.mu.Unlock()
32+
33+
// Store the latest offer
34+
o.latest = remoteOfferAnswer
35+
36+
// If already running, the running goroutine will pick up this latest value
37+
if o.running {
38+
return
39+
}
40+
41+
// Start processing
42+
o.running = true
43+
44+
// Process in a goroutine to avoid blocking the caller
45+
go func(remoteOfferAnswer *OfferAnswer) {
46+
for {
47+
o.fn(remoteOfferAnswer)
48+
49+
o.mu.Lock()
50+
if o.latest == nil {
51+
// No more work to do
52+
o.running = false
53+
o.mu.Unlock()
54+
return
55+
}
56+
remoteOfferAnswer = o.latest
57+
// Clear the latest to mark it as being processed
58+
o.latest = nil
59+
o.mu.Unlock()
60+
}
61+
}(remoteOfferAnswer)
62+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package peer
2+
3+
import (
4+
"testing"
5+
"time"
6+
)
7+
8+
func Test_newOfferListener(t *testing.T) {
9+
dummyOfferAnswer := &OfferAnswer{}
10+
runChan := make(chan struct{}, 10)
11+
12+
longRunningFn := func(remoteOfferAnswer *OfferAnswer) {
13+
time.Sleep(1 * time.Second)
14+
runChan <- struct{}{}
15+
}
16+
17+
hl := NewOfferListener(longRunningFn)
18+
19+
hl.Notify(dummyOfferAnswer)
20+
hl.Notify(dummyOfferAnswer)
21+
hl.Notify(dummyOfferAnswer)
22+
23+
// Wait for exactly 2 callbacks
24+
for i := 0; i < 2; i++ {
25+
select {
26+
case <-runChan:
27+
case <-time.After(3 * time.Second):
28+
t.Fatal("Timeout waiting for callback")
29+
}
30+
}
31+
32+
// Verify no additional callbacks happen
33+
select {
34+
case <-runChan:
35+
t.Fatal("Unexpected additional callback")
36+
case <-time.After(100 * time.Millisecond):
37+
t.Log("Correctly received exactly 2 callbacks")
38+
}
39+
}

client/internal/peer/worker_ice.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,6 @@ func (w *WorkerICE) OnNewOffer(remoteOfferAnswer *OfferAnswer) {
122122
w.log.Warnf("failed to close ICE agent: %s", err)
123123
}
124124
w.agent = nil
125-
// todo consider to switch to Relay connection while establishing a new ICE connection
126125
}
127126

128127
var preferredCandidateTypes []ice.CandidateType
@@ -410,7 +409,10 @@ func (w *WorkerICE) onConnectionStateChange(agent *icemaker.ThreadSafeAgent, dia
410409
case ice.ConnectionStateConnected:
411410
w.lastKnownState = ice.ConnectionStateConnected
412411
return
413-
case ice.ConnectionStateFailed, ice.ConnectionStateDisconnected:
412+
case ice.ConnectionStateFailed, ice.ConnectionStateDisconnected, ice.ConnectionStateClosed:
413+
// ice.ConnectionStateClosed happens when we recreate the agent. For the P2P to TURN switch important to
414+
// notify the conn.onICEStateDisconnected changes to update the current used priority
415+
414416
if w.lastKnownState == ice.ConnectionStateConnected {
415417
w.lastKnownState = ice.ConnectionStateDisconnected
416418
w.conn.onICEStateDisconnected()

client/internal/stdnet/stdnet.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func NewNetWithDiscover(iFaceDiscover ExternalIFaceDiscover, disallowList []stri
4040
if netstack.IsEnabled() {
4141
n.iFaceDiscover = pionDiscover{}
4242
} else {
43-
newMobileIFaceDiscover(iFaceDiscover)
43+
n.iFaceDiscover = newMobileIFaceDiscover(iFaceDiscover)
4444
}
4545
return n, n.UpdateInterfaces()
4646
}

client/server/server_test.go

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,24 @@ import (
1010
"time"
1111

1212
"github.com/golang/mock/gomock"
13-
"github.com/stretchr/testify/require"
14-
"go.opentelemetry.io/otel"
15-
16-
"github.com/netbirdio/management-integrations/integrations"
17-
"github.com/netbirdio/netbird/management/internals/server/config"
18-
"github.com/netbirdio/netbird/management/server/groups"
19-
2013
log "github.com/sirupsen/logrus"
2114
"github.com/stretchr/testify/assert"
15+
"github.com/stretchr/testify/require"
16+
"go.opentelemetry.io/otel"
2217
"google.golang.org/grpc"
2318
"google.golang.org/grpc/keepalive"
2419

20+
"github.com/netbirdio/management-integrations/integrations"
2521
"github.com/netbirdio/netbird/client/internal"
2622
"github.com/netbirdio/netbird/client/internal/peer"
2723
"github.com/netbirdio/netbird/client/internal/profilemanager"
2824
daemonProto "github.com/netbirdio/netbird/client/proto"
25+
"github.com/netbirdio/netbird/management/internals/server/config"
2926
"github.com/netbirdio/netbird/management/server"
3027
"github.com/netbirdio/netbird/management/server/activity"
28+
"github.com/netbirdio/netbird/management/server/groups"
3129
"github.com/netbirdio/netbird/management/server/integrations/port_forwarding"
30+
"github.com/netbirdio/netbird/management/server/peers"
3231
"github.com/netbirdio/netbird/management/server/permissions"
3332
"github.com/netbirdio/netbird/management/server/settings"
3433
"github.com/netbirdio/netbird/management/server/store"
@@ -294,15 +293,20 @@ func startManagement(t *testing.T, signalAddr string, counter *int) (*grpc.Serve
294293
if err != nil {
295294
return nil, "", err
296295
}
297-
ia, _ := integrations.NewIntegratedValidator(context.Background(), eventStore)
296+
297+
ctrl := gomock.NewController(t)
298+
t.Cleanup(ctrl.Finish)
299+
300+
permissionsManagerMock := permissions.NewMockManager(ctrl)
301+
peersManager := peers.NewManager(store, permissionsManagerMock)
302+
settingsManagerMock := settings.NewMockManager(ctrl)
303+
304+
ia, _ := integrations.NewIntegratedValidator(context.Background(), peersManager, settingsManagerMock, eventStore)
298305

299306
metrics, err := telemetry.NewDefaultAppMetrics(context.Background())
300307
require.NoError(t, err)
301308

302-
ctrl := gomock.NewController(t)
303-
t.Cleanup(ctrl.Finish)
304309
settingsMockManager := settings.NewMockManager(ctrl)
305-
permissionsManagerMock := permissions.NewMockManager(ctrl)
306310
groupsManager := groups.NewManagerMock()
307311

308312
accountManager, err := server.BuildManager(context.Background(), store, peersUpdateManager, nil, "", "netbird.selfhosted", eventStore, nil, false, ia, metrics, port_forwarding.NewControllerMock(), settingsMockManager, permissionsManagerMock, false)

0 commit comments

Comments
 (0)