serverctl.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package serverctl
  2. import (
  3. "fmt"
  4. "net/http"
  5. "io/ioutil"
  6. "github.com/gravitl/netmaker/functions"
  7. "io"
  8. "errors"
  9. "os"
  10. "os/exec"
  11. )
  12. func GetPublicIP() (string, error) {
  13. endpoint := ""
  14. var err error
  15. if os.Getenv("SERVER_DOMAIN") != "" {
  16. endpoint = os.Getenv("SERVER_DOMAIN")
  17. } else {
  18. iplist := []string{"https://ifconfig.me", "http://api.ipify.org", "http://ipinfo.io/ip"}
  19. for _, ipserver := range iplist {
  20. resp, err := http.Get(ipserver)
  21. if err != nil {
  22. continue
  23. }
  24. defer resp.Body.Close()
  25. if resp.StatusCode == http.StatusOK {
  26. bodyBytes, err := ioutil.ReadAll(resp.Body)
  27. if err != nil {
  28. continue
  29. }
  30. endpoint = string(bodyBytes)
  31. break
  32. }
  33. }
  34. if err == nil && endpoint == "" {
  35. err = errors.New("Public Address Not Found.")
  36. }
  37. }
  38. return endpoint, err
  39. }
  40. func DownloadNetclient() error {
  41. /*
  42. // Get the data
  43. resp, err := http.Get("https://github.com/gravitl/netmaker/releases/download/latest/netclient")
  44. if err != nil {
  45. fmt.Println("could not download netclient")
  46. return err
  47. }
  48. defer resp.Body.Close()
  49. // Create the file
  50. out, err := os.Create("/etc/netclient/netclient")
  51. */
  52. if !FileExists("/etc/netclient/netclient") {
  53. _, err := copy("./netclient/netclient", "/etc/netclient/netclient")
  54. if err != nil {
  55. fmt.Println("could not create /etc/netclient")
  56. return err
  57. }
  58. }
  59. //defer out.Close()
  60. // Write the body to file
  61. //_, err = io.Copy(out, resp.Body)
  62. return nil
  63. }
  64. func FileExists(f string) bool {
  65. info, err := os.Stat(f)
  66. if os.IsNotExist(err) {
  67. return false
  68. }
  69. return !info.IsDir()
  70. }
  71. func copy(src, dst string) (int64, error) {
  72. sourceFileStat, err := os.Stat(src)
  73. if err != nil {
  74. return 0, err
  75. }
  76. if !sourceFileStat.Mode().IsRegular() {
  77. return 0, fmt.Errorf("%s is not a regular file", src)
  78. }
  79. source, err := os.Open(src)
  80. if err != nil {
  81. return 0, err
  82. }
  83. defer source.Close()
  84. destination, err := os.Create(dst)
  85. if err != nil {
  86. return 0, err
  87. }
  88. defer destination.Close()
  89. nBytes, err := io.Copy(destination, source)
  90. err = os.Chmod(dst, 0755)
  91. if err != nil {
  92. fmt.Println(err)
  93. }
  94. return nBytes, err
  95. }
  96. func RemoveNetwork(network string) (bool, error) {
  97. _, err := os.Stat("/etc/netclient/netclient")
  98. if err != nil {
  99. fmt.Println("could not find /etc/netclient")
  100. return false, err
  101. }
  102. cmdoutput, err := exec.Command("/etc/netclient/netclient","-c","remove","-n",network).Output()
  103. if err != nil {
  104. fmt.Println(string(cmdoutput))
  105. return false, err
  106. }
  107. fmt.Println("Server removed from network " + network)
  108. return true, err
  109. }
  110. func AddNetwork(network string) (bool, error) {
  111. pubip, err := GetPublicIP()
  112. if err != nil {
  113. fmt.Println("could not get public IP.")
  114. return false, err
  115. }
  116. _, err = os.Stat("/etc/netclient")
  117. if os.IsNotExist(err) {
  118. os.Mkdir("/etc/netclient", 744)
  119. } else if err != nil {
  120. fmt.Println("could not find or create /etc/netclient")
  121. return false, err
  122. }
  123. fmt.Println("Directory is ready.")
  124. token, err := functions.CreateServerToken(network)
  125. if err != nil {
  126. fmt.Println("could not create server token for " + network)
  127. return false, err
  128. }
  129. fmt.Println("Token is ready.")
  130. _, err = os.Stat("/etc/netclient/netclient")
  131. if os.IsNotExist(err) {
  132. err = DownloadNetclient()
  133. fmt.Println("could not download netclient")
  134. if err != nil {
  135. return false, err
  136. }
  137. }
  138. err = os.Chmod("/etc/netclient/netclient", 0755)
  139. if err != nil {
  140. fmt.Println("could not change netclient directory permissions")
  141. return false, err
  142. }
  143. fmt.Println("Client is ready. Running install.")
  144. out, err := exec.Command("/etc/netclient/netclient","-c","install","-t",token,"-name","netmaker","-ip4",pubip).Output()
  145. fmt.Println(string(out))
  146. if err != nil {
  147. return false, errors.New(string(out) + err.Error())
  148. }
  149. fmt.Println("Server added to network " + network)
  150. return true, err
  151. }