migrate.go 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package controller
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "github.com/gravitl/netmaker/database"
  6. "github.com/gravitl/netmaker/logger"
  7. "github.com/gravitl/netmaker/logic"
  8. "github.com/gravitl/netmaker/models"
  9. "github.com/gravitl/netmaker/servercfg"
  10. "golang.org/x/crypto/bcrypt"
  11. )
  12. // swagger:route PUT /api/v1/nodes/migrate nodes migrateNode
  13. //
  14. // Used to migrate a legacy node.
  15. //
  16. // Schemes: https
  17. //
  18. // Security:
  19. // oauth
  20. //
  21. // Responses:
  22. // 200: nodeJoinResponse
  23. func migrate(w http.ResponseWriter, r *http.Request) {
  24. data := models.MigrationData{}
  25. err := json.NewDecoder(r.Body).Decode(&data)
  26. if err != nil {
  27. logger.Log(0, r.Header.Get("user"), "error decoding request body: ", err.Error())
  28. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  29. return
  30. }
  31. var networksToAdd = []string{}
  32. for i := range data.LegacyNodes {
  33. legacyNode := data.LegacyNodes[i]
  34. record, err := database.FetchRecord(database.NODES_TABLE_NAME, legacyNode.ID)
  35. if err != nil {
  36. logger.Log(0, "no record for legacy node", legacyNode.ID, err.Error())
  37. continue
  38. } else {
  39. var oldLegacyNode models.LegacyNode
  40. if err = json.Unmarshal([]byte(record), &oldLegacyNode); err != nil {
  41. logger.Log(0, "error decoding legacy node", err.Error())
  42. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  43. continue
  44. }
  45. if err := bcrypt.CompareHashAndPassword([]byte(oldLegacyNode.Password), []byte(legacyNode.Password)); err != nil {
  46. logger.Log(0, "error decoding legacy password", err.Error())
  47. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "unauthorized"))
  48. continue
  49. }
  50. networksToAdd = append(networksToAdd, oldLegacyNode.Network)
  51. _ = database.DeleteRecord(database.NODES_TABLE_NAME, oldLegacyNode.ID)
  52. }
  53. }
  54. if len(networksToAdd) == 0 {
  55. logger.Log(0, "no valid networks to migrate for host", data.NewHost.Name)
  56. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "unauthorized"))
  57. return
  58. }
  59. if !logic.HostExists(&data.NewHost) {
  60. if err = logic.CreateHost(&data.NewHost); err != nil {
  61. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  62. return
  63. }
  64. }
  65. key, keyErr := logic.RetrievePublicTrafficKey()
  66. if keyErr != nil {
  67. logger.Log(0, "error retrieving key:", keyErr.Error())
  68. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  69. return
  70. }
  71. server := servercfg.GetServerInfo()
  72. server.TrafficKey = key
  73. response := models.RegisterResponse{
  74. ServerConf: server,
  75. RequestedHost: data.NewHost,
  76. }
  77. w.WriteHeader(http.StatusOK)
  78. json.NewEncoder(w).Encode(&response)
  79. logger.Log(0, "successfully migrated host", data.NewHost.Name, data.NewHost.ID.String())
  80. // notify host of changes, peer and node updates
  81. go checkNetRegAndHostUpdate(networksToAdd, &data.NewHost)
  82. }