Fix/dns initialization (#954)

The systemd HostManagers require valid, initialized network interface
This commit is contained in:
Zoltan Papp 2023-06-15 12:25:18 +02:00 committed by GitHub
parent 042f124702
commit f1b38dbe80
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 37 additions and 25 deletions

View File

@ -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

View File

@ -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)

View File

@ -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")

View File

@ -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()