serverctl.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. package serverctl
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "io"
  6. "log"
  7. "net"
  8. "os"
  9. "strings"
  10. "github.com/gravitl/netmaker/database"
  11. "github.com/gravitl/netmaker/logic"
  12. "github.com/gravitl/netmaker/models"
  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. logic.Log(err.Error(), 1)
  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. logic.Log("[netmaker] could not find or create "+netclientDir, 1)
  77. return err
  78. }
  79. return nil
  80. }
  81. // HandleContainedClient - function for checkins on server
  82. func HandleContainedClient() error {
  83. servernets, err := logic.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. err := SyncNetworks(servernets)
  92. if err != nil {
  93. logic.Log("error syncing networks: "+err.Error(), 1)
  94. }
  95. for _, serverNet := range servernets {
  96. err = logic.ServerCheckin(servercfg.GetNodeID(), serverNet.NetID)
  97. if err != nil {
  98. logic.Log("error occurred during server checkin: "+err.Error(), 1)
  99. } else {
  100. logic.Log("completed peers check of network "+serverNet.NetID, 3)
  101. }
  102. }
  103. // logic.Log("completed a checkin call", 3)
  104. }
  105. return nil
  106. }
  107. // SyncNetworks - syncs the networks for servers
  108. func SyncNetworks(servernets []models.Network) error {
  109. localnets, err := net.Interfaces()
  110. if err != nil {
  111. return err
  112. }
  113. // check networks to join
  114. for _, servernet := range servernets {
  115. exists := false
  116. for _, localnet := range localnets {
  117. if servernet.DefaultInterface == localnet.Name {
  118. exists = true
  119. }
  120. }
  121. if !exists {
  122. success, err := AddNetwork(servernet.NetID)
  123. if err != nil || !success {
  124. if err == nil {
  125. err = errors.New("network add failed for " + servernet.NetID)
  126. }
  127. if servercfg.GetVerbose() >= 1 {
  128. if !strings.Contains(err.Error(), "macaddress_unique") { // ignore macaddress unique error throws
  129. log.Printf("[netmaker] error adding network %s during sync %s \n", servernet.NetID, err)
  130. }
  131. }
  132. }
  133. }
  134. }
  135. // check networks to leave
  136. for _, localnet := range localnets {
  137. var exists = ""
  138. for _, servernet := range servernets {
  139. if servernet.DefaultInterface == localnet.Name {
  140. exists = servernet.NetID
  141. }
  142. }
  143. if exists != "" {
  144. success, err := RemoveNetwork(exists)
  145. if err != nil || !success {
  146. if err == nil {
  147. err = errors.New("network delete failed for " + exists)
  148. }
  149. if servercfg.GetVerbose() >= 1 {
  150. log.Printf("[netmaker] error removing network %s during sync %s \n", exists, err)
  151. }
  152. }
  153. }
  154. }
  155. return nil
  156. }
  157. // AddNetwork - add a network to server in client mode
  158. func AddNetwork(network string) (bool, error) {
  159. var err = logic.ServerJoin(network, servercfg.GetNodeID(), "")
  160. return true, err
  161. }