migrate.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package migrate
  2. import (
  3. "encoding/json"
  4. "log"
  5. "golang.org/x/exp/slog"
  6. "github.com/gravitl/netmaker/database"
  7. "github.com/gravitl/netmaker/logger"
  8. "github.com/gravitl/netmaker/logic"
  9. "github.com/gravitl/netmaker/models"
  10. "github.com/gravitl/netmaker/servercfg"
  11. )
  12. // Run - runs all migrations
  13. func Run() {
  14. updateEnrollmentKeys()
  15. assignSuperAdmin()
  16. updateHosts()
  17. updateNodes()
  18. }
  19. func assignSuperAdmin() {
  20. users, err := logic.GetUsers()
  21. if err != nil || len(users) == 0 {
  22. return
  23. }
  24. if ok, _ := logic.HasSuperAdmin(); ok {
  25. return
  26. }
  27. createdSuperAdmin := false
  28. owner := servercfg.GetOwnerEmail()
  29. if owner != "" {
  30. user, err := logic.GetUser(owner)
  31. if err != nil {
  32. log.Fatal("error getting user", "user", owner, "error", err.Error())
  33. }
  34. user.IsSuperAdmin = true
  35. user.IsAdmin = false
  36. err = logic.UpsertUser(*user)
  37. if err != nil {
  38. log.Fatal(
  39. "error updating user to superadmin",
  40. "user",
  41. user.UserName,
  42. "error",
  43. err.Error(),
  44. )
  45. }
  46. return
  47. }
  48. for _, u := range users {
  49. if u.IsAdmin {
  50. user, err := logic.GetUser(u.UserName)
  51. if err != nil {
  52. slog.Error("error getting user", "user", u.UserName, "error", err.Error())
  53. continue
  54. }
  55. user.IsSuperAdmin = true
  56. user.IsAdmin = false
  57. err = logic.UpsertUser(*user)
  58. if err != nil {
  59. slog.Error(
  60. "error updating user to superadmin",
  61. "user",
  62. user.UserName,
  63. "error",
  64. err.Error(),
  65. )
  66. continue
  67. } else {
  68. createdSuperAdmin = true
  69. }
  70. break
  71. }
  72. }
  73. if !createdSuperAdmin {
  74. slog.Error("failed to create superadmin!!")
  75. }
  76. }
  77. func updateEnrollmentKeys() {
  78. rows, err := database.FetchRecords(database.ENROLLMENT_KEYS_TABLE_NAME)
  79. if err != nil {
  80. return
  81. }
  82. for _, row := range rows {
  83. var key models.EnrollmentKey
  84. if err = json.Unmarshal([]byte(row), &key); err != nil {
  85. continue
  86. }
  87. if key.Type != models.Undefined {
  88. logger.Log(2, "migration: enrollment key type already set")
  89. continue
  90. } else {
  91. logger.Log(2, "migration: updating enrollment key type")
  92. if key.Unlimited {
  93. key.Type = models.Unlimited
  94. } else if key.UsesRemaining > 0 {
  95. key.Type = models.Uses
  96. } else if !key.Expiration.IsZero() {
  97. key.Type = models.TimeExpiration
  98. }
  99. }
  100. data, err := json.Marshal(key)
  101. if err != nil {
  102. logger.Log(0, "migration: marshalling enrollment key: "+err.Error())
  103. continue
  104. }
  105. if err = database.Insert(key.Value, string(data), database.ENROLLMENT_KEYS_TABLE_NAME); err != nil {
  106. logger.Log(0, "migration: inserting enrollment key: "+err.Error())
  107. continue
  108. }
  109. }
  110. }
  111. func updateHosts() {
  112. rows, err := database.FetchRecords(database.HOSTS_TABLE_NAME)
  113. if err != nil {
  114. logger.Log(0, "failed to fetch database records for hosts")
  115. }
  116. for _, row := range rows {
  117. var host models.Host
  118. if err := json.Unmarshal([]byte(row), &host); err != nil {
  119. logger.Log(0, "failed to unmarshal database row to host", "row", row)
  120. continue
  121. }
  122. if host.PersistentKeepalive == 0 {
  123. host.PersistentKeepalive = models.DefaultPersistentKeepAlive
  124. if err := logic.UpsertHost(&host); err != nil {
  125. logger.Log(0, "failed to upsert host", host.ID.String())
  126. continue
  127. }
  128. }
  129. }
  130. }
  131. func updateNodes() {
  132. nodes, err := logic.GetAllNodes()
  133. if err != nil {
  134. slog.Error("migration failed for nodes", "error", err)
  135. return
  136. }
  137. for _, node := range nodes {
  138. if node.IsEgressGateway {
  139. egressRanges, update := removeInterGw(node.EgressGatewayRanges)
  140. if update {
  141. node.EgressGatewayRequest.Ranges = egressRanges
  142. node.EgressGatewayRanges = egressRanges
  143. logic.UpsertNode(&node)
  144. }
  145. }
  146. }
  147. }
  148. func removeInterGw(egressRanges []string) ([]string, bool) {
  149. update := false
  150. for i := len(egressRanges) - 1; i >= 0; i-- {
  151. if egressRanges[i] == "0.0.0.0/0" || egressRanges[i] == "::/0" {
  152. update = true
  153. egressRanges = append(egressRanges[:i], egressRanges[i+1:]...)
  154. }
  155. }
  156. return egressRanges, update
  157. }