mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-02-03 22:18:39 +00:00
The loop is run after the main interface DNS was set, thus the error would make noise to users. This commit removes the noise, by making currentStaticDNS returns an additional error, so it's up to the caller to decive whether to emit the error or not. Further, the physical interface loop will now only log when the callback function runs successfully. Emitting the callback error can be done in the future, until we can figure out how to detect physical interfaces in Go portably.
83 lines
2.1 KiB
Go
83 lines
2.1 KiB
Go
package cli
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"fmt"
|
|
"net"
|
|
"os/exec"
|
|
|
|
"github.com/Control-D-Inc/ctrld/internal/resolvconffile"
|
|
)
|
|
|
|
// allocate loopback ip
|
|
// sudo ifconfig lo0 alias 127.0.0.2 up
|
|
func allocateIP(ip string) error {
|
|
cmd := exec.Command("ifconfig", "lo0", "alias", ip, "up")
|
|
if err := cmd.Run(); err != nil {
|
|
mainLog.Load().Error().Err(err).Msg("allocateIP failed")
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func deAllocateIP(ip string) error {
|
|
cmd := exec.Command("ifconfig", "lo0", "-alias", ip)
|
|
if err := cmd.Run(); err != nil {
|
|
mainLog.Load().Error().Err(err).Msg("deAllocateIP failed")
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// set the dns server for the provided network interface
|
|
// networksetup -setdnsservers Wi-Fi 8.8.8.8 1.1.1.1
|
|
// TODO(cuonglm): use system API
|
|
func setDNS(iface *net.Interface, nameservers []string) error {
|
|
cmd := "networksetup"
|
|
args := []string{"-setdnsservers", iface.Name}
|
|
args = append(args, nameservers...)
|
|
if out, err := exec.Command(cmd, args...).CombinedOutput(); err != nil {
|
|
return fmt.Errorf("%v: %w", string(out), err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// TODO(cuonglm): use system API
|
|
func resetDNS(iface *net.Interface) error {
|
|
if ns := savedStaticNameservers(iface); len(ns) > 0 {
|
|
if err := setDNS(iface, ns); err == nil {
|
|
return nil
|
|
}
|
|
}
|
|
cmd := "networksetup"
|
|
args := []string{"-setdnsservers", iface.Name, "empty"}
|
|
if out, err := exec.Command(cmd, args...).CombinedOutput(); err != nil {
|
|
return fmt.Errorf("%v: %w", string(out), err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func currentDNS(_ *net.Interface) []string {
|
|
return resolvconffile.NameServers("")
|
|
}
|
|
|
|
// currentStaticDNS returns the current static DNS settings of given interface.
|
|
func currentStaticDNS(iface *net.Interface) ([]string, error) {
|
|
cmd := "networksetup"
|
|
args := []string{"-getdnsservers", iface.Name}
|
|
out, err := exec.Command(cmd, args...).Output()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
scanner := bufio.NewScanner(bytes.NewReader(out))
|
|
var ns []string
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
if ip := net.ParseIP(line); ip != nil {
|
|
ns = append(ns, ip.String())
|
|
}
|
|
}
|
|
return ns, nil
|
|
}
|