mirror of
https://github.com/netbirdio/netbird.git
synced 2024-12-04 05:53:18 +01:00
a78fd69f80
Added host configurators for Linux, Windows, and macOS. The host configurator will update the peer system configuration directing DNS queries according to its capabilities. Some Linux distributions don't support split (match) DNS or custom ports, and that will be reported to our management system in another PR
80 lines
1.7 KiB
Go
80 lines
1.7 KiB
Go
package dns
|
|
|
|
import (
|
|
"fmt"
|
|
nbdns "github.com/netbirdio/netbird/dns"
|
|
"strings"
|
|
)
|
|
|
|
type hostManager interface {
|
|
applyDNSConfig(config hostDNSConfig) error
|
|
restoreHostDNS() error
|
|
}
|
|
|
|
type hostDNSConfig struct {
|
|
domains []domainConfig
|
|
routeAll bool
|
|
serverIP string
|
|
serverPort int
|
|
}
|
|
|
|
type domainConfig struct {
|
|
domain string
|
|
matchOnly bool
|
|
}
|
|
|
|
type mockHostConfigurator struct {
|
|
applyDNSConfigFunc func(config hostDNSConfig) error
|
|
restoreHostDNSFunc func() error
|
|
}
|
|
|
|
func (m *mockHostConfigurator) applyDNSConfig(config hostDNSConfig) error {
|
|
if m.applyDNSConfigFunc != nil {
|
|
return m.applyDNSConfigFunc(config)
|
|
}
|
|
return fmt.Errorf("method applyDNSSettings is not implemented")
|
|
}
|
|
|
|
func (m *mockHostConfigurator) restoreHostDNS() error {
|
|
if m.restoreHostDNSFunc != nil {
|
|
return m.restoreHostDNSFunc()
|
|
}
|
|
return fmt.Errorf("method restoreHostDNS is not implemented")
|
|
}
|
|
|
|
func newNoopHostMocker() hostManager {
|
|
return &mockHostConfigurator{
|
|
applyDNSConfigFunc: func(config hostDNSConfig) error { return nil },
|
|
restoreHostDNSFunc: func() error { return nil },
|
|
}
|
|
}
|
|
|
|
func dnsConfigToHostDNSConfig(dnsConfig nbdns.Config, ip string, port int) hostDNSConfig {
|
|
config := hostDNSConfig{
|
|
routeAll: false,
|
|
serverIP: ip,
|
|
serverPort: port,
|
|
}
|
|
for _, nsConfig := range dnsConfig.NameServerGroups {
|
|
if nsConfig.Primary {
|
|
config.routeAll = true
|
|
}
|
|
|
|
for _, domain := range nsConfig.Domains {
|
|
config.domains = append(config.domains, domainConfig{
|
|
domain: strings.TrimSuffix(domain, "."),
|
|
matchOnly: true,
|
|
})
|
|
}
|
|
}
|
|
|
|
for _, customZone := range dnsConfig.CustomZones {
|
|
config.domains = append(config.domains, domainConfig{
|
|
domain: strings.TrimSuffix(customZone.Domain, "."),
|
|
matchOnly: false,
|
|
})
|
|
}
|
|
|
|
return config
|
|
}
|