migrate.go 2.8 KB

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