Skip to content

Commit eda44d7

Browse files
committed
Further refactoring
1 parent bf46129 commit eda44d7

File tree

13 files changed

+83
-176
lines changed

13 files changed

+83
-176
lines changed

cmd/gluetun/main.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -382,22 +382,22 @@ func _main(ctx context.Context, buildInfo models.BuildInformation,
382382
return fmt.Errorf("starting port forwarding loop: %w", err)
383383
}
384384

385-
unboundLogger := logger.New(log.SetComponent("dns"))
386-
unboundLooper, err := dns.NewLoop(allSettings.DNS, httpClient,
387-
unboundLogger)
385+
dnsLogger := logger.New(log.SetComponent("dns"))
386+
dnsLooper, err := dns.NewLoop(allSettings.DNS, httpClient,
387+
dnsLogger)
388388
if err != nil {
389389
return fmt.Errorf("creating DNS loop: %w", err)
390390
}
391391

392392
dnsHandler, dnsCtx, dnsDone := goshutdown.NewGoRoutineHandler(
393393
"dns", goroutine.OptionTimeout(defaultShutdownTimeout))
394-
// wait for unboundLooper.Restart or its ticker launched with RunRestartTicker
395-
go unboundLooper.Run(dnsCtx, dnsDone)
394+
// wait for dnsLooper.Restart or its ticker launched with RunRestartTicker
395+
go dnsLooper.Run(dnsCtx, dnsDone)
396396
otherGroupHandler.Add(dnsHandler)
397397

398398
dnsTickerHandler, dnsTickerCtx, dnsTickerDone := goshutdown.NewGoRoutineHandler(
399399
"dns ticker", goroutine.OptionTimeout(defaultShutdownTimeout))
400-
go unboundLooper.RunRestartTicker(dnsTickerCtx, dnsTickerDone)
400+
go dnsLooper.RunRestartTicker(dnsTickerCtx, dnsTickerDone)
401401
controlGroupHandler.Add(dnsTickerHandler)
402402

