mirror of
https://github.com/netbirdio/netbird.git
synced 2024-11-27 02:24:30 +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
76 lines
1.8 KiB
Go
76 lines
1.8 KiB
Go
package dns
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"github.com/netbirdio/netbird/iface"
|
|
log "github.com/sirupsen/logrus"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
defaultResolvConfPath = "/etc/resolv.conf"
|
|
)
|
|
|
|
const (
|
|
netbirdManager osManagerType = iota
|
|
fileManager
|
|
networkManager
|
|
systemdManager
|
|
resolvConfManager
|
|
)
|
|
|
|
type osManagerType int
|
|
|
|
func newHostManager(wgInterface *iface.WGIface) (hostManager, error) {
|
|
osManager, err := getOSDNSManagerType()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
log.Debugf("discovered mode is: %d", osManager)
|
|
switch osManager {
|
|
case networkManager:
|
|
return newNetworkManagerDbusConfigurator(wgInterface)
|
|
case systemdManager:
|
|
return newSystemdDbusConfigurator(wgInterface)
|
|
default:
|
|
return newFileConfigurator()
|
|
}
|
|
}
|
|
|
|
func getOSDNSManagerType() (osManagerType, error) {
|
|
|
|
file, err := os.Open(defaultResolvConfPath)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("unable to open %s for checking owner, got error: %s", defaultResolvConfPath, err)
|
|
}
|
|
defer file.Close()
|
|
|
|
scanner := bufio.NewScanner(file)
|
|
for scanner.Scan() {
|
|
text := scanner.Text()
|
|
if len(text) == 0 {
|
|
continue
|
|
}
|
|
if text[0] != '#' {
|
|
return fileManager, nil
|
|
}
|
|
if strings.Contains(text, fileGeneratedResolvConfContentHeader) {
|
|
return netbirdManager, nil
|
|
}
|
|
if strings.Contains(text, "NetworkManager") && isDbusListenerRunning(networkManagerDest, networkManagerDbusObjectNode) && isNetworkManagerSupported() {
|
|
log.Debugf("is nm running on supported v? %t", isNetworkManagerSupportedVersion())
|
|
return networkManager, nil
|
|
}
|
|
if strings.Contains(text, "systemd-resolved") && isDbusListenerRunning(systemdResolvedDest, systemdDbusObjectNode) {
|
|
return systemdManager, nil
|
|
}
|
|
if strings.Contains(text, "resolvconf") {
|
|
return resolvConfManager, nil
|
|
}
|
|
}
|
|
return fileManager, nil
|
|
}
|