serverctl.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package serverctl
  2. import (
  3. "fmt"
  4. "github.com/gravitl/netmaker/functions"
  5. "github.com/gravitl/netmaker/models"
  6. "github.com/gravitl/netmaker/mongoconn"
  7. "github.com/gravitl/netmaker/servercfg"
  8. "io"
  9. "time"
  10. "context"
  11. "errors"
  12. "os"
  13. "os/exec"
  14. )
  15. func CreateDefaultNetwork() (bool, error) {
  16. fmt.Println("Creating default network...")
  17. iscreated := false
  18. exists, err := functions.NetworkExists("default")
  19. if exists || err != nil {
  20. fmt.Println("Default network already exists. Skipping...")
  21. return iscreated, err
  22. } else {
  23. var network models.Network
  24. network.NetID = "default"
  25. network.AddressRange = "10.10.10.0/24"
  26. network.DisplayName = "default"
  27. network.SetDefaults()
  28. network.SetNodesLastModified()
  29. network.SetNetworkLastModified()
  30. network.KeyUpdateTimeStamp = time.Now().Unix()
  31. priv := false
  32. network.IsLocal = &priv
  33. network.KeyUpdateTimeStamp = time.Now().Unix()
  34. allow := true
  35. network.AllowManualSignUp = &allow
  36. fmt.Println("Creating default network.")
  37. collection := mongoconn.Client.Database("netmaker").Collection("networks")
  38. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  39. // insert our network into the network table
  40. _, err = collection.InsertOne(ctx, network)
  41. defer cancel()
  42. }
  43. if err == nil {
  44. iscreated = true
  45. }
  46. return iscreated, err
  47. }
  48. func DownloadNetclient() error {
  49. /*
  50. // Get the data
  51. resp, err := http.Get("https://github.com/gravitl/netmaker/releases/download/latest/netclient")
  52. if err != nil {
  53. fmt.Println("could not download netclient")
  54. return err
  55. }
  56. defer resp.Body.Close()
  57. // Create the file
  58. out, err := os.Create("/etc/netclient/netclient")
  59. */
  60. if !FileExists("/etc/netclient/netclient") {
  61. _, err := copy("./netclient/netclient", "/etc/netclient/netclient")
  62. if err != nil {
  63. fmt.Println("could not create /etc/netclient")
  64. return err
  65. }
  66. }
  67. //defer out.Close()
  68. // Write the body to file
  69. //_, err = io.Copy(out, resp.Body)
  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, fmt.Errorf("%s is not a regular file", src)
  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. fmt.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. fmt.Println("could not find /etc/netclient")
  108. return false, err
  109. }
  110. cmdoutput, err := exec.Command("/etc/netclient/netclient","-c","remove","-n",network).Output()
  111. if err != nil {
  112. fmt.Println(string(cmdoutput))
  113. return false, err
  114. }
  115. fmt.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. fmt.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. fmt.Println("could not find or create /etc/netclient")
  129. return false, err
  130. }
  131. fmt.Println("Directory is ready.")
  132. token, err := functions.CreateServerToken(network)
  133. if err != nil {
  134. fmt.Println("could not create server token for " + network)
  135. return false, err
  136. }
  137. fmt.Println("Token is ready.")
  138. _, err = os.Stat("/etc/netclient/netclient")
  139. if os.IsNotExist(err) {
  140. err = DownloadNetclient()
  141. fmt.Println("could not download netclient")
  142. if err != nil {
  143. return false, err
  144. }
  145. }
  146. err = os.Chmod("/etc/netclient/netclient", 0755)
  147. if err != nil {
  148. fmt.Println("could not change netclient directory permissions")
  149. return false, err
  150. }
  151. fmt.Println("Client is ready. Running install.")
  152. out, err := exec.Command("/etc/netclient/netclient","-c","install","-t",token,"-name","netmaker","-ip4",pubip).Output()
  153. fmt.Println(string(out))
  154. if err != nil {
  155. return false, errors.New(string(out) + err.Error())
  156. }
  157. fmt.Println("Server added to network " + network)
  158. return true, err
  159. }