mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-08-10 13:20:33 +02:00
Simplify dnsFromResolvConf
By using existed package instead of hand written one. While at it, also simplifying the logger getter, since the ProxyLogger is guaranted to be non-nil.
This commit is contained in:
+6
-32
@@ -7,17 +7,16 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
|
||||||
"net"
|
"net"
|
||||||
"os"
|
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"regexp"
|
"regexp"
|
||||||
"slices"
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/rs/zerolog"
|
|
||||||
"tailscale.com/net/netmon"
|
"tailscale.com/net/netmon"
|
||||||
|
|
||||||
|
"github.com/Control-D-Inc/ctrld/internal/resolvconffile"
|
||||||
)
|
)
|
||||||
|
|
||||||
func dnsFns() []dnsFn {
|
func dnsFns() []dnsFn {
|
||||||
@@ -26,11 +25,6 @@ func dnsFns() []dnsFn {
|
|||||||
|
|
||||||
// dnsFromResolvConf reads nameservers from /etc/resolv.conf
|
// dnsFromResolvConf reads nameservers from /etc/resolv.conf
|
||||||
func dnsFromResolvConf() []string {
|
func dnsFromResolvConf() []string {
|
||||||
logger := zerolog.New(io.Discard)
|
|
||||||
if ProxyLogger.Load() != nil {
|
|
||||||
logger = *ProxyLogger.Load()
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
maxRetries = 10
|
maxRetries = 10
|
||||||
retryInterval = 100 * time.Millisecond
|
retryInterval = 100 * time.Millisecond
|
||||||
@@ -44,24 +38,12 @@ func dnsFromResolvConf() []string {
|
|||||||
time.Sleep(retryInterval)
|
time.Sleep(retryInterval)
|
||||||
}
|
}
|
||||||
|
|
||||||
file, err := os.Open("/etc/resolv.conf")
|
nss := resolvconffile.NameServers("")
|
||||||
if err != nil {
|
|
||||||
Log(context.Background(), logger.Error(), "failed to open /etc/resolv.conf (attempt %d/%d)", attempt+1, maxRetries)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
defer file.Close()
|
|
||||||
|
|
||||||
var localDNS []string
|
var localDNS []string
|
||||||
seen := make(map[string]bool)
|
seen := make(map[string]bool)
|
||||||
|
|
||||||
scanner := bufio.NewScanner(file)
|
for _, ns := range nss {
|
||||||
for scanner.Scan() {
|
if ip := net.ParseIP(ns); ip != nil {
|
||||||
line := scanner.Text()
|
|
||||||
fields := strings.Fields(line)
|
|
||||||
if len(fields) < 2 || fields[0] != "nameserver" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if ip := net.ParseIP(fields[1]); ip != nil {
|
|
||||||
// skip loopback IPs
|
// skip loopback IPs
|
||||||
for _, v := range slices.Concat(regularIPs, loopbackIPs) {
|
for _, v := range slices.Concat(regularIPs, loopbackIPs) {
|
||||||
ipStr := v.String()
|
ipStr := v.String()
|
||||||
@@ -76,11 +58,6 @@ func dnsFromResolvConf() []string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := scanner.Err(); err != nil {
|
|
||||||
Log(context.Background(), logger.Error(), "error reading /etc/resolv.conf (attempt %d/%d): %v", attempt+1, maxRetries, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we successfully read the file and found nameservers, return them
|
// If we successfully read the file and found nameservers, return them
|
||||||
if len(localDNS) > 0 {
|
if len(localDNS) > 0 {
|
||||||
return localDNS
|
return localDNS
|
||||||
@@ -91,10 +68,7 @@ func dnsFromResolvConf() []string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func getDNSFromScutil() []string {
|
func getDNSFromScutil() []string {
|
||||||
logger := zerolog.New(io.Discard)
|
logger := *ProxyLogger.Load()
|
||||||
if ProxyLogger.Load() != nil {
|
|
||||||
logger = *ProxyLogger.Load()
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
maxRetries = 10
|
maxRetries = 10
|
||||||
|
|||||||
Reference in New Issue
Block a user