فهرست منبع

set match domain on update

abhishek9686 2 هفته پیش
والد
کامیت
3f2b480057
4فایلهای تغییر یافته به همراه82 افزوده شده و 2 حذف شده
  1. 6 0
      controllers/dns.go
  2. 38 0
      logic/dns.go
  3. 2 2
      pro/controllers/users.go
  4. 36 0
      pro/logic/dns.go

+ 6 - 0
controllers/dns.go

@@ -90,6 +90,11 @@ func createNs(w http.ResponseWriter, r *http.Request) {
 	if gNs, ok := logic.GlobalNsList[req.Name]; ok {
 		req.Servers = gNs.IPs
 	}
+	if !servercfg.IsPro {
+		req.Tags = datatypes.JSONMap{
+			"*": struct{}{},
+		}
+	}
 	ns := schema.Nameserver{
 		ID:          uuid.New().String(),
 		Name:        req.Name,
@@ -222,6 +227,7 @@ func updateNs(w http.ResponseWriter, r *http.Request) {
 	}
 	ns.Servers = updateNs.Servers
 	ns.Tags = updateNs.Tags
+	ns.MatchDomain = updateNs.MatchDomain
 	ns.Description = updateNs.Description
 	ns.Name = updateNs.Name
 	ns.Status = updateNs.Status

+ 38 - 0
logic/dns.go

@@ -394,6 +394,44 @@ func ValidateUpdateNameserverReq(updateNs schema.Nameserver) error {
 	return nil
 }
 
+func GetNameserversForNode(node *models.Node) (returnNsLi []models.Nameserver) {
+	ns := &schema.Nameserver{
+		NetworkID: node.Network,
+	}
+	nsLi, _ := ns.ListByNetwork(db.WithContext(context.TODO()))
+	for _, nsI := range nsLi {
+		if !nsI.Status {
+			continue
+		}
+		_, all := nsI.Tags["*"]
+		if all {
+			returnNsLi = append(returnNsLi, models.Nameserver{
+				IPs:         nsI.Servers,
+				MatchDomain: nsI.MatchDomain,
+			})
+			continue
+		}
+		for tagI := range node.Tags {
+			if _, ok := nsI.Tags[tagI.String()]; ok {
+				returnNsLi = append(returnNsLi, models.Nameserver{
+					IPs:         nsI.Servers,
+					MatchDomain: nsI.MatchDomain,
+				})
+			}
+		}
+	}
+	if node.IsInternetGateway {
+		globalNs := models.Nameserver{
+			MatchDomain: ".",
+		}
+		for _, nsI := range GlobalNsList {
+			globalNs.IPs = append(globalNs.IPs, nsI.IPs...)
+		}
+		returnNsLi = append(returnNsLi, globalNs)
+	}
+	return
+}
+
 func GetNameserversForHost(h *models.Host) (returnNsLi []models.Nameserver) {
 	if h.DNS != "yes" {
 		return

+ 2 - 2
pro/controllers/users.go

@@ -1328,7 +1328,7 @@ func getUserRemoteAccessGwsV1(w http.ResponseWriter, r *http.Request) {
 				Addresses:         utils.NoEmptyStringToCsv(node.Address.String(), node.Address6.String()),
 			}
 			if !node.IsInternetGateway {
-				hNs := logic.GetNameserversForHost(host)
+				hNs := logic.GetNameserversForNode(&node)
 				for _, nsI := range hNs {
 					gw.MatchDomains = append(gw.MatchDomains, nsI.MatchDomain)
 				}
@@ -1379,7 +1379,7 @@ func getUserRemoteAccessGwsV1(w http.ResponseWriter, r *http.Request) {
 			Addresses:         utils.NoEmptyStringToCsv(node.Address.String(), node.Address6.String()),
 		}
 		if !node.IsInternetGateway {
-			hNs := logic.GetNameserversForHost(host)
+			hNs := logic.GetNameserversForNode(&node)
 			for _, nsI := range hNs {
 				gw.MatchDomains = append(gw.MatchDomains, nsI.MatchDomain)
 			}

+ 36 - 0
pro/logic/dns.go

@@ -0,0 +1,36 @@
+package logic
+
+import (
+	"errors"
+
+	"github.com/gravitl/netmaker/logic"
+	"github.com/gravitl/netmaker/models"
+	"github.com/gravitl/netmaker/schema"
+)
+
+func ValidateNameserverReq(ns schema.Nameserver) error {
+	if ns.Name == "" {
+		return errors.New("name is required")
+	}
+	if ns.NetworkID == "" {
+		return errors.New("network is required")
+	}
+	if len(ns.Servers) == 0 {
+		return errors.New("atleast one nameserver should be specified")
+	}
+	if !logic.IsValidMatchDomain(ns.MatchDomain) {
+		return errors.New("invalid match domain")
+	}
+	if len(ns.Tags) > 0 {
+		for tagI := range ns.Tags {
+			if tagI == "*" {
+				continue
+			}
+			_, err := GetTag(models.TagID(tagI))
+			if err != nil {
+				return errors.New("invalid tag")
+			}
+		}
+	}
+	return nil
+}