-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdns-client_windows.go
91 lines (73 loc) · 2.16 KB
/
dns-client_windows.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
package dnsclientconf
import (
"bufio"
"bytes"
"fmt"
"net"
"os/exec"
"strings"
"github.com/ArtemKulyabin/dns-client-conf/debugmode"
"github.com/ArtemKulyabin/dns-client-conf/helpers"
)
const InterfaceName = "Local Area Connection"
type dNSConfig struct {
iface *net.Interface
}
func NewDNSConfigurator() DNSConfigurator {
iface, _ := net.InterfaceByName(InterfaceName)
return &dNSConfig{iface}
}
// For details please see http://stackoverflow.com/questions/18620173/how-can-i-set-change-dns-using-the-command-prompt-at-windows-8
// and https://technet.microsoft.com/en-us/library/cc778503(v=ws.10).aspx
func (dnsconf *dNSConfig) AddNameServers(addrs []net.IP) (err error) {
for i, addr := range addrs {
err = debugmode.DebugExec("netsh", "interface", "ip", "add", "dnsservers", dnsconf.iface.Name, addr.String(), fmt.Sprintf("%d", i+1))
if err != nil {
return err
}
}
return dnsconf.ReloadNameServers()
}
func (dnsconf *dNSConfig) DHCPNameServers() (err error) {
err = debugmode.DebugExec("netsh", "interface", "ip", "set", "dnsservers", dnsconf.iface.Name, "dhcp")
if err != nil {
return err
}
return dnsconf.ReloadNameServers()
}
func (dnsconf *dNSConfig) ReloadNameServers() (err error) {
return debugmode.DebugExec("ipconfig", "/flushdns")
}
func (dnsconf *dNSConfig) GetNameServers() (addrs []net.IP, err error) {
netshCmd := exec.Command("netsh", "interface", "ip", "show", "dnsservers", dnsconf.iface.Name)
outputbuf, err := netshCmd.CombinedOutput()
if err != nil {
return nil, err
}
output := bytes.NewBuffer(outputbuf).String()
scanner := bufio.NewScanner(strings.NewReader(output))
for scanner.Scan() {
line := scanner.Text()
scannerLine := bufio.NewScanner(strings.NewReader(line))
scannerLine.Split(bufio.ScanWords)
var lineArr []string
for scannerLine.Scan() {
lineArr = append(lineArr, scannerLine.Text())
}
//empty line
if len(lineArr) == 0 {
continue
}
for _, addr := range lineArr {
err = helpers.CheckIP(addr)
if err == nil {
addrs = append(addrs, net.ParseIP(addr))
}
err = nil
}
}
return addrs, err
}
func (dnsconf *dNSConfig) SetInterface(iface *net.Interface) {
dnsconf.iface = iface
}