dns.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package logic
  2. import (
  3. "encoding/json"
  4. "io/ioutil"
  5. "os"
  6. "github.com/gravitl/netmaker/database"
  7. "github.com/gravitl/netmaker/models"
  8. "github.com/gravitl/netmaker/servercfg"
  9. "github.com/txn2/txeh"
  10. )
  11. // SetDNS - sets the dns on file
  12. func SetDNS() error {
  13. hostfile := txeh.Hosts{}
  14. var corefilestring string
  15. networks, err := GetNetworks()
  16. if err != nil && !database.IsEmptyRecord(err) {
  17. return err
  18. }
  19. for _, net := range networks {
  20. corefilestring = corefilestring + net.NetID + " "
  21. dns, err := GetDNS(net.NetID)
  22. if err != nil && !database.IsEmptyRecord(err) {
  23. return err
  24. }
  25. for _, entry := range dns {
  26. hostfile.AddHost(entry.Address, entry.Name+"."+entry.Network)
  27. }
  28. }
  29. if corefilestring == "" {
  30. corefilestring = "example.com"
  31. }
  32. err = hostfile.SaveAs("./config/dnsconfig/netmaker.hosts")
  33. if err != nil {
  34. return err
  35. }
  36. if servercfg.IsSplitDNS() {
  37. err = SetCorefile(corefilestring)
  38. }
  39. return err
  40. }
  41. // GetDNS - gets the DNS of a current network
  42. func GetDNS(network string) ([]models.DNSEntry, error) {
  43. var dns []models.DNSEntry
  44. dns, err := GetNodeDNS(network)
  45. if err != nil && !database.IsEmptyRecord(err) {
  46. return dns, err
  47. }
  48. customdns, err := GetCustomDNS(network)
  49. if err != nil && !database.IsEmptyRecord(err) {
  50. return dns, err
  51. }
  52. dns = append(dns, customdns...)
  53. return dns, nil
  54. }
  55. // GetNodeDNS - gets the DNS of a network node
  56. func GetNodeDNS(network string) ([]models.DNSEntry, error) {
  57. var dns []models.DNSEntry
  58. collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
  59. if err != nil {
  60. return dns, err
  61. }
  62. for _, value := range collection {
  63. var entry models.DNSEntry
  64. var node models.Node
  65. if err = json.Unmarshal([]byte(value), &node); err != nil {
  66. continue
  67. }
  68. if err = json.Unmarshal([]byte(value), &entry); node.Network == network && err == nil {
  69. dns = append(dns, entry)
  70. }
  71. }
  72. return dns, nil
  73. }
  74. // GetCustomDNS - gets the custom DNS of a network
  75. func GetCustomDNS(network string) ([]models.DNSEntry, error) {
  76. var dns []models.DNSEntry
  77. collection, err := database.FetchRecords(database.DNS_TABLE_NAME)
  78. if err != nil {
  79. return dns, err
  80. }
  81. for _, value := range collection { // filter for entries based on network
  82. var entry models.DNSEntry
  83. if err := json.Unmarshal([]byte(value), &entry); err != nil {
  84. continue
  85. }
  86. if entry.Network == network {
  87. dns = append(dns, entry)
  88. }
  89. }
  90. return dns, err
  91. }
  92. // SetCorefile - sets the core file of the system
  93. func SetCorefile(domains string) error {
  94. dir, err := os.Getwd()
  95. if err != nil {
  96. return err
  97. }
  98. _, err = os.Stat(dir + "/config/dnsconfig")
  99. if os.IsNotExist(err) {
  100. os.Mkdir(dir+"/config/dnsconfig", 744)
  101. } else if err != nil {
  102. Log("couldnt find or create /config/dnsconfig", 0)
  103. return err
  104. }
  105. corefile := domains + ` {
  106. reload 15s
  107. hosts /root/dnsconfig/netmaker.hosts {
  108. fallthrough
  109. }
  110. forward . 8.8.8.8 8.8.4.4
  111. log
  112. }
  113. `
  114. corebytes := []byte(corefile)
  115. err = ioutil.WriteFile(dir+"/config/dnsconfig/Corefile", corebytes, 0644)
  116. if err != nil {
  117. return err
  118. }
  119. return err
  120. }