-
Notifications
You must be signed in to change notification settings - Fork 231
/
resolvconf.go
112 lines (98 loc) · 2.45 KB
/
resolvconf.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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// +build !windows
package util
import (
"bufio"
"bytes"
"fmt"
"github.com/rs/zerolog/log"
"io/ioutil"
"os"
"strings"
)
const (
commentKtAdded = " # added by ktctl"
commentKtRemoved = " # removed by ktctl"
resolvConf = "/etc/resolv.conf"
fieldNameserver = "nameserver"
fieldDomain = "domain"
fieldSearch = "search"
)
func AddNameserver(nameserver string) error {
f, err := os.Open(resolvConf)
if err != nil {
return err
}
defer f.Close()
var buf bytes.Buffer
prefix := fmt.Sprintf("%s %s", fieldNameserver, nameserver)
scanner := bufio.NewScanner(f)
for scanner.Scan() {
line := scanner.Text()
if strings.HasPrefix(line, fieldNameserver) {
buf.WriteString("#")
buf.WriteString(line)
buf.WriteString(commentKtRemoved)
buf.WriteString("\n")
} else if strings.HasPrefix(line, prefix) {
return nil
} else {
buf.WriteString(line)
buf.WriteString("\n")
}
}
// Add nameserver and comment to resolv.conf
buf.WriteString(fmt.Sprintf("%s%s", prefix, commentKtAdded))
buf.WriteString("\n")
stat, _ := f.Stat()
err = ioutil.WriteFile(resolvConf, buf.Bytes(), stat.Mode())
return err
}
// RestoreConfig remove the nameserver which is added by ktctl.
func RestoreConfig() error {
f, err := os.Open(resolvConf)
if err != nil {
return err
}
defer f.Close()
var buf bytes.Buffer
scanner := bufio.NewScanner(f)
for scanner.Scan() {
line := scanner.Text()
if strings.HasSuffix(line, commentKtRemoved) {
line = strings.TrimSuffix(line, commentKtRemoved)
line = strings.TrimPrefix(line, "#")
buf.WriteString(line)
buf.WriteString("\n")
} else if strings.HasSuffix(line, commentKtAdded) {
log.Info().Msgf("remove line: %s ", line)
} else {
buf.WriteString(line)
buf.WriteString("\n")
}
}
stat, _ := f.Stat()
err = ioutil.WriteFile(resolvConf, buf.Bytes(), stat.Mode())
return err
}
func GetLocalDomains() string {
f, err := os.Open(resolvConf)
if err != nil {
return ""
}
defer f.Close()
var localDomains []string
scanner := bufio.NewScanner(f)
for scanner.Scan() {
line := scanner.Text()
if strings.HasPrefix(line, fieldDomain) {
localDomains = append(localDomains, strings.TrimSpace(strings.TrimPrefix(line, fieldDomain)))
} else if strings.HasPrefix(line, fieldSearch) {
for _, s := range strings.Split(strings.TrimPrefix(line, fieldSearch), " ") {
if s != "" {
localDomains = append(localDomains, s)
}
}
}
}
return strings.Join(localDomains, ",")
}