dns.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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.MatchDomains) == 0 {
  21. return errors.New("atleast one match domain is required")
  22. }
  23. if !ns.MatchAll {
  24. for _, matchDomain := range ns.MatchDomains {
  25. if !logic.IsValidMatchDomain(matchDomain) {
  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. ns := &schema.Nameserver{
  45. NetworkID: node.Network,
  46. }
  47. nsLi, _ := ns.ListByNetwork(db.WithContext(context.TODO()))
  48. for _, nsI := range nsLi {
  49. if !nsI.Status {
  50. continue
  51. }
  52. _, all := nsI.Tags["*"]
  53. if all {
  54. for _, matchDomain := range nsI.MatchDomains {
  55. returnNsLi = append(returnNsLi, models.Nameserver{
  56. IPs: nsI.Servers,
  57. MatchDomain: matchDomain,
  58. })
  59. }
  60. continue
  61. }
  62. foundTag := false
  63. for tagI := range node.Tags {
  64. if _, ok := nsI.Tags[tagI.String()]; ok {
  65. for _, matchDomain := range nsI.MatchDomains {
  66. returnNsLi = append(returnNsLi, models.Nameserver{
  67. IPs: nsI.Servers,
  68. MatchDomain: matchDomain,
  69. })
  70. }
  71. foundTag = true
  72. }
  73. if foundTag {
  74. break
  75. }
  76. }
  77. if foundTag {
  78. continue
  79. }
  80. if _, ok := nsI.Nodes[node.ID.String()]; ok {
  81. for _, matchDomain := range nsI.MatchDomains {
  82. returnNsLi = append(returnNsLi, models.Nameserver{
  83. IPs: nsI.Servers,
  84. MatchDomain: matchDomain,
  85. })
  86. }
  87. }
  88. }
  89. if node.IsInternetGateway {
  90. globalNs := models.Nameserver{
  91. MatchDomain: ".",
  92. }
  93. for _, nsI := range logic.GlobalNsList {
  94. globalNs.IPs = append(globalNs.IPs, nsI.IPs...)
  95. }
  96. returnNsLi = append(returnNsLi, globalNs)
  97. }
  98. return
  99. }
  100. func GetNameserversForHost(h *models.Host) (returnNsLi []models.Nameserver) {
  101. if h.DNS != "yes" {
  102. return
  103. }
  104. for _, nodeID := range h.Nodes {
  105. node, err := logic.GetNodeByID(nodeID)
  106. if err != nil {
  107. continue
  108. }
  109. ns := &schema.Nameserver{
  110. NetworkID: node.Network,
  111. }
  112. nsLi, _ := ns.ListByNetwork(db.WithContext(context.TODO()))
  113. for _, nsI := range nsLi {
  114. if !nsI.Status {
  115. continue
  116. }
  117. _, all := nsI.Tags["*"]
  118. if all {
  119. for _, matchDomain := range nsI.MatchDomains {
  120. returnNsLi = append(returnNsLi, models.Nameserver{
  121. IPs: nsI.Servers,
  122. MatchDomain: matchDomain,
  123. })
  124. }
  125. continue
  126. }
  127. foundTag := false
  128. for tagI := range node.Tags {
  129. if _, ok := nsI.Tags[tagI.String()]; ok {
  130. for _, matchDomain := range nsI.MatchDomains {
  131. returnNsLi = append(returnNsLi, models.Nameserver{
  132. IPs: nsI.Servers,
  133. MatchDomain: matchDomain,
  134. })
  135. }
  136. foundTag = true
  137. }
  138. if foundTag {
  139. break
  140. }
  141. }
  142. if foundTag {
  143. continue
  144. }
  145. if _, ok := nsI.Nodes[node.ID.String()]; ok {
  146. for _, matchDomain := range nsI.MatchDomains {
  147. returnNsLi = append(returnNsLi, models.Nameserver{
  148. IPs: nsI.Servers,
  149. MatchDomain: matchDomain,
  150. })
  151. }
  152. }
  153. }
  154. if node.IsInternetGateway {
  155. globalNs := models.Nameserver{
  156. MatchDomain: ".",
  157. }
  158. for _, nsI := range logic.GlobalNsList {
  159. globalNs.IPs = append(globalNs.IPs, nsI.IPs...)
  160. }
  161. returnNsLi = append(returnNsLi, globalNs)
  162. }
  163. }
  164. return
  165. }