-
-
Notifications
You must be signed in to change notification settings - Fork 39
/
Copy pathnameserver.go
65 lines (58 loc) · 1.49 KB
/
nameserver.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package nameserver
import (
"context"
"io/ioutil"
"net"
"os"
"strings"
)
// UseDNSInternally is to change the Go program DNS only.
func UseDNSInternally(ip net.IP) { //nolint:interfacer
net.DefaultResolver.PreferGo = true
net.DefaultResolver.Dial = func(ctx context.Context, network, address string) (net.Conn, error) {
d := net.Dialer{}
return d.DialContext(ctx, "udp", net.JoinHostPort(ip.String(), "53"))
}
}
// UseDNSSystemWide changes the nameserver to use for DNS system wide.
// If resolvConfPath is empty, it defaults to /etc/resolv.conf.
func UseDNSSystemWide(resolvConfPath string, ip net.IP, keepNameserver bool) error { //nolint:interfacer
const defaultResolvConfPath = "/etc/resolv.conf"
if resolvConfPath == "" {
resolvConfPath = defaultResolvConfPath
}
file, err := os.Open(resolvConfPath)
if err != nil {
return err
}
data, err := ioutil.ReadAll(file)
if err != nil {
_ = file.Close()
return err
}
if err := file.Close(); err != nil {
return err
}
s := strings.TrimSuffix(string(data), "\n")
lines := []string{
"nameserver " + ip.String(),
}
for _, line := range strings.Split(s, "\n") {
if line == "" ||
(!keepNameserver && strings.HasPrefix(line, "nameserver ")) {
continue
}
lines = append(lines, line)
}
s = strings.Join(lines, "\n") + "\n"
file, err = os.OpenFile(resolvConfPath, os.O_WRONLY|os.O_TRUNC, 0644)
if err != nil {
return err
}
_, err = file.WriteString(s)
if err != nil {
_ = file.Close()
return err
}
return file.Close()
}