Skip to content

Commit 6fe6be2

Browse files
committed
Further refactoring
1 parent 153aba4 commit 6fe6be2

File tree

15 files changed

+87
-188
lines changed

15 files changed

+87
-188
lines changed

cmd/gluetun/main.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -367,18 +367,18 @@ func _main(ctx context.Context, buildInfo models.BuildInformation,
367367
"port forwarding", goroutine.OptionTimeout(time.Second))
368368
go portForwardLooper.Run(portForwardCtx, portForwardDone)
369369

370-
unboundLogger := logger.New(log.SetComponent("dns over tls"))
371-
unboundLooper := dns.NewLoop(allSettings.DNS, httpClient,
372-
unboundLogger)
370+
dnsLogger := logger.New(log.SetComponent("dns"))
371+
dnsLooper := dns.NewLoop(allSettings.DNS, httpClient,
372+
dnsLogger)
373373
dnsHandler, dnsCtx, dnsDone := goshutdown.NewGoRoutineHandler(
374374
"dns", goroutine.OptionTimeout(defaultShutdownTimeout))
375-
// wait for unboundLooper.Restart or its ticker launched with RunRestartTicker
376-
go unboundLooper.Run(dnsCtx, dnsDone)
375+
// wait for dnsLooper.Restart or its ticker launched with RunRestartTicker
376+
go dnsLooper.Run(dnsCtx, dnsDone)
377377
otherGroupHandler.Add(dnsHandler)
378378

379379
dnsTickerHandler, dnsTickerCtx, dnsTickerDone := goshutdown.NewGoRoutineHandler(
380380
"dns ticker", goroutine.OptionTimeout(defaultShutdownTimeout))
381-
go unboundLooper.RunRestartTicker(dnsTickerCtx, dnsTickerDone)
381+
go dnsLooper.RunRestartTicker(dnsTickerCtx, dnsTickerDone)
382382
controlGroupHandler.Add(dnsTickerHandler)
383383

