serverctl.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. package serverctl
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "io"
  6. "log"
  7. "os"
  8. "github.com/gravitl/netmaker/database"
  9. "github.com/gravitl/netmaker/logic"
  10. "github.com/gravitl/netmaker/models"
  11. nccommand "github.com/gravitl/netmaker/netclient/command"
  12. "github.com/gravitl/netmaker/netclient/config"
  13. "github.com/gravitl/netmaker/netclient/ncutils"
  14. "github.com/gravitl/netmaker/servercfg"
  15. )
  16. // GetServerWGConf - gets the server WG configuration
  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. // FileExists - checks if local file exists
  32. func FileExists(f string) bool {
  33. info, err := os.Stat(f)
  34. if os.IsNotExist(err) {
  35. return false
  36. }
  37. return !info.IsDir()
  38. }
  39. func copy(src, dst string) (int64, error) {
  40. sourceFileStat, err := os.Stat(src)
  41. if err != nil {
  42. return 0, err
  43. }
  44. if !sourceFileStat.Mode().IsRegular() {
  45. return 0, errors.New(src + " is not a regular file")
  46. }
  47. source, err := os.Open(src)
  48. if err != nil {
  49. return 0, err
  50. }
  51. defer source.Close()
  52. destination, err := os.Create(dst)
  53. if err != nil {
  54. return 0, err
  55. }
  56. defer destination.Close()
  57. nBytes, err := io.Copy(destination, source)
  58. err = os.Chmod(dst, 0755)
  59. if err != nil {
  60. log.Println(err)
  61. }
  62. return nBytes, err
  63. }
  64. // RemoveNetwork - removes a network locally on server
  65. func RemoveNetwork(network string) (bool, error) {
  66. err := logic.ServerLeave(servercfg.GetNodeID(), network)
  67. return true, err
  68. }
  69. // InitServerNetclient - intializes the server netclient
  70. func InitServerNetclient() error {
  71. netclientDir := ncutils.GetNetclientPath()
  72. _, err := os.Stat(netclientDir + "/config")
  73. if os.IsNotExist(err) {
  74. os.MkdirAll(netclientDir+"/config", 744)
  75. } else if err != nil {
  76. log.Println("[netmaker] could not find or create", netclientDir)
  77. return err
  78. }
  79. return nil
  80. }
  81. // HandleContainedClient - function for checkins on server
  82. func HandleContainedClient() error {
  83. servernets, err := models.GetNetworks()
  84. if err != nil && !database.IsEmptyRecord(err) {
  85. return err
  86. }
  87. if len(servernets) > 0 {
  88. if err != nil {
  89. return err
  90. }
  91. log.SetFlags(log.Flags() &^ (log.Llongfile | log.Lshortfile))
  92. err := SyncNetworks(servernets)
  93. if err != nil && servercfg.GetVerbose() >= 1 {
  94. log.Printf("[netmaker] error syncing networks %s \n", err)
  95. }
  96. err = nccommand.CheckIn(config.ClientConfig{Network: "all"})
  97. if err != nil && servercfg.GetVerbose() >= 1 {
  98. log.Printf("[netmaker] error occurred %s \n", err)
  99. }
  100. if servercfg.GetVerbose() >= 3 {
  101. log.Println("[netmaker]", "completed a checkin call")
  102. }
  103. }
  104. return nil
  105. }
  106. // SyncNetworks - syncs the networks for servers
  107. func SyncNetworks(servernets []models.Network) error {
  108. localnets, err := ncutils.GetSystemNetworks()
  109. if err != nil {
  110. return err
  111. }
  112. // check networks to join
  113. for _, servernet := range servernets {
  114. exists := false
  115. for _, localnet := range localnets {
  116. if servernet.NetID == localnet {
  117. exists = true
  118. }
  119. }
  120. if !exists {
  121. success, err := AddNetwork(servernet.NetID)
  122. if err != nil || !success {
  123. if err == nil {
  124. err = errors.New("network add failed for " + servernet.NetID)
  125. }
  126. if servercfg.GetVerbose() >= 1 {
  127. log.Printf("[netmaker] error adding network %s during sync %s \n", servernet.NetID, err)
  128. }
  129. }
  130. }
  131. }
  132. // check networks to leave
  133. for _, localnet := range localnets {
  134. exists := false
  135. for _, servernet := range servernets {
  136. if servernet.NetID == localnet {
  137. exists = true
  138. }
  139. }
  140. if !exists {
  141. success, err := RemoveNetwork(localnet)
  142. if err != nil || !success {
  143. if err == nil {
  144. err = errors.New("network delete failed for " + localnet)
  145. }
  146. log.Printf("[netmaker] error removing network %s during sync %s \n", localnet, err)
  147. }
  148. }
  149. }
  150. return nil
  151. }
  152. // AddNetwork - add a network to server in client mode
  153. func AddNetwork(network string) (bool, error) {
  154. err := logic.ServerJoin(config.ClientConfig{
  155. Network: network,
  156. Daemon: "off",
  157. Node: models.Node{
  158. Network: network,
  159. IsServer: "yes",
  160. DNSOn: "no",
  161. Name: models.NODE_SERVER_NAME,
  162. MacAddress: servercfg.GetNodeID(),
  163. },
  164. }, "")
  165. log.Println("[netmaker] Server added to network " + network)
  166. return true, err
  167. }