dns.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. package logic
  2. import (
  3. "context"
  4. "errors"
  5. "net"
  6. "github.com/gravitl/netmaker/db"
  7. "github.com/gravitl/netmaker/logic"
  8. "github.com/gravitl/netmaker/models"
  9. "github.com/gravitl/netmaker/schema"
  10. )
  11. func ValidateNameserverReq(ns schema.Nameserver) error {
  12. if ns.Name == "" {
  13. return errors.New("name is required")
  14. }
  15. if ns.NetworkID == "" {
  16. return errors.New("network is required")
  17. }
  18. if len(ns.Servers) == 0 {
  19. return errors.New("atleast one nameserver should be specified")
  20. }
  21. network, err := logic.GetNetwork(ns.NetworkID)
  22. if err != nil {
  23. return errors.New("invalid network id")
  24. }
  25. _, cidr, err4 := net.ParseCIDR(network.AddressRange)
  26. _, cidr6, err6 := net.ParseCIDR(network.AddressRange6)
  27. for _, nsIPStr := range ns.Servers {
  28. nsIP := net.ParseIP(nsIPStr)
  29. if nsIP == nil {
  30. return errors.New("invalid nameserver " + nsIPStr)
  31. }
  32. if err4 == nil && nsIP.To4() != nil {
  33. if cidr.Contains(nsIP) {
  34. return errors.New("cannot use netmaker IP as nameserver")
  35. }
  36. } else if err6 == nil && cidr6.Contains(nsIP) {
  37. return errors.New("cannot use netmaker IP as nameserver")
  38. }
  39. }
  40. if !ns.MatchAll && len(ns.MatchDomains) == 0 {
  41. return errors.New("atleast one match domain is required")
  42. }
  43. if !ns.MatchAll {
  44. for _, matchDomain := range ns.MatchDomains {
  45. if !logic.IsValidMatchDomain(matchDomain) {
  46. return errors.New("invalid match domain")
  47. }
  48. }
  49. }
  50. if len(ns.Tags) > 0 {
  51. for tagI := range ns.Tags {
  52. if tagI == "*" {
  53. continue
  54. }
  55. _, err := GetTag(models.TagID(tagI))
  56. if err != nil {
  57. return errors.New("invalid tag")
  58. }
  59. }
  60. }
  61. return nil
  62. }
  63. func GetNameserversForNode(node *models.Node) (returnNsLi []models.Nameserver) {
  64. ns := &schema.Nameserver{
  65. NetworkID: node.Network,
  66. }
  67. nsLi, _ := ns.ListByNetwork(db.WithContext(context.TODO()))
  68. for _, nsI := range nsLi {
  69. if !nsI.Status {
  70. continue
  71. }
  72. _, all := nsI.Tags["*"]
  73. if all {
  74. for _, matchDomain := range nsI.MatchDomains {
  75. returnNsLi = append(returnNsLi, models.Nameserver{
  76. IPs: nsI.Servers,
  77. MatchDomain: matchDomain,
  78. })
  79. }
  80. continue
  81. }
  82. foundTag := false
  83. for tagI := range node.Tags {
  84. if _, ok := nsI.Tags[tagI.String()]; ok {
  85. for _, matchDomain := range nsI.MatchDomains {
  86. returnNsLi = append(returnNsLi, models.Nameserver{
  87. IPs: nsI.Servers,
  88. MatchDomain: matchDomain,
  89. })
  90. }
  91. foundTag = true
  92. }
  93. if foundTag {
  94. break
  95. }
  96. }
  97. if foundTag {
  98. continue
  99. }
  100. if _, ok := nsI.Nodes[node.ID.String()]; ok {
  101. for _, matchDomain := range nsI.MatchDomains {
  102. returnNsLi = append(returnNsLi, models.Nameserver{
  103. IPs: nsI.Servers,
  104. MatchDomain: matchDomain,
  105. })
  106. }
  107. }
  108. }
  109. if node.IsInternetGateway {
  110. globalNs := models.Nameserver{
  111. MatchDomain: ".",
  112. }
  113. for _, nsI := range logic.GlobalNsList {
  114. globalNs.IPs = append(globalNs.IPs, nsI.IPs...)
  115. }
  116. returnNsLi = append(returnNsLi, globalNs)
  117. }
  118. return
  119. }
  120. func GetNameserversForHost(h *models.Host) (returnNsLi []models.Nameserver) {
  121. if h.DNS != "yes" {
  122. return
  123. }
  124. for _, nodeID := range h.Nodes {
  125. node, err := logic.GetNodeByID(nodeID)
  126. if err != nil {
  127. continue
  128. }
  129. ns := &schema.Nameserver{
  130. NetworkID: node.Network,
  131. }
  132. nsLi, _ := ns.ListByNetwork(db.WithContext(context.TODO()))
  133. for _, nsI := range nsLi {
  134. if !nsI.Status {
  135. continue
  136. }
  137. _, all := nsI.Tags["*"]
  138. if all {
  139. for _, matchDomain := range nsI.MatchDomains {
  140. returnNsLi = append(returnNsLi, models.Nameserver{
  141. IPs: nsI.Servers,
  142. MatchDomain: matchDomain,
  143. })
  144. }
  145. continue
  146. }
  147. foundTag := false
  148. for tagI := range node.Tags {
  149. if _, ok := nsI.Tags[tagI.String()]; ok {
  150. for _, matchDomain := range nsI.MatchDomains {
  151. returnNsLi = append(returnNsLi, models.Nameserver{
  152. IPs: nsI.Servers,
  153. MatchDomain: matchDomain,
  154. })
  155. }
  156. foundTag = true
  157. }
  158. if foundTag {
  159. break
  160. }
  161. }
  162. if foundTag {
  163. continue
  164. }
  165. if _, ok := nsI.Nodes[node.ID.String()]; ok {
  166. for _, matchDomain := range nsI.MatchDomains {
  167. returnNsLi = append(returnNsLi, models.Nameserver{
  168. IPs: nsI.Servers,
  169. MatchDomain: matchDomain,
  170. })
  171. }
  172. }
  173. }
  174. if node.IsInternetGateway {
  175. globalNs := models.Nameserver{
  176. MatchDomain: ".",
  177. }
  178. for _, nsI := range logic.GlobalNsList {
  179. globalNs.IPs = append(globalNs.IPs, nsI.IPs...)
  180. }
  181. returnNsLi = append(returnNsLi, globalNs)
  182. }
  183. }
  184. return
  185. }