| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 | package controllerimport (	"context"	"encoding/json"	"errors"	"strings"	nodepb "github.com/gravitl/netmaker/grpc"	"github.com/gravitl/netmaker/logger"	"github.com/gravitl/netmaker/logic"	"github.com/gravitl/netmaker/models"	"github.com/gravitl/netmaker/servercfg")// NodeServiceServer - represents the service server for gRPCtype NodeServiceServer struct {	nodepb.UnimplementedNodeServiceServer}// NodeServiceServer.ReadNode - reads node and responds with gRPCfunc (s *NodeServiceServer) ReadNode(ctx context.Context, req *nodepb.Object) (*nodepb.Object, error) {	var node, err = getNewOrLegacyNode(req.Data)	if err != nil {		return nil, err	}	node.NetworkSettings, err = logic.GetNetworkSettings(node.Network)	if err != nil {		return nil, err	}	node.SetLastCheckIn()	// Cast to ReadNodeRes type	nodeData, errN := json.Marshal(&node)	if errN != nil {		return nil, err	}	logic.UpdateNode(&node, &node)	response := &nodepb.Object{		Data: string(nodeData),		Type: nodepb.NODE_TYPE,	}	return response, nil}// NodeServiceServer.CreateNode - creates a node and responds over gRPCfunc (s *NodeServiceServer) CreateNode(ctx context.Context, req *nodepb.Object) (*nodepb.Object, error) {	var node = models.Node{}	var err error	data := req.GetData()	if err := json.Unmarshal([]byte(data), &node); err != nil {		return nil, err	}	validKey := logic.IsKeyValid(node.Network, node.AccessKey)	node.NetworkSettings, err = logic.GetNetworkSettings(node.Network)	if err != nil {		return nil, err	}	if !validKey {		if node.NetworkSettings.AllowManualSignUp == "yes" {			node.IsPending = "yes"		} else {			return nil, errors.New("invalid key, and network does not allow no-key signups")		}	}	err = logic.CreateNode(&node)	if err != nil {		return nil, err	}	nodeData, errN := json.Marshal(&node)	if errN != nil {		return nil, err	}	response := &nodepb.Object{		Data: string(nodeData),		Type: nodepb.NODE_TYPE,	}	err = logic.SetNetworkNodesLastModified(node.Network)	if err != nil {		return nil, err	}	return response, nil}// NodeServiceServer.UpdateNode updates a node and responds over gRPCfunc (s *NodeServiceServer) UpdateNode(ctx context.Context, req *nodepb.Object) (*nodepb.Object, error) {	var newnode models.Node	if err := json.Unmarshal([]byte(req.GetData()), &newnode); err != nil {		return nil, err	}	node, err := logic.GetNodeByIDorMacAddress(newnode.ID, newnode.MacAddress, newnode.Network)	if err != nil {		return nil, err	}	if !servercfg.GetRce() {		newnode.PostDown = node.PostDown		newnode.PostUp = node.PostUp	}	err = logic.UpdateNode(&node, &newnode)	if err != nil {		return nil, err	}	newnode.NetworkSettings, err = logic.GetNetworkSettings(node.Network)	if err != nil {		return nil, err	}	nodeData, errN := json.Marshal(&newnode)	if errN != nil {		return nil, err	}	return &nodepb.Object{		Data: string(nodeData),		Type: nodepb.NODE_TYPE,	}, nil}// NodeServiceServer.DeleteNode - deletes a node and responds over gRPCfunc (s *NodeServiceServer) DeleteNode(ctx context.Context, req *nodepb.Object) (*nodepb.Object, error) {	var node, err = getNewOrLegacyNode(req.Data)	if err != nil {		return nil, err	}	err = logic.DeleteNodeByID(&node, true)	if err != nil {		return nil, err	}	return &nodepb.Object{		Data: "success",		Type: nodepb.STRING_TYPE,	}, nil}// NodeServiceServer.GetPeers - fetches peers over gRPCfunc (s *NodeServiceServer) GetPeers(ctx context.Context, req *nodepb.Object) (*nodepb.Object, error) {	var node, err = getNewOrLegacyNode(req.Data)	if err != nil {		return nil, err	}	if node.IsServer == "yes" && logic.IsLeader(&node) {		logic.SetNetworkServerPeers(&node)	}	excludeIsRelayed := node.IsRelay != "yes"	var relayedNode string	if node.IsRelayed == "yes" {		relayedNode = node.Address	}	peers, err := logic.GetPeersList(node.Network, excludeIsRelayed, relayedNode)	if err != nil {		return nil, err	}	peersData, err := json.Marshal(&peers)	logger.Log(3, node.Address, "checked in successfully")	return &nodepb.Object{		Data: string(peersData),		Type: nodepb.NODE_TYPE,	}, err}// NodeServiceServer.GetExtPeers - returns ext peers for a gateway nodefunc (s *NodeServiceServer) GetExtPeers(ctx context.Context, req *nodepb.Object) (*nodepb.Object, error) {	var node, err = getNewOrLegacyNode(req.Data)	if err != nil {		return nil, err	}	peers, err := logic.GetExtPeersList(&node)	if err != nil {		return nil, err	}	var extPeers []models.Node	for i := 0; i < len(peers); i++ {		extPeers = append(extPeers, models.Node{			Address:             peers[i].Address,			Address6:            peers[i].Address6,			Endpoint:            peers[i].Endpoint,			PublicKey:           peers[i].PublicKey,			PersistentKeepalive: peers[i].KeepAlive,			ListenPort:          peers[i].ListenPort,			LocalAddress:        peers[i].LocalAddress,		})	}	extData, err := json.Marshal(&extPeers)	if err != nil {		return nil, err	}	return &nodepb.Object{		Data: string(extData),		Type: nodepb.EXT_PEER,	}, nil}// == private methods ==func getNewOrLegacyNode(data string) (models.Node, error) {	var reqNode, node models.Node	var err error	if err = json.Unmarshal([]byte(data), &reqNode); err != nil {		oldID := strings.Split(data, "###") // handle legacy client IDs		if len(oldID) == 2 {			if node, err = logic.GetNodeByIDorMacAddress(reqNode.ID, oldID[0], oldID[1]); err != nil {				return models.Node{}, err			}		} else {			return models.Node{}, err		}	} else {		node, err = logic.GetNodeByIDorMacAddress(reqNode.ID, reqNode.MacAddress, reqNode.Network)		if err != nil {			return models.Node{}, err		}	}	return node, nil}
 |