384384
ipFetcher := ipinfo.New(httpClient)
@@ -406,7 +406,7 @@ func _main(ctx context.Context, buildInfo models.BuildInformation,
406406
vpnLogger := logger.New(log.SetComponent("vpn"))
407407
vpnLooper := vpn.NewLoop(allSettings.VPN, ipv6Supported, allSettings.Firewall.VPNInputPorts,
408408
providers, storage, ovpnConf, netLinker, firewallConf, routingConf, portForwardLooper,
409-
cmder, publicIPLooper, unboundLooper, vpnLogger, httpClient,
409+
cmder, publicIPLooper, dnsLooper, vpnLogger, httpClient,
410410
buildInfo, *allSettings.Version.Enabled)
411411
vpnHandler, vpnCtx, vpnDone := goshutdown.NewGoRoutineHandler(
412412
"vpn", goroutine.OptionTimeout(time.Second))
@@ -446,7 +446,7 @@ func _main(ctx context.Context, buildInfo models.BuildInformation,
446446
"http server", goroutine.OptionTimeout(defaultShutdownTimeout))
447447
httpServer, err := server.New(httpServerCtx, controlServerAddress, controlServerLogging,
448448
logger.New(log.SetComponent("http server")),
449-
buildInfo, vpnLooper, portForwardLooper, unboundLooper, updaterLooper, publicIPLooper,
449+
buildInfo, vpnLooper, portForwardLooper, dnsLooper, updaterLooper, publicIPLooper,
450450
storage, ipv6Supported)
451451
if err != nil {
452452
return fmt.Errorf("setting up control server: %w", err)

internal/configuration/settings/dot.go

+49-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/gotree"
1012
)
@@ -15,14 +17,18 @@ type DoT struct {
1517
// and used. It defaults to true, and cannot be nil
1618
// in the internal state.
1719
Enabled *bool
18-
// UpdatePeriod is the period to update DNS block
19-
// lists and cryptographic files for DNSSEC validation.
20+
// UpdatePeriod is the period to update DNS block lists.
2021
// It can be set to 0 to disable the update.
2122
// It defaults to 24h and cannot be nil in
2223
// the internal state.
2324
UpdatePeriod *time.Duration
24-
// Unbound contains settings to configure Unbound.
25-
Unbound Unbound
25+
// Providers is a list of DNS over TLS providers
26+
Providers []string `json:"providers"`
27+
// Caching is true if the DoT server should cache
28+
// DNS responses.
29+
Caching *bool `json:"caching"`
30+
// IPv6 is true if the DoT server should connect over IPv6.
31+
IPv6 *bool `json:"ipv6"`
2632
// Blacklist contains settings to configure the filter
2733
// block lists.
2834
Blacklist DNSBlacklist
@@ -39,9 +45,11 @@ func (d DoT) validate() (err error) {
3945
ErrDoTUpdatePeriodTooShort, *d.UpdatePeriod, minUpdatePeriod)
4046
}
4147

42-
err = d.Unbound.validate()
43-
if err != nil {
44-
return err
48+
for _, s := range d.Providers {
49+
_, err := provider.Parse(s)
50+
if err != nil {
51+
return err
52+
}
4553
}
4654

4755
err = d.Blacklist.validate()
@@ -56,7 +64,9 @@ func (d *DoT) copy() (copied DoT) {
5664
return DoT{
5765
Enabled: gosettings.CopyPointer(d.Enabled),
5866
UpdatePeriod: gosettings.CopyPointer(d.UpdatePeriod),
59-
Unbound: d.Unbound.copy(),
67+
Providers: gosettings.CopySlice(d.Providers),
68+
Caching: gosettings.CopyPointer(d.Caching),
69+
IPv6: gosettings.CopyPointer(d.IPv6),
6070
Blacklist: d.Blacklist.copy(),
6171
}
6272
}
@@ -66,7 +76,9 @@ func (d *DoT) copy() (copied DoT) {
6676
func (d *DoT) mergeWith(other DoT) {
6777
d.Enabled = gosettings.MergeWithPointer(d.Enabled, other.Enabled)
6878
d.UpdatePeriod = gosettings.MergeWithPointer(d.UpdatePeriod, other.UpdatePeriod)
69-
d.Unbound.mergeWith(other.Unbound)
79+
d.Providers = gosettings.MergeWithSlice(d.Providers, other.Providers)
80+
d.Caching = gosettings.MergeWithPointer(d.Caching, other.Caching)
81+
d.IPv6 = gosettings.MergeWithPointer(d.IPv6, other.IPv6)
7082
d.Blacklist.mergeWith(other.Blacklist)
7183
}
7284

@@ -76,18 +88,36 @@ func (d *DoT) mergeWith(other DoT) {
7688
func (d *DoT) overrideWith(other DoT) {
7789
d.Enabled = gosettings.OverrideWithPointer(d.Enabled, other.Enabled)
7890
d.UpdatePeriod = gosettings.OverrideWithPointer(d.UpdatePeriod, other.UpdatePeriod)
79-
d.Unbound.overrideWith(other.Unbound)
91+
d.Providers = gosettings.OverrideWithSlice(d.Providers, other.Providers)
92+
d.Caching = gosettings.OverrideWithPointer(d.Caching, other.Caching)
93+
d.IPv6 = gosettings.OverrideWithPointer(d.IPv6, other.IPv6)
8094
d.Blacklist.overrideWith(other.Blacklist)
8195
}
8296

8397
func (d *DoT) setDefaults() {
8498
d.Enabled = gosettings.DefaultPointer(d.Enabled, true)
8599
const defaultUpdatePeriod = 24 * time.Hour
86100
d.UpdatePeriod = gosettings.DefaultPointer(d.UpdatePeriod, defaultUpdatePeriod)
87-
d.Unbound.setDefaults()
101+
d.Providers = gosettings.DefaultSlice(d.Providers, []string{
102+
provider.Cloudflare().Name,
103+
})
104+
d.Caching = gosettings.DefaultPointer(d.Caching, true)
105+
d.IPv6 = gosettings.DefaultPointer(d.IPv6, false)
88106
d.Blacklist.setDefaults()
89107
}
90108

109+
func (d DoT) GetFirstPlaintextIPv4() (ipv4 netip.Addr) {
110+
s := d.Providers[0]
111+
provider, err := provider.Parse(s)
112+
if err != nil {
113+
// Settings should be validated before calling this function,
114+
// so an error happening here is a programming error.
115+
panic(err)
116+
}
117+
118+
return provider.DNS.IPv4[0]
119+
}
120+
91121
func (d DoT) String() string {
92122
return d.toLinesNode().String()
93123
}
@@ -106,7 +136,14 @@ func (d DoT) toLinesNode() (node *gotree.Node) {
106136
}
107137
node.Appendf("Update period: %s", update)
108138

109-
node.AppendNode(d.Unbound.toLinesNode())
139+
authServers := node.Appendf("Authoritative servers:")
140+
for _, provider := range d.Providers {
141+
authServers.Appendf(provider)
142+
}
143+
144+
node.Appendf("Caching: %s", gosettings.BoolToYesNo(d.Caching))
145+
node.Appendf("IPv6: %s", gosettings.BoolToYesNo(d.IPv6))
146+
110147
node.AppendNode(d.Blacklist.toLinesNode())
111148

112149
return node

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

-90
This file was deleted.

internal/configuration/settings/unbound_test.go

-32
This file was deleted.

internal/configuration/sources/env/dot.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,14 @@ func (s *Source) readDoT() (dot settings.DoT, err error) {
1515
return dot, err
1616
}
1717

18-
dot.Unbound, err = s.readUnbound()
18+
dot.Providers = s.env.CSV("DOT_PROVIDERS")
19+
20+
dot.Caching, err = s.env.BoolPtr("DOT_CACHING")
21+
if err != nil {
22+
return dot, err
23+
}
24+
25+
dot.IPv6, err = s.env.BoolPtr("DOT_IPV6")
1926
if err != nil {
2027
return dot, err
2128
}

internal/configuration/sources/env/unbound.go

-21
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
@@ -21,13 +21,13 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) {
2121
}
2222

2323
for ctx.Err() == nil {
24-
// Upper scope variables for Unbound only
24+
// Upper scope variables for the DNS over TLS server only
2525
// Their values are to be used if DOT=off
2626
var runError <-chan error
2727

2828
for *l.GetSettings().DoT.Enabled {
2929
var err error
30-
runError, err = l.setupUnbound(ctx)
30+
runError, err = l.setupServer(ctx)
3131
if err == nil {
3232
l.backoffTime = defaultBackoffTime
3333
l.logger.Info("ready")

0 commit comments

Comments
 (0)