mirror of
https://github.com/netbirdio/netbird.git
synced 2025-02-02 19:39:17 +01:00
Fix/dns initialization (#954)
The systemd HostManagers require valid, initialized network interface
This commit is contained in:
parent
042f124702
commit
f1b38dbe80
@ -7,16 +7,17 @@ import (
|
|||||||
|
|
||||||
// MockServer is the mock instance of a dns server
|
// MockServer is the mock instance of a dns server
|
||||||
type MockServer struct {
|
type MockServer struct {
|
||||||
StartFunc func()
|
InitializeFunc func() error
|
||||||
StopFunc func()
|
StopFunc func()
|
||||||
UpdateDNSServerFunc func(serial uint64, update nbdns.Config) error
|
UpdateDNSServerFunc func(serial uint64, update nbdns.Config) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start mock implementation of Start from Server interface
|
// Initialize mock implementation of Initialize from Server interface
|
||||||
func (m *MockServer) Start() {
|
func (m *MockServer) Initialize() error {
|
||||||
if m.StartFunc != nil {
|
if m.InitializeFunc != nil {
|
||||||
m.StartFunc()
|
return m.InitializeFunc()
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop mock implementation of Stop from Server interface
|
// Stop mock implementation of Stop from Server interface
|
||||||
|
@ -29,7 +29,7 @@ const (
|
|||||||
|
|
||||||
// Server is a dns server interface
|
// Server is a dns server interface
|
||||||
type Server interface {
|
type Server interface {
|
||||||
Start()
|
Initialize() error
|
||||||
Stop()
|
Stop()
|
||||||
DnsIP() string
|
DnsIP() string
|
||||||
UpdateDNSServer(serial uint64, update nbdns.Config) error
|
UpdateDNSServer(serial uint64, update nbdns.Config) error
|
||||||
@ -82,11 +82,6 @@ func NewDefaultServer(ctx context.Context, wgInterface *iface.WGIface, customAdd
|
|||||||
addrPort = &parsedAddrPort
|
addrPort = &parsedAddrPort
|
||||||
}
|
}
|
||||||
|
|
||||||
hostManager, err := newHostManager(wgInterface)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx, stop := context.WithCancel(ctx)
|
ctx, stop := context.WithCancel(ctx)
|
||||||
|
|
||||||
defaultServer := &DefaultServer{
|
defaultServer := &DefaultServer{
|
||||||
@ -104,7 +99,6 @@ func NewDefaultServer(ctx context.Context, wgInterface *iface.WGIface, customAdd
|
|||||||
},
|
},
|
||||||
wgInterface: wgInterface,
|
wgInterface: wgInterface,
|
||||||
customAddress: addrPort,
|
customAddress: addrPort,
|
||||||
hostManager: hostManager,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if initialDnsCfg != nil {
|
if initialDnsCfg != nil {
|
||||||
@ -115,8 +109,21 @@ func NewDefaultServer(ctx context.Context, wgInterface *iface.WGIface, customAdd
|
|||||||
return defaultServer, nil
|
return defaultServer, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start runs the listener in a go routine
|
// Initialize instantiate host manager. It required to be initialized wginterface
|
||||||
func (s *DefaultServer) Start() {
|
func (s *DefaultServer) Initialize() (err error) {
|
||||||
|
s.mux.Lock()
|
||||||
|
defer s.mux.Unlock()
|
||||||
|
|
||||||
|
if s.hostManager != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
s.hostManager, err = newHostManager(s.wgInterface)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// listen runs the listener in a go routine
|
||||||
|
func (s *DefaultServer) listen() {
|
||||||
// nil check required in unit tests
|
// nil check required in unit tests
|
||||||
if s.wgInterface != nil && s.wgInterface.IsUserspaceBind() {
|
if s.wgInterface != nil && s.wgInterface.IsUserspaceBind() {
|
||||||
s.fakeResolverWG.Add(1)
|
s.fakeResolverWG.Add(1)
|
||||||
@ -231,6 +238,10 @@ func (s *DefaultServer) UpdateDNSServer(serial uint64, update nbdns.Config) erro
|
|||||||
s.mux.Lock()
|
s.mux.Lock()
|
||||||
defer s.mux.Unlock()
|
defer s.mux.Unlock()
|
||||||
|
|
||||||
|
if s.hostManager == nil {
|
||||||
|
return fmt.Errorf("dns service is not initialized yet")
|
||||||
|
}
|
||||||
|
|
||||||
hash, err := hashstructure.Hash(update, hashstructure.FormatV2, &hashstructure.HashOptions{
|
hash, err := hashstructure.Hash(update, hashstructure.FormatV2, &hashstructure.HashOptions{
|
||||||
ZeroNil: true,
|
ZeroNil: true,
|
||||||
IgnoreZeroValue: true,
|
IgnoreZeroValue: true,
|
||||||
@ -270,7 +281,7 @@ func (s *DefaultServer) applyConfiguration(update nbdns.Config) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if !s.listenerIsRunning {
|
} else if !s.listenerIsRunning {
|
||||||
s.Start()
|
s.listen()
|
||||||
}
|
}
|
||||||
|
|
||||||
localMuxUpdates, localRecords, err := s.buildLocalHandlerUpdate(update.CustomZones)
|
localMuxUpdates, localRecords, err := s.buildLocalHandlerUpdate(update.CustomZones)
|
||||||
|
@ -225,6 +225,10 @@ func TestUpdateDNSServer(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
err = dnsServer.Initialize()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
defer func() {
|
defer func() {
|
||||||
err = dnsServer.hostManager.restoreHostDNS()
|
err = dnsServer.hostManager.restoreHostDNS()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -291,7 +295,7 @@ func TestDNSServerStartStop(t *testing.T) {
|
|||||||
dnsServer := getDefaultServerWithNoHostManager(t, testCase.addrPort)
|
dnsServer := getDefaultServerWithNoHostManager(t, testCase.addrPort)
|
||||||
|
|
||||||
dnsServer.hostManager = newNoopHostMocker()
|
dnsServer.hostManager = newNoopHostMocker()
|
||||||
dnsServer.Start()
|
dnsServer.listen()
|
||||||
time.Sleep(100 * time.Millisecond)
|
time.Sleep(100 * time.Millisecond)
|
||||||
if !dnsServer.listenerIsRunning {
|
if !dnsServer.listenerIsRunning {
|
||||||
t.Fatal("dns server listener is not running")
|
t.Fatal("dns server listener is not running")
|
||||||
|
@ -199,7 +199,7 @@ func (e *Engine) Start() error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if e.dnsServer == nil && runtime.GOOS == "android" {
|
if e.dnsServer == nil {
|
||||||
// todo fix custom address
|
// todo fix custom address
|
||||||
dnsServer, err := dns.NewDefaultServer(e.ctx, e.wgInterface, e.config.CustomDNSAddress, dnsCfg)
|
dnsServer, err := dns.NewDefaultServer(e.ctx, e.wgInterface, e.config.CustomDNSAddress, dnsCfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -259,14 +259,10 @@ func (e *Engine) Start() error {
|
|||||||
e.acl = acl
|
e.acl = acl
|
||||||
}
|
}
|
||||||
|
|
||||||
if e.dnsServer == nil && runtime.GOOS != "android" {
|
err = e.dnsServer.Initialize()
|
||||||
// todo fix custom address
|
if err != nil {
|
||||||
dnsServer, err := dns.NewDefaultServer(e.ctx, e.wgInterface, e.config.CustomDNSAddress, dnsCfg)
|
e.close()
|
||||||
if err != nil {
|
return err
|
||||||
e.close()
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
e.dnsServer = dnsServer
|
|
||||||
}
|
}
|
||||||
|
|
||||||
e.receiveSignalEvents()
|
e.receiveSignalEvents()
|
||||||
|
Loading…
Reference in New Issue
Block a user