|
@@ -1,8 +1,11 @@
|
|
package local
|
|
package local
|
|
|
|
|
|
import (
|
|
import (
|
|
|
|
+ "fmt"
|
|
|
|
+ "net"
|
|
"os"
|
|
"os"
|
|
"strings"
|
|
"strings"
|
|
|
|
+ "time"
|
|
|
|
|
|
//"github.com/davecgh/go-spew/spew"
|
|
//"github.com/davecgh/go-spew/spew"
|
|
"log"
|
|
"log"
|
|
@@ -11,6 +14,8 @@ import (
|
|
"github.com/gravitl/netmaker/netclient/ncutils"
|
|
"github.com/gravitl/netmaker/netclient/ncutils"
|
|
)
|
|
)
|
|
|
|
|
|
|
|
+const DNS_UNREACHABLE_ERROR = "nameserver unreachable"
|
|
|
|
+
|
|
// SetDNS - sets the DNS of a local machine
|
|
// SetDNS - sets the DNS of a local machine
|
|
func SetDNS(nameserver string) error {
|
|
func SetDNS(nameserver string) error {
|
|
bytes, err := os.ReadFile("/etc/resolv.conf")
|
|
bytes, err := os.ReadFile("/etc/resolv.conf")
|
|
@@ -35,9 +40,21 @@ func SetDNS(nameserver string) error {
|
|
|
|
|
|
// UpdateDNS - updates local DNS of client
|
|
// UpdateDNS - updates local DNS of client
|
|
func UpdateDNS(ifacename string, network string, nameserver string) error {
|
|
func UpdateDNS(ifacename string, network string, nameserver string) error {
|
|
|
|
+ if ifacename == "" {
|
|
|
|
+ return fmt.Errorf("cannot set dns: interface name is blank")
|
|
|
|
+ }
|
|
|
|
+ if network == "" {
|
|
|
|
+ return fmt.Errorf("cannot set dns: network name is blank")
|
|
|
|
+ }
|
|
|
|
+ if nameserver == "" {
|
|
|
|
+ return fmt.Errorf("cannot set dns: nameserver is blank")
|
|
|
|
+ }
|
|
if ncutils.IsWindows() {
|
|
if ncutils.IsWindows() {
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
+ if !IsDNSReachable(nameserver) {
|
|
|
|
+ return fmt.Errorf(DNS_UNREACHABLE_ERROR + " : " + nameserver + ":53")
|
|
|
|
+ }
|
|
_, err := exec.LookPath("resolvectl")
|
|
_, err := exec.LookPath("resolvectl")
|
|
if err != nil {
|
|
if err != nil {
|
|
log.Println(err)
|
|
log.Println(err)
|
|
@@ -60,3 +77,21 @@ func UpdateDNS(ifacename string, network string, nameserver string) error {
|
|
}
|
|
}
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+func IsDNSReachable(nameserver string) bool {
|
|
|
|
+ port := "53"
|
|
|
|
+ protocols := [2]string{"tcp", "udp"}
|
|
|
|
+ for _, proto := range protocols {
|
|
|
|
+ timeout := time.Second
|
|
|
|
+ conn, err := net.DialTimeout(proto, net.JoinHostPort(nameserver, port), timeout)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return false
|
|
|
|
+ }
|
|
|
|
+ if conn != nil {
|
|
|
|
+ defer conn.Close()
|
|
|
|
+ } else {
|
|
|
|
+ return false
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return true
|
|
|
|
+}
|