serverctl.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  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/ncutils"
  14. "github.com/gravitl/netmaker/servercfg"
  15. )
  16. const SERVER_NETID="servernet"
  17. func GetServerWGConf() (models.IntClient, error) {
  18. var server models.IntClient
  19. collection, err := database.FetchRecords(database.INT_CLIENTS_TABLE_NAME)
  20. if err != nil {
  21. return models.IntClient{}, errors.New("could not find comms server")
  22. }
  23. for _, value := range collection {
  24. json.Unmarshal([]byte(value), &server)
  25. if server.Network == "comms" && server.IsServer == "yes" {
  26. return server, nil
  27. }
  28. }
  29. return models.IntClient{}, errors.New("could not find comms server")
  30. }
  31. func InstallNetclient() error {
  32. netclientPath := ncutils.GetNetclientPath()
  33. if ncutils.IsWindows() {
  34. netclientPath += "\\"
  35. } else {
  36. netclientPath += "/"
  37. }
  38. if !FileExists(netclientPath + "netclient") {
  39. var err error
  40. if ncutils.IsWindows() {
  41. _, err = copy(".\\netclient\\netclient", netclientPath+"netclient")
  42. } else {
  43. _, err = copy("./netclient/netclient", netclientPath+"netclient")
  44. }
  45. if err != nil {
  46. log.Println("could not create " + netclientPath + "netclient")
  47. return err
  48. }
  49. }
  50. return nil
  51. }
  52. func FileExists(f string) bool {
  53. info, err := os.Stat(f)
  54. if os.IsNotExist(err) {
  55. return false
  56. }
  57. return !info.IsDir()
  58. }
  59. func copy(src, dst string) (int64, error) {
  60. sourceFileStat, err := os.Stat(src)
  61. if err != nil {
  62. return 0, err
  63. }
  64. if !sourceFileStat.Mode().IsRegular() {
  65. return 0, errors.New(src + " is not a regular file")
  66. }
  67. source, err := os.Open(src)
  68. if err != nil {
  69. return 0, err
  70. }
  71. defer source.Close()
  72. destination, err := os.Create(dst)
  73. if err != nil {
  74. return 0, err
  75. }
  76. defer destination.Close()
  77. nBytes, err := io.Copy(destination, source)
  78. err = os.Chmod(dst, 0755)
  79. if err != nil {
  80. log.Println(err)
  81. }
  82. return nBytes, err
  83. }
  84. func RemoveNetwork(network string) (bool, error) {
  85. netclientPath := ncutils.GetNetclientPath()
  86. _, err := os.Stat(netclientPath + "/netclient")
  87. if err != nil {
  88. log.Println("could not find " + netclientPath + "/netclient")
  89. return false, err
  90. }
  91. _, err = ncutils.RunCmd(netclientPath+"/netclient leave -n "+network, true)
  92. if err == nil {
  93. log.Println("Server removed from network " + network)
  94. }
  95. return true, err
  96. }
  97. /*
  98. func InitServerNet() error {
  99. func
  100. return nil
  101. }
  102. */
  103. func InitServerNetclient() error {
  104. netclientDir := ncutils.GetNetclientPath()
  105. _, err := os.Stat(netclientDir + "/config")
  106. if os.IsNotExist(err) {
  107. os.MkdirAll(netclientDir+"/config", 744)
  108. } else if err != nil {
  109. log.Println("could not find or create", netclientDir)
  110. return err
  111. }
  112. _, err = os.Stat(netclientDir + "/netclient")
  113. if os.IsNotExist(err) {
  114. err = InstallNetclient()
  115. if err != nil {
  116. return err
  117. }
  118. }
  119. err = os.Chmod(netclientDir+"/netclient", 0755)
  120. if err != nil {
  121. log.Println("could not change netclient binary permissions")
  122. return err
  123. }
  124. return nil
  125. }
  126. func HandleContainedClient() error {
  127. log.SetFlags(log.Flags() &^ (log.Llongfile | log.Lshortfile))
  128. netclientPath := ncutils.GetNetclientPath()
  129. checkinCMD := exec.Command(netclientPath+"/netclient", "checkin", "-n", "all")
  130. if servercfg.GetVerbose() >= 2 {
  131. checkinCMD.Stdout = os.Stdout
  132. }
  133. checkinCMD.Stderr = os.Stderr
  134. err := checkinCMD.Start()
  135. if err != nil {
  136. if servercfg.GetVerbose() >= 2 {
  137. log.Println(err)
  138. }
  139. }
  140. err = checkinCMD.Wait()
  141. if err != nil {
  142. if servercfg.GetVerbose() >= 2 {
  143. log.Println(err)
  144. }
  145. }
  146. if servercfg.GetVerbose() >= 3 {
  147. log.Println("[server netclient]", "completed a checkin call")
  148. }
  149. return nil
  150. }
  151. func AddNetwork(network string) (bool, error) {
  152. pubip, err := servercfg.GetPublicIP()
  153. if err != nil {
  154. log.Println("could not get public IP.")
  155. return false, err
  156. }
  157. netclientPath := ncutils.GetNetclientPath()
  158. token, err := functions.CreateServerToken(network)
  159. if err != nil {
  160. log.Println("could not create server token for " + network)
  161. return false, err
  162. }
  163. functions.PrintUserLog(models.NODE_SERVER_NAME, "executing network join: "+netclientPath+"netclient "+"join "+"-t "+token+" -name "+models.NODE_SERVER_NAME+" -endpoint "+pubip, 0)
  164. var joinCMD *exec.Cmd
  165. if servercfg.IsClientMode() == "contained" {
  166. joinCMD = exec.Command(netclientPath+"/netclient", "join", "-t", token, "-name", models.NODE_SERVER_NAME, "-endpoint", pubip, "-daemon", "off", "-dnson", "no")
  167. } else {
  168. joinCMD = exec.Command(netclientPath+"/netclient", "join", "-t", token, "-name", models.NODE_SERVER_NAME, "-endpoint", pubip)
  169. }
  170. joinCMD.Stdout = os.Stdout
  171. joinCMD.Stderr = os.Stderr
  172. err = joinCMD.Start()
  173. if err != nil {
  174. log.Println(err)
  175. }
  176. log.Println("Waiting for join command to finish...")
  177. err = joinCMD.Wait()
  178. if err != nil {
  179. log.Printf("Command finished with error: %v", err)
  180. return false, err
  181. }
  182. log.Println("Server added to network " + network)
  183. return true, err
  184. }
  185. func IsLeader(node *models.Node) (bool) {
  186. nodes, err := functions.GetSortedNetworkServerNodes(node.Network)
  187. if err != nil {
  188. functions.PrintUserLog("[netmaker]","ERROR: COULD NOT RETRIEVE SERVER NODES. THIS WILL BREAK HOLE PUNCHING.", 0)
  189. return false
  190. }
  191. for _, n := range nodes {
  192. if n.LastModified > time.Now().Add(-1 * time.Minute).Unix() {
  193. return n.Address == node.Address
  194. }
  195. }
  196. return nodes[1].Address == node.Address
  197. }
  198. // == PRIVATE ==
  199. /*
  200. func getUniqueServerIP(currentAddrs []string) (string, error) {
  201. ip, ipnet, err := net.ParseCIDR(servercfg.GetServerNet())
  202. if err != nil {
  203. return "", err
  204. }
  205. offset := true
  206. for ip := ip.Mask(ipnet.Mask); ipnet.Contains(ip); functions.Inc(ip) {
  207. if offset {
  208. offset = false
  209. continue
  210. }
  211. if isIPunique(ip.String(), currentAddrs) {
  212. return ip.String(), nil
  213. }
  214. }
  215. return "", errors.New("failed to get unique server ip")
  216. }
  217. func isIPunique(addr string, currentAddrs []string) bool {
  218. for _, currAddr := range currentAddrs {
  219. if addr == currAddr {
  220. return false
  221. }
  222. }
  223. return true
  224. }
  225. */