dns.go 4.6 KB

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