| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 | package logicimport (	"context"	"errors"	"net"	"github.com/gravitl/netmaker/db"	"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")	}	network, err := logic.GetNetwork(ns.NetworkID)	if err != nil {		return errors.New("invalid network id")	}	_, cidr, err4 := net.ParseCIDR(network.AddressRange)	_, cidr6, err6 := net.ParseCIDR(network.AddressRange6)	for _, nsIPStr := range ns.Servers {		nsIP := net.ParseIP(nsIPStr)		if nsIP == nil {			return errors.New("invalid nameserver " + nsIPStr)		}		if err4 == nil && nsIP.To4() != nil {			if cidr.Contains(nsIP) {				return errors.New("cannot use netmaker IP as nameserver")			}		} else if err6 == nil && cidr6.Contains(nsIP) {			return errors.New("cannot use netmaker IP as nameserver")		}	}	if !ns.MatchAll && len(ns.MatchDomains) == 0 {		return errors.New("atleast one match domain is required")	}	if !ns.MatchAll {		for _, matchDomain := range ns.MatchDomains {			if !logic.IsValidMatchDomain(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}func GetNameserversForNode(node *models.Node) (returnNsLi []models.Nameserver) {	filters := make(map[string]bool)	if node.Address.IP != nil {		filters[node.Address.IP.String()] = true	}	if node.Address6.IP != nil {		filters[node.Address6.IP.String()] = true	}	ns := &schema.Nameserver{		NetworkID: node.Network,	}	nsLi, _ := ns.ListByNetwork(db.WithContext(context.TODO()))	for _, nsI := range nsLi {		if !nsI.Status {			continue		}		filteredIps := logic.FilterOutIPs(nsI.Servers, filters)		if len(filteredIps) == 0 {			continue		}		_, all := nsI.Tags["*"]		if all {			for _, matchDomain := range nsI.MatchDomains {				returnNsLi = append(returnNsLi, models.Nameserver{					IPs:         filteredIps,					MatchDomain: matchDomain,				})			}			continue		}		foundTag := false		for tagI := range node.Tags {			if _, ok := nsI.Tags[tagI.String()]; ok {				for _, matchDomain := range nsI.MatchDomains {					returnNsLi = append(returnNsLi, models.Nameserver{						IPs:         filteredIps,						MatchDomain: matchDomain,					})				}				foundTag = true			}			if foundTag {				break			}		}		if foundTag {			continue		}		if _, ok := nsI.Nodes[node.ID.String()]; ok {			for _, matchDomain := range nsI.MatchDomains {				returnNsLi = append(returnNsLi, models.Nameserver{					IPs:         nsI.Servers,					MatchDomain: matchDomain,				})			}		}	}	if node.IsInternetGateway {		globalNs := models.Nameserver{			MatchDomain: ".",		}		for _, nsI := range logic.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	}	for _, nodeID := range h.Nodes {		node, err := logic.GetNodeByID(nodeID)		if err != nil {			continue		}		filters := make(map[string]bool)		if node.Address.IP != nil {			filters[node.Address.IP.String()] = true		}		if node.Address6.IP != nil {			filters[node.Address6.IP.String()] = true		}		ns := &schema.Nameserver{			NetworkID: node.Network,		}		nsLi, _ := ns.ListByNetwork(db.WithContext(context.TODO()))		for _, nsI := range nsLi {			if !nsI.Status {				continue			}			filteredIps := logic.FilterOutIPs(nsI.Servers, filters)			if len(filteredIps) == 0 {				continue			}			_, all := nsI.Tags["*"]			if all {				for _, matchDomain := range nsI.MatchDomains {					returnNsLi = append(returnNsLi, models.Nameserver{						IPs:         filteredIps,						MatchDomain: matchDomain,					})				}				continue			}			foundTag := false			for tagI := range node.Tags {				if _, ok := nsI.Tags[tagI.String()]; ok {					for _, matchDomain := range nsI.MatchDomains {						returnNsLi = append(returnNsLi, models.Nameserver{							IPs:         filteredIps,							MatchDomain: matchDomain,						})					}					foundTag = true				}				if foundTag {					break				}			}			if foundTag {				continue			}			if _, ok := nsI.Nodes[node.ID.String()]; ok {				for _, matchDomain := range nsI.MatchDomains {					returnNsLi = append(returnNsLi, models.Nameserver{						IPs:         nsI.Servers,						MatchDomain: matchDomain,					})				}			}		}		if node.IsInternetGateway {			globalNs := models.Nameserver{				MatchDomain: ".",			}			for _, nsI := range logic.GlobalNsList {				globalNs.IPs = append(globalNs.IPs, nsI.IPs...)			}			returnNsLi = append(returnNsLi, globalNs)		}	}	return}
 |