2021-07-23 18:55:53 +00:00
|
|
|
package dns
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"errors"
|
2021-11-18 08:12:07 +00:00
|
|
|
"fmt"
|
2021-07-23 18:55:53 +00:00
|
|
|
|
2024-08-21 14:35:41 +02:00
|
|
|
"github.com/qdm12/dns/v2/pkg/check"
|
|
|
|
|
"github.com/qdm12/dns/v2/pkg/dot"
|
|
|
|
|
"github.com/qdm12/dns/v2/pkg/nameserver"
|
2021-07-23 18:55:53 +00:00
|
|
|
)
|
|
|
|
|
|
2024-08-21 14:35:41 +02:00
|
|
|
var errUpdateBlockLists = errors.New("cannot update filter block lists")
|
2021-07-23 18:55:53 +00:00
|
|
|
|
2024-08-21 14:35:41 +02:00
|
|
|
func (l *Loop) setupServer(ctx context.Context) (runError <-chan error, err error) {
|
2021-07-23 18:55:53 +00:00
|
|
|
err = l.updateFiles(ctx)
|
|
|
|
|
if err != nil {
|
2024-08-21 14:35:41 +02:00
|
|
|
return nil, fmt.Errorf("%w: %w", errUpdateBlockLists, err)
|
2021-07-23 18:55:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
settings := l.GetSettings()
|
|
|
|
|
|
2024-08-21 14:35:41 +02:00
|
|
|
dotSettings, err := buildDoTSettings(settings, l.filter, l.logger)
|
2021-07-23 18:55:53 +00:00
|
|
|
if err != nil {
|
2024-08-21 14:35:41 +02:00
|
|
|
return nil, fmt.Errorf("building DoT settings: %w", err)
|
2021-07-23 18:55:53 +00:00
|
|
|
}
|
|
|
|
|
|
2024-08-21 14:35:41 +02:00
|
|
|
server, err := dot.NewServer(dotSettings)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, fmt.Errorf("creating DoT server: %w", err)
|
2021-07-23 18:55:53 +00:00
|
|
|
}
|
|
|
|
|
|
2024-08-21 14:35:41 +02:00
|
|
|
runError, err = server.Start()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, fmt.Errorf("starting server: %w", err)
|
|
|
|
|
}
|
|
|
|
|
l.server = server
|
|
|
|
|
|
|
|
|
|
// use internal DNS server
|
|
|
|
|
nameserver.UseDNSInternally(nameserver.SettingsInternalDNS{
|
|
|
|
|
IP: settings.ServerAddress,
|
|
|
|
|
})
|
|
|
|
|
err = nameserver.UseDNSSystemWide(nameserver.SettingsSystemDNS{
|
|
|
|
|
IP: settings.ServerAddress,
|
|
|
|
|
ResolvPath: l.resolvConf,
|
|
|
|
|
})
|
2021-07-23 18:55:53 +00:00
|
|
|
if err != nil {
|
|
|
|
|
l.logger.Error(err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-21 14:35:41 +02:00
|
|
|
err = check.WaitForDNS(ctx, check.Settings{})
|
|
|
|
|
if err != nil {
|
|
|
|
|
l.stopServer()
|
|
|
|
|
return nil, err
|
2021-07-23 18:55:53 +00:00
|
|
|
}
|
|
|
|
|
|
2024-08-21 14:35:41 +02:00
|
|
|
return runError, nil
|
2021-07-23 18:55:53 +00:00
|
|
|
}
|