serverctl.go 4.3 KB

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