serverctl.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package serverctl
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "io"
  6. "log"
  7. "os"
  8. "os/exec"
  9. "time"
  10. "github.com/gravitl/netmaker/database"
  11. "github.com/gravitl/netmaker/functions"
  12. "github.com/gravitl/netmaker/models"
  13. "github.com/gravitl/netmaker/servercfg"
  14. )
  15. func GetServerWGConf() (models.IntClient, error) {
  16. var server models.IntClient
  17. collection, err := database.FetchRecords(database.INT_CLIENTS_TABLE_NAME)
  18. if err != nil {
  19. return models.IntClient{}, errors.New("could not find comms server")
  20. }
  21. for _, value := range collection {
  22. json.Unmarshal([]byte(value), &server)
  23. if server.Network == "comms" && server.IsServer == "yes" {
  24. return server, nil
  25. }
  26. }
  27. return models.IntClient{}, errors.New("could not find comms server")
  28. }
  29. func CreateCommsNetwork() (bool, error) {
  30. iscreated := false
  31. exists, err := functions.NetworkExists("comms")
  32. if exists || err != nil {
  33. log.Println("comms network already exists. Skipping...")
  34. return true, err
  35. } else {
  36. var network models.Network
  37. network.NetID = "comms"
  38. network.IsIPv6 = "no"
  39. network.IsIPv4 = "yes"
  40. network.IsGRPCHub = "yes"
  41. network.AddressRange = servercfg.GetGRPCWGAddressRange()
  42. network.DisplayName = "comms"
  43. network.SetDefaults()
  44. network.SetNodesLastModified()
  45. network.SetNetworkLastModified()
  46. network.KeyUpdateTimeStamp = time.Now().Unix()
  47. network.IsLocal = "no"
  48. network.KeyUpdateTimeStamp = time.Now().Unix()
  49. log.Println("Creating comms network...")
  50. value, err := json.Marshal(network)
  51. if err != nil {
  52. return false, err
  53. }
  54. database.Insert(network.NetID, string(value), database.NETWORKS_TABLE_NAME)
  55. }
  56. if err == nil {
  57. iscreated = true
  58. }
  59. return iscreated, err
  60. }
  61. func InstallNetclient() error {
  62. if !FileExists("/etc/netclient/netclient") {
  63. _, err := copy("./netclient/netclient", "/etc/netclient/netclient")
  64. if err != nil {
  65. log.Println("could not create /etc/netclient")
  66. return err
  67. }
  68. }
  69. return nil
  70. }
  71. func FileExists(f string) bool {
  72. info, err := os.Stat(f)
  73. if os.IsNotExist(err) {
  74. return false
  75. }
  76. return !info.IsDir()
  77. }
  78. func copy(src, dst string) (int64, error) {
  79. sourceFileStat, err := os.Stat(src)
  80. if err != nil {
  81. return 0, err
  82. }
  83. if !sourceFileStat.Mode().IsRegular() {
  84. return 0, errors.New(src + " is not a regular file")
  85. }
  86. source, err := os.Open(src)
  87. if err != nil {
  88. return 0, err
  89. }
  90. defer source.Close()
  91. destination, err := os.Create(dst)
  92. if err != nil {
  93. return 0, err
  94. }
  95. defer destination.Close()
  96. nBytes, err := io.Copy(destination, source)
  97. err = os.Chmod(dst, 0755)
  98. if err != nil {
  99. log.Println(err)
  100. }
  101. return nBytes, err
  102. }
  103. func RemoveNetwork(network string) (bool, error) {
  104. _, err := os.Stat("/etc/netclient/netclient")
  105. if err != nil {
  106. log.Println("could not find /etc/netclient")
  107. return false, err
  108. }
  109. cmdoutput, err := exec.Command("/etc/netclient/netclient", "leave", "-n", network).Output()
  110. if err != nil {
  111. log.Println(string(cmdoutput))
  112. return false, err
  113. }
  114. log.Println("Server removed from network " + network)
  115. return true, err
  116. }
  117. func AddNetwork(network string) (bool, error) {
  118. pubip, err := servercfg.GetPublicIP()
  119. if err != nil {
  120. log.Println("could not get public IP.")
  121. return false, err
  122. }
  123. _, err = os.Stat("/etc/netclient")
  124. if os.IsNotExist(err) {
  125. os.Mkdir("/etc/netclient", 744)
  126. } else if err != nil {
  127. log.Println("could not find or create /etc/netclient")
  128. return false, err
  129. }
  130. token, err := functions.CreateServerToken(network)
  131. if err != nil {
  132. log.Println("could not create server token for " + network)
  133. return false, err
  134. }
  135. _, err = os.Stat("/etc/netclient/netclient")
  136. if os.IsNotExist(err) {
  137. err = InstallNetclient()
  138. if err != nil {
  139. return false, err
  140. }
  141. }
  142. err = os.Chmod("/etc/netclient/netclient", 0755)
  143. if err != nil {
  144. log.Println("could not change netclient directory permissions")
  145. return false, err
  146. }
  147. log.Println("executing network join: " + "/etc/netclient/netclient " + "join " + "-t " + token + " -name " + "netmaker" + " -endpoint " + pubip)
  148. joinCMD := exec.Command("/etc/netclient/netclient", "join", "-t", token, "-name", "netmaker", "-endpoint", pubip)
  149. err = joinCMD.Start()
  150. if err != nil {
  151. log.Println(err)
  152. }
  153. log.Println("Waiting for join command to finish...")
  154. err = joinCMD.Wait()
  155. if err != nil {
  156. log.Println("Command finished with error: %v", err)
  157. return false, err
  158. }
  159. log.Println("Server added to network " + network)
  160. return true, err
  161. }