403403
publicipAPI, _ := pubipapi.ParseProvider(allSettings.PublicIP.API)
@@ -424,7 +424,7 @@ func _main(ctx context.Context, buildInfo models.BuildInformation,
424424
vpnLogger := logger.New(log.SetComponent("vpn"))
425425
vpnLooper := vpn.NewLoop(allSettings.VPN, ipv6Supported, allSettings.Firewall.VPNInputPorts,
426426
providers, storage, ovpnConf, netLinker, firewallConf, routingConf, portForwardLooper,
427-
cmder, publicIPLooper, unboundLooper, vpnLogger, httpClient,
427+
cmder, publicIPLooper, dnsLooper, vpnLogger, httpClient,
428428
buildInfo, *allSettings.Version.Enabled)
429429
vpnHandler, vpnCtx, vpnDone := goshutdown.NewGoRoutineHandler(
430430
"vpn", goroutine.OptionTimeout(time.Second))
@@ -464,7 +464,7 @@ func _main(ctx context.Context, buildInfo models.BuildInformation,
464464
"http server", goroutine.OptionTimeout(defaultShutdownTimeout))
465465
httpServer, err := server.New(httpServerCtx, controlServerAddress, controlServerLogging,
466466
logger.New(log.SetComponent("http server")),
467-
buildInfo, vpnLooper, portForwardLooper, unboundLooper, updaterLooper, publicIPLooper,
467+
buildInfo, vpnLooper, portForwardLooper, dnsLooper, updaterLooper, publicIPLooper,
468468
storage, ipv6Supported)
469469
if err != nil {
470470
return fmt.Errorf("setting up control server: %w", err)

internal/configuration/settings/dot.go

+55-12
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ package settings
33
import (
44
"errors"
55
"fmt"
6+
"net/netip"
67
"time"
78

9+
"github.com/qdm12/dns/v2/pkg/provider"
810
"github.com/qdm12/gosettings"
911
"github.com/qdm12/gosettings/reader"
1012
"github.com/qdm12/gotree"
@@ -16,14 +18,18 @@ type DoT struct {
1618
// and used. It defaults to true, and cannot be nil
1719
// in the internal state.
1820
Enabled *bool
19-
// UpdatePeriod is the period to update DNS block
20-
// lists and cryptographic files for DNSSEC validation.
21+
// UpdatePeriod is the period to update DNS block lists.
2122
// It can be set to 0 to disable the update.
2223
// It defaults to 24h and cannot be nil in
2324
// the internal state.
2425
UpdatePeriod *time.Duration
25-
// Unbound contains settings to configure Unbound.
26-
Unbound Unbound
26+
// Providers is a list of DNS over TLS providers
27+
Providers []string `json:"providers"`
28+
// Caching is true if the DoT server should cache
29+
// DNS responses.
30+
Caching *bool `json:"caching"`
31+
// IPv6 is true if the DoT server should connect over IPv6.
32+
IPv6 *bool `json:"ipv6"`
2733
// Blacklist contains settings to configure the filter
2834
// block lists.
2935
Blacklist DNSBlacklist
@@ -40,9 +46,12 @@ func (d DoT) validate() (err error) {
4046
ErrDoTUpdatePeriodTooShort, *d.UpdatePeriod, minUpdatePeriod)
4147
}
4248

43-
err = d.Unbound.validate()
44-
if err != nil {
45-
return err
49+
providers := provider.NewProviders()
50+
for _, providerName := range d.Providers {
51+
_, err := providers.Get(providerName)
52+
if err != nil {
53+
return err
54+
}
4655
}
4756

4857
err = d.Blacklist.validate()
@@ -57,7 +66,9 @@ func (d *DoT) copy() (copied DoT) {
5766
return DoT{
5867
Enabled: gosettings.CopyPointer(d.Enabled),
5968
UpdatePeriod: gosettings.CopyPointer(d.UpdatePeriod),
60-
Unbound: d.Unbound.copy(),
69+
Providers: gosettings.CopySlice(d.Providers),
70+
Caching: gosettings.CopyPointer(d.Caching),
71+
IPv6: gosettings.CopyPointer(d.IPv6),
6172
Blacklist: d.Blacklist.copy(),
6273
}
6374
}
@@ -68,18 +79,36 @@ func (d *DoT) copy() (copied DoT) {
6879
func (d *DoT) overrideWith(other DoT) {
6980
d.Enabled = gosettings.OverrideWithPointer(d.Enabled, other.Enabled)
7081
d.UpdatePeriod = gosettings.OverrideWithPointer(d.UpdatePeriod, other.UpdatePeriod)
71-
d.Unbound.overrideWith(other.Unbound)
82+
d.Providers = gosettings.OverrideWithSlice(d.Providers, other.Providers)
83+
d.Caching = gosettings.OverrideWithPointer(d.Caching, other.Caching)
84+
d.IPv6 = gosettings.OverrideWithPointer(d.IPv6, other.IPv6)
7285
d.Blacklist.overrideWith(other.Blacklist)
7386
}
7487

7588
func (d *DoT) setDefaults() {
7689
d.Enabled = gosettings.DefaultPointer(d.Enabled, true)
7790
const defaultUpdatePeriod = 24 * time.Hour
7891
d.UpdatePeriod = gosettings.DefaultPointer(d.UpdatePeriod, defaultUpdatePeriod)
79-
d.Unbound.setDefaults()
92+
d.Providers = gosettings.DefaultSlice(d.Providers, []string{
93+
provider.Cloudflare().Name,
94+
})
95+
d.Caching = gosettings.DefaultPointer(d.Caching, true)
96+
d.IPv6 = gosettings.DefaultPointer(d.IPv6, false)
8097
d.Blacklist.setDefaults()
8198
}
8299

100+
func (d DoT) GetFirstPlaintextIPv4() (ipv4 netip.Addr) {
101+
providers := provider.NewProviders()
102+
provider, err := providers.Get(d.Providers[0])
103+
if err != nil {
104+
// Settings should be validated before calling this function,
105+
// so an error happening here is a programming error.
106+
panic(err)
107+
}
108+
109+
return provider.DoT.IPv4[0].Addr()
110+
}
111+
83112
func (d DoT) String() string {
84113
return d.toLinesNode().String()
85114
}
@@ -98,7 +127,14 @@ func (d DoT) toLinesNode() (node *gotree.Node) {
98127
}
99128
node.Appendf("Update period: %s", update)
100129

101-
node.AppendNode(d.Unbound.toLinesNode())
130+
authServers := node.Appendf("Authoritative servers:")
131+
for _, provider := range d.Providers {
132+
authServers.Appendf(provider)
133+
}
134+
135+
node.Appendf("Caching: %s", gosettings.BoolToYesNo(d.Caching))
136+
node.Appendf("IPv6: %s", gosettings.BoolToYesNo(d.IPv6))
137+
102138
node.AppendNode(d.Blacklist.toLinesNode())
103139

104140
return node
@@ -115,7 +151,14 @@ func (d *DoT) read(reader *reader.Reader) (err error) {
115151
return err
116152
}
117153

118-
err = d.Unbound.read(reader)
154+
d.Providers = reader.CSV("DOT_PROVIDERS")
155+
156+
d.Caching, err = reader.BoolPtr("DOT_CACHING")
157+
if err != nil {
158+
return err
159+
}
160+
161+
d.IPv6, err = reader.BoolPtr("DOT_IPV6")
119162
if err != nil {
120163
return err
121164
}

internal/configuration/settings/settings_test.go

+4-5
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,10 @@ func Test_Settings_String(t *testing.T) {
4343
| └── DNS over TLS settings:
4444
| ├── Enabled: yes
4545
| ├── Update period: every 24h0m0s
46-
| ├── DNS over TLS settings:
47-
| | ├── Authoritative servers:
48-
| | | └── Cloudflare
49-
| | ├── Caching: yes
50-
| | └── IPv6: no
46+
| ├── Authoritative servers:
47+
| | └── Cloudflare
48+
| ├── Caching: yes
49+
| ├── IPv6: no
5150
| └── DNS filtering settings:
5251
| ├── Block malicious: yes
5352
| ├── Block ads: no

internal/configuration/settings/unbound.go

-102
This file was deleted.

internal/configuration/settings/unbound_test.go

-32
This file was deleted.

internal/dns/plaintext.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ func (l *Loop) useUnencryptedDNS(fallback bool) {
1717
if settings.ServerAddress.Compare(netip.AddrFrom4([4]byte{127, 0, 0, 1})) != 0 {
1818
targetIP = settings.ServerAddress
1919
} else {
20-
targetIP = settings.DoT.Unbound.GetFirstPlaintextIPv4()
20+
targetIP = settings.DoT.GetFirstPlaintextIPv4()
2121
}
2222

2323
if fallback {

internal/dns/run.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) {
2626
}
2727

2828
for ctx.Err() == nil {
29-
// Upper scope variables for Unbound only
29+
// Upper scope variables for the DNS over TLS server only
3030
// Their values are to be used if DOT=off
3131
var runError <-chan error
3232

3333
settings := l.GetSettings()
3434
for !*settings.KeepNameserver && *settings.DoT.Enabled {
3535
var err error
36-
runError, err = l.setupUnbound(ctx)
36+
runError, err = l.setupServer(ctx)
3737
if err == nil {
3838
l.backoffTime = defaultBackoffTime
3939
l.logger.Info("ready")

internal/dns/settings.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ func buildDoTSettings(settings settings.DNS,
2525
dotSettings dot.ServerSettings, err error) {
2626
var middlewares []dot.Middleware
2727

28-
if *settings.DoT.Unbound.Caching {
28+
if *settings.DoT.Caching {
2929
lruCache, err := lru.New(lru.Settings{})
3030
if err != nil {
3131
return dot.ServerSettings{}, fmt.Errorf("creating LRU cache: %w", err)
@@ -48,17 +48,17 @@ func buildDoTSettings(settings settings.DNS,
4848
middlewares = append(middlewares, filterMiddleware)
4949

5050
providersData := provider.NewProviders()
51-
providers := make([]provider.Provider, len(settings.DoT.Unbound.Providers))
52-
for i := range settings.DoT.Unbound.Providers {
51+
providers := make([]provider.Provider, len(settings.DoT.Providers))
52+
for i := range settings.DoT.Providers {
5353
var err error
54-
providers[i], err = providersData.Get(settings.DoT.Unbound.Providers[i])
54+
providers[i], err = providersData.Get(settings.DoT.Providers[i])
5555
if err != nil {
5656
panic(err) // this should already had been checked
5757
}
5858
}
5959

6060
ipVersion := "ipv4"
61-
if *settings.DoT.Unbound.IPv6 {
61+
if *settings.DoT.IPv6 {
6262
ipVersion = "ipv6"
6363
}
6464
return dot.ServerSettings{

0 commit comments

Comments
 (0)