From 65fdc723631f53477aa00f448f42d2dd401fec3e Mon Sep 17 00:00:00 2001 From: 0xdcarns Date: Mon, 13 Mar 2023 19:51:12 -0400 Subject: [PATCH] adapted migrate to easier registration --- controllers/migrate.go | 108 +++++++++++++++++------------------------ controllers/node.go | 2 +- models/migrate.go | 6 +-- 3 files changed, 49 insertions(+), 67 deletions(-) diff --git a/controllers/migrate.go b/controllers/migrate.go index 736a2a35..319e7fb1 100644 --- a/controllers/migrate.go +++ b/controllers/migrate.go @@ -2,19 +2,17 @@ package controller import ( "encoding/json" - "io" "net/http" - "strings" - "github.com/gorilla/mux" "github.com/gravitl/netmaker/database" "github.com/gravitl/netmaker/logger" "github.com/gravitl/netmaker/logic" "github.com/gravitl/netmaker/models" + "github.com/gravitl/netmaker/servercfg" "golang.org/x/crypto/bcrypt" ) -// swagger:route PUT /api/nodes/{network}/{nodeid}/migrate nodes migrateNode +// swagger:route PUT /api/v1/nodes/migrate nodes migrateNode // // Used to migrate a legacy node. // @@ -26,7 +24,6 @@ import ( // Responses: // 200: nodeJoinResponse func migrate(w http.ResponseWriter, r *http.Request) { - // we decode our body request params data := models.MigrationData{} err := json.NewDecoder(r.Body).Decode(&data) if err != nil { @@ -34,70 +31,55 @@ func migrate(w http.ResponseWriter, r *http.Request) { logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest")) return } - params := mux.Vars(r) - //check authorization - record, err := database.FetchRecord(database.NODES_TABLE_NAME, data.LegacyNodeID) - if err != nil { - logger.Log(0, "no record for legacy node", data.LegacyNodeID, err.Error()) - logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest")) - return + + var networksToAdd = []string{} + for i := range data.LegacyNodes { + legacyNode := data.LegacyNodes[i] + record, err := database.FetchRecord(database.NODES_TABLE_NAME, legacyNode.ID) + if err != nil { + logger.Log(0, "no record for legacy node", legacyNode.ID, err.Error()) + continue + } else { + var oldLegacyNode models.LegacyNode + if err = json.Unmarshal([]byte(record), &oldLegacyNode); err != nil { + logger.Log(0, "error decoding legacy node", err.Error()) + logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest")) + continue + } + if err := bcrypt.CompareHashAndPassword([]byte(oldLegacyNode.Password), []byte(data.Password)); err != nil { + logger.Log(0, "error decoding legacy password", err.Error()) + logic.ReturnErrorResponse(w, r, logic.FormatError(err, "unauthorized")) + continue + } + networksToAdd = append(networksToAdd, oldLegacyNode.Network) + _ = database.DeleteRecord(database.NODES_TABLE_NAME, oldLegacyNode.ID) + } } - var legacyNode models.LegacyNode - if err = json.Unmarshal([]byte(record), &legacyNode); err != nil { - logger.Log(0, "error decoding legacy node", err.Error()) - logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest")) - return - } - if err := bcrypt.CompareHashAndPassword([]byte(legacyNode.Password), []byte(data.Password)); err != nil { - logger.Log(0, "error decoding legacy password", err.Error()) + if len(networksToAdd) == 0 { + logger.Log(0, "no valid networks to migrate for host", data.NewHost.Name, err.Error()) logic.ReturnErrorResponse(w, r, logic.FormatError(err, "unauthorized")) return } - network, err := logic.GetNetwork(params["network"]) - if err != nil { - logger.Log(0, "error retrieving network: ", err.Error()) - logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest")) - return - } - key, err := logic.CreateAccessKey(models.AccessKey{}, network) - if err != nil { - logger.Log(0, "error creating key: ", err.Error()) - logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest")) - return - } - data.JoinData.Key = key.Value - payload, err := json.Marshal(data.JoinData) - if err != nil { - logger.Log(0, "error encoding data: ", err.Error()) - logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest")) - return - } - r.Body = io.NopCloser(strings.NewReader(string(payload))) - r.ContentLength = int64(len(string(payload))) - logger.Log(3, "deleteing legacy node", data.LegacyNodeID, legacyNode.ID, legacyNode.Name) - if err := database.DeleteRecord(database.NODES_TABLE_NAME, data.LegacyNodeID); err != nil { - logger.Log(0, "error deleting legacy node", legacyNode.Name, err.Error()) - } - createNode(w, r) - //newly created node has same node id as legacy node allowing using legacyNode.ID in gateway creation - logger.Log(3, "re-creating legacy gateways") - if legacyNode.IsIngressGateway == "yes" { - if _, err := logic.CreateIngressGateway(legacyNode.Network, legacyNode.ID, false); err != nil { - logger.Log(0, "error creating ingress gateway during migration", err.Error()) + if !logic.HostExists(&data.NewHost) { + if err = logic.CreateHost(&data.NewHost); err != nil { + logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest")) + return } } - if legacyNode.IsEgressGateway == "yes" { - if _, err := logic.CreateEgressGateway(legacyNode.EgressGatewayRequest); err != nil { - logger.Log(0, "error creating egress gateway during migration", err.Error()) - } + key, keyErr := logic.RetrievePublicTrafficKey() + if keyErr != nil { + logger.Log(0, "error retrieving key:", keyErr.Error()) + logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal")) + return } - if legacyNode.IsRelay == "yes" { - if _, _, err := logic.CreateRelay(models.RelayRequest{ - NodeID: legacyNode.ID, - NetID: legacyNode.Network, - RelayAddrs: legacyNode.RelayAddrs, - }); err != nil { - logger.Log(0, "error creating relay during migration", err.Error()) - } + server := servercfg.GetServerInfo() + server.TrafficKey = key + response := models.RegisterResponse{ + ServerConf: server, + RequestedHost: data.NewHost, } + w.WriteHeader(http.StatusOK) + json.NewEncoder(w).Encode(&response) + // notify host of changes, peer and node updates + go checkNetRegAndHostUpdate(networksToAdd, &data.NewHost) } diff --git a/controllers/node.go b/controllers/node.go index 9afde637..60ff2040 100644 --- a/controllers/node.go +++ b/controllers/node.go @@ -26,7 +26,6 @@ func nodeHandlers(r *mux.Router) { r.HandleFunc("/api/nodes/{network}", authorize(false, true, "network", http.HandlerFunc(getNetworkNodes))).Methods(http.MethodGet) r.HandleFunc("/api/nodes/{network}/{nodeid}", authorize(true, true, "node", http.HandlerFunc(getNode))).Methods(http.MethodGet) r.HandleFunc("/api/nodes/{network}/{nodeid}", authorize(false, true, "node", http.HandlerFunc(updateNode))).Methods(http.MethodPut) - r.HandleFunc("/api/nodes/{network}/{nodeid}/migrate", migrate).Methods(http.MethodPost) r.HandleFunc("/api/nodes/{network}/{nodeid}", authorize(true, true, "node", http.HandlerFunc(deleteNode))).Methods(http.MethodDelete) r.HandleFunc("/api/nodes/{network}/{nodeid}/createrelay", authorize(false, true, "user", http.HandlerFunc(createRelay))).Methods(http.MethodPost) r.HandleFunc("/api/nodes/{network}/{nodeid}/deleterelay", authorize(false, true, "user", http.HandlerFunc(deleteRelay))).Methods(http.MethodDelete) @@ -37,6 +36,7 @@ func nodeHandlers(r *mux.Router) { r.HandleFunc("/api/nodes/{network}/{nodeid}", authorize(true, true, "node", http.HandlerFunc(updateNode))).Methods(http.MethodPost) r.HandleFunc("/api/nodes/{network}", nodeauth(checkFreeTierLimits(node_l, http.HandlerFunc(createNode)))).Methods(http.MethodPost) r.HandleFunc("/api/nodes/adm/{network}/authenticate", authenticate).Methods(http.MethodPost) + r.HandleFunc("/api/v1/nodes/migrate", migrate).Methods(http.MethodPost) } // swagger:route POST /api/nodes/adm/{network}/authenticate nodes authenticate diff --git a/models/migrate.go b/models/migrate.go index e9b7cbb5..0eb018ca 100644 --- a/models/migrate.go +++ b/models/migrate.go @@ -2,7 +2,7 @@ package models // MigrationData struct needed to create new v0.18.0 node from v.0.17.X node type MigrationData struct { - JoinData JoinData - LegacyNodeID string - Password string + NewHost Host + LegacyNodes []LegacyNode + Password string }