mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-05-27 12:52:27 +02:00
0e66697247
So setting up logging for ctrld binary and ctrld packages could be done more easily, decouple the required setup for interactive vs daemon running. This is the first step toward replacing rs/zerolog libary with a different logging library.
66 lines
1.4 KiB
Go
66 lines
1.4 KiB
Go
//go:build unix
|
|
|
|
package ctrld
|
|
|
|
import (
|
|
"context"
|
|
"net"
|
|
"slices"
|
|
"time"
|
|
|
|
"tailscale.com/net/netmon"
|
|
|
|
"github.com/Control-D-Inc/ctrld/internal/resolvconffile"
|
|
)
|
|
|
|
// currentNameserversFromResolvconf returns the current nameservers set from /etc/resolv.conf file.
|
|
func currentNameserversFromResolvconf() []string {
|
|
return resolvconffile.NameServers()
|
|
}
|
|
|
|
// dnsFromResolvConf reads usable nameservers from /etc/resolv.conf file.
|
|
// A nameserver is usable if it's not one of current machine's IP addresses
|
|
// and loopback IP addresses.
|
|
func dnsFromResolvConf(_ context.Context) []string {
|
|
const (
|
|
maxRetries = 10
|
|
retryInterval = 100 * time.Millisecond
|
|
)
|
|
|
|
regularIPs, loopbackIPs, _ := netmon.LocalAddresses()
|
|
|
|
var dns []string
|
|
for attempt := 0; attempt < maxRetries; attempt++ {
|
|
if attempt > 0 {
|
|
time.Sleep(retryInterval)
|
|
}
|
|
|
|
nss := resolvconffile.NameServers()
|
|
var localDNS []string
|
|
seen := make(map[string]bool)
|
|
|
|
for _, ns := range nss {
|
|
if ip := net.ParseIP(ns); ip != nil {
|
|
// skip loopback IPs
|
|
for _, v := range slices.Concat(regularIPs, loopbackIPs) {
|
|
ipStr := v.String()
|
|
if ip.String() == ipStr {
|
|
continue
|
|
}
|
|
}
|
|
if !seen[ip.String()] {
|
|
seen[ip.String()] = true
|
|
localDNS = append(localDNS, ip.String())
|
|
}
|
|
}
|
|
}
|
|
|
|
// If we successfully read the file and found nameservers, return them
|
|
if len(localDNS) > 0 {
|
|
return localDNS
|
|
}
|
|
}
|
|
|
|
return dns
|
|
}
|