diff --git a/controllers/node_grpc.go b/controllers/node_grpc.go index 1343ae0e..c5ce418a 100644 --- a/controllers/node_grpc.go +++ b/controllers/node_grpc.go @@ -4,7 +4,6 @@ import ( "context" "encoding/json" "errors" - "strings" nodepb "github.com/gravitl/netmaker/grpc" "github.com/gravitl/netmaker/logger" @@ -22,16 +21,14 @@ type NodeServiceServer struct { func (s *NodeServiceServer) ReadNode(ctx context.Context, req *nodepb.Object) (*nodepb.Object, error) { // convert string id (from proto) to mongoDB ObjectId var err error - var node models.Node - var macAndNetwork = make([]string, 2) - if strings.Contains(req.Data, "###") { - macAndNetwork = strings.Split(req.Data, "###") - if len(macAndNetwork) != 2 { - return nil, errors.New("could not read node, invalid node id given") - } + var reqNode models.Node + err = json.Unmarshal([]byte(req.Data), &reqNode) + if err != nil { + return nil, err } - node, err = logic.GetNodeByIDorMacAddress(req.Data, macAndNetwork[0], macAndNetwork[1]) + var node models.Node + node, err = logic.GetNodeByIDorMacAddress(reqNode.ID, reqNode.MacAddress, reqNode.Network) if err != nil { return nil, err } @@ -138,16 +135,17 @@ func (s *NodeServiceServer) UpdateNode(ctx context.Context, req *nodepb.Object) // NodeServiceServer.DeleteNode - deletes a node and responds over gRPC func (s *NodeServiceServer) DeleteNode(ctx context.Context, req *nodepb.Object) (*nodepb.Object, error) { - nodeID := req.GetData() - var nodeInfo = make([]string, 2) - if strings.Contains(nodeID, "###") { - nodeInfo = strings.Split(nodeID, "###") - if len(nodeInfo) != 2 { - return nil, errors.New("node not found") - } + + var reqNode models.Node + if err := json.Unmarshal([]byte(req.GetData()), &reqNode); err != nil { + return nil, err + } + + node, err := logic.GetNodeByIDorMacAddress(reqNode.ID, reqNode.MacAddress, reqNode.Network) + if err != nil { + return nil, err } - var node, err = logic.GetNodeByIDorMacAddress(nodeID, nodeInfo[0], nodeInfo[1]) err = logic.DeleteNodeByID(&node, true) if err != nil { return nil, err @@ -161,16 +159,13 @@ func (s *NodeServiceServer) DeleteNode(ctx context.Context, req *nodepb.Object) // NodeServiceServer.GetPeers - fetches peers over gRPC func (s *NodeServiceServer) GetPeers(ctx context.Context, req *nodepb.Object) (*nodepb.Object, error) { - nodeID := req.GetData() - var nodeInfo = make([]string, 2) - if strings.Contains(nodeID, "###") { - nodeInfo = strings.Split(nodeID, "###") - if len(nodeInfo) != 2 { - return nil, errors.New("could not fetch peers, invalid node id") - } + + var reqNode models.Node + if err := json.Unmarshal([]byte(req.GetData()), &reqNode); err != nil { + return nil, err } - node, err := logic.GetNodeByIDorMacAddress(nodeID, nodeInfo[0], nodeInfo[1]) + node, err := logic.GetNodeByIDorMacAddress(reqNode.ID, reqNode.MacAddress, reqNode.Network) if err != nil { return nil, err } @@ -200,20 +195,12 @@ func (s *NodeServiceServer) GetExtPeers(ctx context.Context, req *nodepb.Object) // Initiate a NodeItem type to write decoded data to //data := &models.PeersResponse{} // collection.Find returns a cursor for our (empty) query - macAndNetwork := strings.Split(req.Data, "###") - if len(macAndNetwork) != 2 { - return nil, errors.New("did not receive valid node id when fetching ext peers") - } - nodeID := req.GetData() - var nodeInfo = make([]string, 2) - if strings.Contains(nodeID, "###") { - nodeInfo = strings.Split(nodeID, "###") - if len(nodeInfo) != 2 { - return nil, errors.New("could not fetch peers, invalid node id") - } + var reqNode models.Node + if err := json.Unmarshal([]byte(req.GetData()), &reqNode); err != nil { + return nil, err } - node, err := logic.GetNodeByIDorMacAddress(nodeID, nodeInfo[0], nodeInfo[1]) + node, err := logic.GetNodeByIDorMacAddress(reqNode.ID, reqNode.MacAddress, reqNode.Network) if err != nil { return nil, err } diff --git a/netclient/auth/auth.go b/netclient/auth/auth.go index fdfedb78..f74cc903 100644 --- a/netclient/auth/auth.go +++ b/netclient/auth/auth.go @@ -71,7 +71,7 @@ func AutoLogin(client nodepb.NodeServiceClient, network string) error { return err } tokenstring := []byte(res.Data) - err = os.WriteFile(home+"nettoken-"+network, tokenstring, 0644) + err = os.WriteFile(home+"nettoken-"+network, tokenstring, 0644) // TODO: Proper permissions? if err != nil { return err } diff --git a/netclient/functions/checkin.go b/netclient/functions/checkin.go index 185be82e..1b6e481e 100644 --- a/netclient/functions/checkin.go +++ b/netclient/functions/checkin.go @@ -186,9 +186,15 @@ func Pull(network string, manual bool) (*models.Node, error) { return nil, err } + data, err := json.Marshal(&node) + if err != nil { + ncutils.PrintLog("Failed to parse node config: "+err.Error(), 1) + return nil, err + } + req := &nodepb.Object{ - Data: node.MacAddress + "###" + node.Network, - Type: nodepb.STRING_TYPE, + Data: string(data), + Type: nodepb.NODE_TYPE, } readres, err := wcclient.ReadNode(ctx, req, grpc.Header(&header)) diff --git a/netclient/functions/common.go b/netclient/functions/common.go index 134e1d9c..48f351f9 100644 --- a/netclient/functions/common.go +++ b/netclient/functions/common.go @@ -1,6 +1,7 @@ package functions import ( + "encoding/json" "errors" "fmt" "log" @@ -165,18 +166,21 @@ func LeaveNetwork(network string) error { log.Printf("Failed to authenticate: %v", err) } else { // handle client side var header metadata.MD - _, err = wcclient.DeleteNode( - ctx, - &nodepb.Object{ - Data: node.ID, - Type: nodepb.STRING_TYPE, - }, - grpc.Header(&header), - ) - if err != nil { - ncutils.PrintLog("encountered error deleting node: "+err.Error(), 1) - } else { - ncutils.PrintLog("removed machine from "+node.Network+" network on remote server", 1) + nodeData, err := json.Marshal(&node) + if err == nil { + _, err = wcclient.DeleteNode( + ctx, + &nodepb.Object{ + Data: string(nodeData), + Type: nodepb.NODE_TYPE, + }, + grpc.Header(&header), + ) + if err != nil { + ncutils.PrintLog("encountered error deleting node: "+err.Error(), 1) + } else { + ncutils.PrintLog("removed machine from "+node.Network+" network on remote server", 1) + } } } } diff --git a/netclient/functions/list.go b/netclient/functions/list.go index f5a0d92b..5cc836ba 100644 --- a/netclient/functions/list.go +++ b/netclient/functions/list.go @@ -98,9 +98,14 @@ func getPeers(network string) ([]Peer, error) { // Instantiate the BlogServiceClient with our client connection to the server wcclient = nodepb.NewNodeServiceClient(conn) + nodeData, err := json.Marshal(&nodecfg) + if err != nil { + return []Peer{}, fmt.Errorf("could not parse config node on network %s : %w", network, err) + } + req := &nodepb.Object{ - Data: nodecfg.MacAddress + "###" + nodecfg.Network, - Type: nodepb.STRING_TYPE, + Data: string(nodeData), + Type: nodepb.NODE_TYPE, } ctx, err := auth.SetJWT(wcclient, network) diff --git a/netclient/server/grpc.go b/netclient/server/grpc.go index 5bb1c213..96a7da92 100644 --- a/netclient/server/grpc.go +++ b/netclient/server/grpc.go @@ -101,9 +101,15 @@ func GetPeers(macaddress string, network string, server string, dualstack bool, // Instantiate the BlogServiceClient with our client connection to the server wcclient = nodepb.NewNodeServiceClient(conn) + nodeData, err := json.Marshal(&nodecfg) + if err != nil { + ncutils.PrintLog("could not parse node data from config during peer fetch for network "+network, 1) + return peers, hasGateway, gateways, err + } + req := &nodepb.Object{ - Data: macaddress + "###" + network, - Type: nodepb.STRING_TYPE, + Data: string(nodeData), + Type: nodepb.NODE_TYPE, } ctx, err := auth.SetJWT(wcclient, network) @@ -274,9 +280,15 @@ func GetExtPeers(macaddress string, network string, server string, dualstack boo // Instantiate the BlogServiceClient with our client connection to the server wcclient = nodepb.NewNodeServiceClient(conn) + nodeData, err := json.Marshal(&nodecfg) + if err != nil { + ncutils.PrintLog("could not parse node data from config during peer fetch for network "+network, 1) + return peers, err + } + req := &nodepb.Object{ - Data: macaddress + "###" + network, - Type: nodepb.STRING_TYPE, + Data: string(nodeData), + Type: nodepb.NODE_TYPE, } ctx, err := auth.SetJWT(wcclient, network)