This commit is contained in:
Carlos Hernandez 2025-10-24 15:56:52 +02:00 committed by GitHub
commit b82aa2c2cf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 33 additions and 16 deletions

View File

@ -25,7 +25,7 @@ type hostManager interface {
type SystemDNSSettings struct {
Domains []string
ServerIP netip.Addr
ServerIPs []netip.Addr
ServerPort int
}

View File

@ -85,9 +85,10 @@ func (s *systemConfigurator) applyDNSConfig(config HostDNSConfig, stateManager *
searchDomains = append(searchDomains, strings.TrimSuffix(""+dConf.Domain, "."))
}
configServerIPs := []netip.Addr{config.ServerIP}
matchKey := getKeyWithInput(netbirdDNSStateKeyFormat, matchSuffix)
if len(matchDomains) != 0 {
err = s.addMatchDomains(matchKey, strings.Join(matchDomains, " "), config.ServerIP, config.ServerPort)
err = s.addMatchDomains(matchKey, strings.Join(matchDomains, " "), configServerIPs, config.ServerPort)
} else {
log.Infof("removing match domains from the system")
err = s.removeKeyFromSystemConfig(matchKey)
@ -98,7 +99,7 @@ func (s *systemConfigurator) applyDNSConfig(config HostDNSConfig, stateManager *
searchKey := getKeyWithInput(netbirdDNSStateKeyFormat, searchSuffix)
if len(searchDomains) != 0 {
err = s.addSearchDomains(searchKey, strings.Join(searchDomains, " "), config.ServerIP, config.ServerPort)
err = s.addSearchDomains(searchKey, strings.Join(searchDomains, " "), configServerIPs, config.ServerPort)
} else {
log.Infof("removing search domains from the system")
err = s.removeKeyFromSystemConfig(searchKey)
@ -165,15 +166,15 @@ func (s *systemConfigurator) removeKeyFromSystemConfig(key string) error {
}
func (s *systemConfigurator) addLocalDNS() error {
if !s.systemDNSSettings.ServerIP.IsValid() || len(s.systemDNSSettings.Domains) == 0 {
if len(s.systemDNSSettings.ServerIPs) == 0 || len(s.systemDNSSettings.Domains) == 0 {
if err := s.recordSystemDNSSettings(true); err != nil {
log.Errorf("Unable to get system DNS configuration")
return fmt.Errorf("recordSystemDNSSettings(): %w", err)
}
}
localKey := getKeyWithInput(netbirdDNSStateKeyFormat, localSuffix)
if s.systemDNSSettings.ServerIP.IsValid() && len(s.systemDNSSettings.Domains) != 0 {
err := s.addSearchDomains(localKey, strings.Join(s.systemDNSSettings.Domains, " "), s.systemDNSSettings.ServerIP, s.systemDNSSettings.ServerPort)
if len(s.systemDNSSettings.Domains) != 0 {
err := s.addSearchDomains(localKey, strings.Join(s.systemDNSSettings.Domains, " "), s.systemDNSSettings.ServerIPs, s.systemDNSSettings.ServerPort)
if err != nil {
return fmt.Errorf("couldn't add local network DNS conf: %w", err)
}
@ -185,7 +186,7 @@ func (s *systemConfigurator) addLocalDNS() error {
}
func (s *systemConfigurator) recordSystemDNSSettings(force bool) error {
if s.systemDNSSettings.ServerIP.IsValid() && len(s.systemDNSSettings.Domains) != 0 && !force {
if len(s.systemDNSSettings.ServerIPs) >= 1 && len(s.systemDNSSettings.Domains) != 0 && !force {
return nil
}
@ -213,6 +214,7 @@ func (s *systemConfigurator) getSystemDNSSettings() (SystemDNSSettings, error) {
}
var dnsSettings SystemDNSSettings
localDomains := make(map[string]struct{})
inSearchDomainsArray := false
inServerAddressesArray := false
@ -222,7 +224,8 @@ func (s *systemConfigurator) getSystemDNSSettings() (SystemDNSSettings, error) {
switch {
case strings.HasPrefix(line, "DomainName :"):
domainName := strings.TrimSpace(strings.Split(line, ":")[1])
dnsSettings.Domains = append(dnsSettings.Domains, domainName)
localDomains[domainName] = struct{}{}
case line == "SearchDomains : <array> {":
inSearchDomainsArray = true
continue
@ -236,11 +239,13 @@ func (s *systemConfigurator) getSystemDNSSettings() (SystemDNSSettings, error) {
if inSearchDomainsArray {
searchDomain := strings.Split(line, " : ")[1]
dnsSettings.Domains = append(dnsSettings.Domains, searchDomain)
localDomains[searchDomain] = struct{}{}
} else if inServerAddressesArray {
address := strings.Split(line, " : ")[1]
if ip, err := netip.ParseAddr(address); err == nil && ip.Is4() {
dnsSettings.ServerIP = ip.Unmap()
if ip.IsValid() {
dnsSettings.ServerIPs = append(dnsSettings.ServerIPs, ip.Unmap())
}
inServerAddressesArray = false // Stop reading after finding the first IPv4 address
}
}
@ -250,14 +255,19 @@ func (s *systemConfigurator) getSystemDNSSettings() (SystemDNSSettings, error) {
return dnsSettings, err
}
dnsSettings.Domains = make([]string, 0, len(localDomains))
for k := range localDomains {
dnsSettings.Domains = append(dnsSettings.Domains, k)
}
// default to 53 port
dnsSettings.ServerPort = DefaultPort
return dnsSettings, nil
}
func (s *systemConfigurator) addSearchDomains(key, domains string, ip netip.Addr, port int) error {
err := s.addDNSState(key, domains, ip, port, true)
func (s *systemConfigurator) addSearchDomains(key, domains string, ips []netip.Addr, port int) error {
err := s.addDNSState(key, domains, ips, port, true)
if err != nil {
return fmt.Errorf("add dns state: %w", err)
}
@ -269,8 +279,8 @@ func (s *systemConfigurator) addSearchDomains(key, domains string, ip netip.Addr
return nil
}
func (s *systemConfigurator) addMatchDomains(key, domains string, dnsServer netip.Addr, port int) error {
err := s.addDNSState(key, domains, dnsServer, port, false)
func (s *systemConfigurator) addMatchDomains(key, domains string, dnsServers []netip.Addr, port int) error {
err := s.addDNSState(key, domains, dnsServers, port, false)
if err != nil {
return fmt.Errorf("add dns state: %w", err)
}
@ -282,14 +292,21 @@ func (s *systemConfigurator) addMatchDomains(key, domains string, dnsServer neti
return nil
}
func (s *systemConfigurator) addDNSState(state, domains string, dnsServer netip.Addr, port int, enableSearch bool) error {
func (s *systemConfigurator) addDNSState(state, domains string, dnsServers []netip.Addr, port int, enableSearch bool) error {
noSearch := "1"
if enableSearch {
noSearch = "0"
}
var serversBuilder strings.Builder
for _, serverIP := range dnsServers {
serversBuilder.WriteString(serverIP.String())
serversBuilder.WriteString(" ")
}
serversStr := serversBuilder.String()
lines := buildAddCommandLine(keySupplementalMatchDomains, arraySymbol+domains)
lines += buildAddCommandLine(keySupplementalMatchDomainsNoSearch, digitSymbol+noSearch)
lines += buildAddCommandLine(keyServerAddresses, arraySymbol+dnsServer.String())
lines += buildAddCommandLine(keyServerAddresses, arraySymbol+serversStr)
lines += buildAddCommandLine(keyServerPort, digitSymbol+strconv.Itoa(port))
addDomainCommand := buildCreateStateWithOperation(state, lines)