@@ -2,62 +2,28 @@ package settings
2
2
3
3
import (
4
4
"errors"
5
- "fmt"
6
5
"net/netip"
7
6
8
- "github.com/qdm12/dns/pkg/provider"
9
- "github.com/qdm12/dns/pkg/unbound"
7
+ "github.com/qdm12/dns/v2/pkg/provider"
10
8
"github.com/qdm12/gosettings"
11
9
"github.com/qdm12/gotree"
12
10
)
13
11
14
12
// Unbound is settings for the Unbound program.
15
13
type Unbound struct {
16
- Providers []string `json:"providers"`
17
- Caching * bool `json:"caching"`
18
- IPv6 * bool `json:"ipv6"`
19
- VerbosityLevel * uint8 `json:"verbosity_level"`
20
- VerbosityDetailsLevel * uint8 `json:"verbosity_details_level"`
21
- ValidationLogLevel * uint8 `json:"validation_log_level"`
22
- Username string `json:"username"`
23
- Allowed []netip.Prefix `json:"allowed"`
14
+ Providers []string `json:"providers"`
15
+ Caching * bool `json:"caching"`
16
+ IPv6 * bool `json:"ipv6"`
24
17
}
25
18
26
19
func (u * Unbound ) setDefaults () {
27
- if len (u .Providers ) == 0 {
28
- u .Providers = []string {
29
- provider .Cloudflare ().String (),
30
- }
31
- }
32
-
20
+ u .Providers = gosettings .DefaultSlice (u .Providers , []string {
21
+ provider .Cloudflare ().Name ,
22
+ })
33
23
u .Caching = gosettings .DefaultPointer (u .Caching , true )
34
24
u .IPv6 = gosettings .DefaultPointer (u .IPv6 , false )
35
-
36
- const defaultVerbosityLevel = 1
37
- u .VerbosityLevel = gosettings .DefaultPointer (u .VerbosityLevel , defaultVerbosityLevel )
38
-
39
- const defaultVerbosityDetailsLevel = 0
40
- u .VerbosityDetailsLevel = gosettings .DefaultPointer (u .VerbosityDetailsLevel , defaultVerbosityDetailsLevel )
41
-
42
- const defaultValidationLogLevel = 0
43
- u .ValidationLogLevel = gosettings .DefaultPointer (u .ValidationLogLevel , defaultValidationLogLevel )
44
-
45
- if u .Allowed == nil {
46
- u .Allowed = []netip.Prefix {
47
- netip .PrefixFrom (netip .AddrFrom4 ([4 ]byte {}), 0 ),
48
- netip .PrefixFrom (netip .AddrFrom16 ([16 ]byte {}), 0 ),
49
- }
50
- }
51
-
52
- u .Username = gosettings .DefaultString (u .Username , "root" )
53
25
}
54
26
55
- var (
56
- ErrUnboundVerbosityLevelNotValid = errors .New ("Unbound verbosity level is not valid" )
57
- ErrUnboundVerbosityDetailsLevelNotValid = errors .New ("Unbound verbosity details level is not valid" )
58
- ErrUnboundValidationLogLevelNotValid = errors .New ("Unbound validation log level is not valid" )
59
- )
60
-
61
27
func (u Unbound ) validate () (err error ) {
62
28
for _ , s := range u .Providers {
63
29
_ , err := provider .Parse (s )
@@ -66,120 +32,51 @@ func (u Unbound) validate() (err error) {
66
32
}
67
33
}
68
34
69
- const maxVerbosityLevel = 5
70
- if * u .VerbosityLevel > maxVerbosityLevel {
71
- return fmt .Errorf ("%w: %d must be between 0 and %d" ,
72
- ErrUnboundVerbosityLevelNotValid ,
73
- * u .VerbosityLevel ,
74
- maxVerbosityLevel )
75
- }
76
-
77
- const maxVerbosityDetailsLevel = 4
78
- if * u .VerbosityDetailsLevel > maxVerbosityDetailsLevel {
79
- return fmt .Errorf ("%w: %d must be between 0 and %d" ,
80
- ErrUnboundVerbosityDetailsLevelNotValid ,
81
- * u .VerbosityDetailsLevel ,
82
- maxVerbosityDetailsLevel )
83
- }
84
-
85
- const maxValidationLogLevel = 2
86
- if * u .ValidationLogLevel > maxValidationLogLevel {
87
- return fmt .Errorf ("%w: %d must be between 0 and %d" ,
88
- ErrUnboundValidationLogLevelNotValid ,
89
- * u .ValidationLogLevel , maxValidationLogLevel )
90
- }
91
-
92
35
return nil
93
36
}
94
37
95
38
func (u Unbound ) copy () (copied Unbound ) {
96
39
return Unbound {
97
- Providers : gosettings .CopySlice (u .Providers ),
98
- Caching : gosettings .CopyPointer (u .Caching ),
99
- IPv6 : gosettings .CopyPointer (u .IPv6 ),
100
- VerbosityLevel : gosettings .CopyPointer (u .VerbosityLevel ),
101
- VerbosityDetailsLevel : gosettings .CopyPointer (u .VerbosityDetailsLevel ),
102
- ValidationLogLevel : gosettings .CopyPointer (u .ValidationLogLevel ),
103
- Username : u .Username ,
104
- Allowed : gosettings .CopySlice (u .Allowed ),
40
+ Providers : gosettings .CopySlice (u .Providers ),
41
+ Caching : gosettings .CopyPointer (u .Caching ),
42
+ IPv6 : gosettings .CopyPointer (u .IPv6 ),
105
43
}
106
44
}
107
45
108
46
func (u * Unbound ) mergeWith (other Unbound ) {
109
47
u .Providers = gosettings .MergeWithSlice (u .Providers , other .Providers )
110
48
u .Caching = gosettings .MergeWithPointer (u .Caching , other .Caching )
111
49
u .IPv6 = gosettings .MergeWithPointer (u .IPv6 , other .IPv6 )
112
- u .VerbosityLevel = gosettings .MergeWithPointer (u .VerbosityLevel , other .VerbosityLevel )
113
- u .VerbosityDetailsLevel = gosettings .MergeWithPointer (u .VerbosityDetailsLevel , other .VerbosityDetailsLevel )
114
- u .ValidationLogLevel = gosettings .MergeWithPointer (u .ValidationLogLevel , other .ValidationLogLevel )
115
- u .Username = gosettings .MergeWithString (u .Username , other .Username )
116
- u .Allowed = gosettings .MergeWithSlice (u .Allowed , other .Allowed )
117
50
}
118
51
119
52
func (u * Unbound ) overrideWith (other Unbound ) {
120
53
u .Providers = gosettings .OverrideWithSlice (u .Providers , other .Providers )
121
54
u .Caching = gosettings .OverrideWithPointer (u .Caching , other .Caching )
122
55
u .IPv6 = gosettings .OverrideWithPointer (u .IPv6 , other .IPv6 )
123
- u .VerbosityLevel = gosettings .OverrideWithPointer (u .VerbosityLevel , other .VerbosityLevel )
124
- u .VerbosityDetailsLevel = gosettings .OverrideWithPointer (u .VerbosityDetailsLevel , other .VerbosityDetailsLevel )
125
- u .ValidationLogLevel = gosettings .OverrideWithPointer (u .ValidationLogLevel , other .ValidationLogLevel )
126
- u .Username = gosettings .OverrideWithString (u .Username , other .Username )
127
- u .Allowed = gosettings .OverrideWithSlice (u .Allowed , other .Allowed )
128
- }
129
-
130
- func (u Unbound ) ToUnboundFormat () (settings unbound.Settings , err error ) {
131
- providers := make ([]provider.Provider , len (u .Providers ))
132
- for i := range providers {
133
- providers [i ], err = provider .Parse (u .Providers [i ])
134
- if err != nil {
135
- return settings , err
136
- }
137
- }
138
-
139
- const port = 53
140
-
141
- return unbound.Settings {
142
- ListeningPort : port ,
143
- IPv4 : true ,
144
- Providers : providers ,
145
- Caching : * u .Caching ,
146
- IPv6 : * u .IPv6 ,
147
- VerbosityLevel : * u .VerbosityLevel ,
148
- VerbosityDetailsLevel : * u .VerbosityDetailsLevel ,
149
- ValidationLogLevel : * u .ValidationLogLevel ,
150
- AccessControl : unbound.AccessControlSettings {
151
- Allowed : netipPrefixesToNetaddrIPPrefixes (u .Allowed ),
152
- },
153
- Username : u .Username ,
154
- }, nil
155
56
}
156
57
157
58
var (
158
59
ErrConvertingNetip = errors .New ("converting net.IP to netip.Addr failed" )
159
60
)
160
61
161
- func (u Unbound ) GetFirstPlaintextIPv4 () (ipv4 netip.Addr , err error ) {
62
+ func (u Unbound ) GetFirstPlaintextIPv4 () (ipv4 netip.Addr ) {
162
63
s := u .Providers [0 ]
163
64
provider , err := provider .Parse (s )
164
65
if err != nil {
165
- return ipv4 , err
66
+ // Settings should be validated before calling this function,
67
+ // so an error happening here is a programming error.
68
+ panic (err )
166
69
}
167
70
168
- ip := provider .DNS ().IPv4 [0 ]
169
- ipv4 , ok := netip .AddrFromSlice (ip )
170
- if ! ok {
171
- return ipv4 , fmt .Errorf ("%w: for ip %s (%#v)" ,
172
- ErrConvertingNetip , ip , ip )
173
- }
174
- return ipv4 .Unmap (), nil
71
+ return provider .DNS .IPv4 [0 ]
175
72
}
176
73
177
74
func (u Unbound ) String () string {
178
75
return u .toLinesNode ().String ()
179
76
}
180
77
181
78
func (u Unbound ) toLinesNode () (node * gotree.Node ) {
182
- node = gotree .New ("Unbound settings:" )
79
+ node = gotree .New ("DNS over TLS settings:" )
183
80
184
81
authServers := node .Appendf ("Authoritative servers:" )
185
82
for _ , provider := range u .Providers {
@@ -188,15 +85,6 @@ func (u Unbound) toLinesNode() (node *gotree.Node) {
188
85
189
86
node .Appendf ("Caching: %s" , gosettings .BoolToYesNo (u .Caching ))
190
87
node .Appendf ("IPv6: %s" , gosettings .BoolToYesNo (u .IPv6 ))
191
- node .Appendf ("Verbosity level: %d" , * u .VerbosityLevel )
192
- node .Appendf ("Verbosity details level: %d" , * u .VerbosityDetailsLevel )
193
- node .Appendf ("Validation log level: %d" , * u .ValidationLogLevel )
194
- node .Appendf ("System user: %s" , u .Username )
195
-
196
- allowedNetworks := node .Appendf ("Allowed networks:" )
197
- for _ , network := range u .Allowed {
198
- allowedNetworks .Appendf (network .String ())
199
- }
200
88
201
89
return node
202
90
}
0 commit comments