diff --git a/controllers/node.go b/controllers/node.go index e6156382..100b8efd 100644 --- a/controllers/node.go +++ b/controllers/node.go @@ -566,7 +566,7 @@ func deleteNode(w http.ResponseWriter, r *http.Request) { returnErrorResponse(w, r, formatError(err, "badrequest")) return } - err = logic.DeleteNodeByMacAddress(&node, false) + err = logic.DeleteNodeByID(&node, false) if err != nil { returnErrorResponse(w, r, formatError(err, "internal")) return diff --git a/controllers/node_grpc.go b/controllers/node_grpc.go index e0dddae4..1343ae0e 100644 --- a/controllers/node_grpc.go +++ b/controllers/node_grpc.go @@ -139,12 +139,16 @@ 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 = strings.Split(nodeID, "###") - if len(nodeInfo) != 2 { - return nil, errors.New("node not found") + 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 node, err = logic.GetNode(nodeInfo[0], nodeInfo[1]) - err = logic.DeleteNodeByMacAddress(&node, true) + + var node, err = logic.GetNodeByIDorMacAddress(nodeID, nodeInfo[0], nodeInfo[1]) + err = logic.DeleteNodeByID(&node, true) if err != nil { return nil, err } @@ -157,37 +161,38 @@ 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) { - macAndNetwork := strings.Split(req.Data, "###") - if len(macAndNetwork) == 2 { - // TODO: Make constant and new variable for isServer - node, err := logic.GetNode(macAndNetwork[0], macAndNetwork[1]) - if err != nil { - return nil, err + 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") } - 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(macAndNetwork[1], 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 } + + node, err := logic.GetNodeByIDorMacAddress(nodeID, nodeInfo[0], nodeInfo[1]) + 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: "", + Data: string(peersData), Type: nodepb.NODE_TYPE, - }, errors.New("could not fetch peers, invalid node id") + }, err } // NodeServiceServer.GetExtPeers - returns ext peers for a gateway node @@ -199,7 +204,21 @@ func (s *NodeServiceServer) GetExtPeers(ctx context.Context, req *nodepb.Object) if len(macAndNetwork) != 2 { return nil, errors.New("did not receive valid node id when fetching ext peers") } - peers, err := logic.GetExtPeersList(macAndNetwork[0], macAndNetwork[1]) + 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") + } + } + + node, err := logic.GetNodeByIDorMacAddress(nodeID, nodeInfo[0], nodeInfo[1]) + if err != nil { + return nil, err + } + + peers, err := logic.GetExtPeersList(&node) if err != nil { return nil, err } diff --git a/controllers/node_test.go b/controllers/node_test.go index 965d56da..bf4312bc 100644 --- a/controllers/node_test.go +++ b/controllers/node_test.go @@ -142,7 +142,7 @@ func TestValidateEgressGateway(t *testing.T) { func deleteAllNodes() { nodes, _ := logic.GetAllNodes() for _, node := range nodes { - logic.DeleteNodeByMacAddress(&node, true) + logic.DeleteNodeByID(&node, true) } } diff --git a/logic/extpeers.go b/logic/extpeers.go index 2fba619d..c40b54f2 100644 --- a/logic/extpeers.go +++ b/logic/extpeers.go @@ -11,7 +11,7 @@ import ( ) // GetExtPeersList - gets the ext peers lists -func GetExtPeersList(macaddress string, networkName string) ([]models.ExtPeersResponse, error) { +func GetExtPeersList(node *models.Node) ([]models.ExtPeersResponse, error) { var peers []models.ExtPeersResponse records, err := database.FetchRecords(database.EXT_CLIENT_TABLE_NAME) @@ -33,7 +33,7 @@ func GetExtPeersList(macaddress string, networkName string) ([]models.ExtPeersRe logger.Log(2, "failed to unmarshal ext client") continue } - if extClient.Network == networkName && extClient.IngressGatewayID == macaddress { + if extClient.Network == node.Network && extClient.IngressGatewayID == node.ID { peers = append(peers, peer) } } diff --git a/logic/networks.go b/logic/networks.go index 410968d9..79e4bdd9 100644 --- a/logic/networks.go +++ b/logic/networks.go @@ -47,7 +47,7 @@ func DeleteNetwork(network string) error { servers, err := GetSortedNetworkServerNodes(network) if err == nil { for _, s := range servers { - if err = DeleteNodeByMacAddress(&s, true); err != nil { + if err = DeleteNodeByID(&s, true); err != nil { logger.Log(2, "could not removed server", s.Name, "before deleting network", network) } else { logger.Log(2, "removed server", s.Name, "before deleting network", network) diff --git a/logic/nodes.go b/logic/nodes.go index d7a34ee6..69c95328 100644 --- a/logic/nodes.go +++ b/logic/nodes.go @@ -395,6 +395,7 @@ func GetNodeByIDorMacAddress(uuid string, macaddress string, network string) (mo return models.Node{}, err } err = CreateNode(&node) + logger.Log(2, "rewriting legacy node data; node now has id,", node.ID) if err != nil { return models.Node{}, err } diff --git a/logic/server.go b/logic/server.go index d34c222c..26512d0f 100644 --- a/logic/server.go +++ b/logic/server.go @@ -39,6 +39,7 @@ func ServerJoin(networkSettings *models.Network, serverID string) error { IsStatic: "yes", Name: models.NODE_SERVER_NAME, MacAddress: serverID, + ID: serverID, UDPHolePunch: "no", IsLocal: networkSettings.IsLocal, LocalRange: networkSettings.LocalRange, @@ -135,9 +136,9 @@ func ServerJoin(networkSettings *models.Network, serverID string) error { } // ServerCheckin - runs pulls and pushes for server -func ServerCheckin(mac string, network string) error { +func ServerCheckin(serverID string, mac string, network string) error { var serverNode = &models.Node{} - var currentNode, err = GetNode(mac, network) + var currentNode, err = GetNodeByIDorMacAddress(serverID, mac, network) if err != nil { return err } @@ -145,7 +146,7 @@ func ServerCheckin(mac string, network string) error { err = ServerPull(serverNode, false) if isDeleteError(err) { - return ServerLeave(mac, network) + return ServerLeave(currentNode.ID) } else if err != nil { return err } @@ -208,13 +209,13 @@ func ServerPush(serverNode *models.Node) error { } // ServerLeave - removes a server node -func ServerLeave(mac string, network string) error { +func ServerLeave(serverID string) error { - var serverNode, err = GetNode(mac, network) + var serverNode, err = GetNodeByID(serverID) if err != nil { return err } - return DeleteNodeByMacAddress(&serverNode, true) + return DeleteNodeByID(&serverNode, true) } /** @@ -229,7 +230,7 @@ func GetServerPeers(serverNode *models.Node) ([]wgtypes.PeerConfig, bool, []stri var peers []wgtypes.PeerConfig var nodes []models.Node // fill above fields from server or client - var nodecfg, err = GetNode(serverNode.MacAddress, serverNode.Network) + var nodecfg, err = GetNodeByIDorMacAddress(serverNode.ID, serverNode.MacAddress, serverNode.Network) if err != nil { return nil, hasGateway, gateways, err } @@ -348,7 +349,7 @@ func GetServerExtPeers(serverNode *models.Node) ([]wgtypes.PeerConfig, error) { var err error var tempPeers []models.ExtPeersResponse - tempPeers, err = GetExtPeersList(serverNode.MacAddress, serverNode.Network) + tempPeers, err = GetExtPeersList(serverNode) if err != nil { return nil, err } @@ -419,7 +420,7 @@ func checkNodeActions(node *models.Node) string { } } if node.Action == models.NODE_DELETE { - err := ServerLeave(node.MacAddress, node.Network) + err := ServerLeave(node.ID) if err != nil { logger.Log(1, "error deleting locally:", err.Error()) } diff --git a/logic/util.go b/logic/util.go index 4ddc985e..b9eddf38 100644 --- a/logic/util.go +++ b/logic/util.go @@ -104,7 +104,10 @@ func CreateNode(node *models.Node) error { if err != nil { return err } - node.ID = uuid.NewString() + + if node.IsServer != "yes" || (node.IsServer == "yes" && servercfg.GetNodeID() == "") { + node.ID = uuid.NewString() + } //Create a JWT for the node tokenString, _ := CreateJWT(node.ID, node.MacAddress, node.Network) diff --git a/models/node.go b/models/node.go index 4ed0ee63..32808b5f 100644 --- a/models/node.go +++ b/models/node.go @@ -23,9 +23,9 @@ const NODE_NOOP = "noop" var seededRand *rand.Rand = rand.New( rand.NewSource(time.Now().UnixNano())) -// node struct +// Node - struct for node model type Node struct { - ID string `json:"id,omitempty" bson:"id,omitempty"` + ID string `json:"id,omitempty" bson:"id,omitempty" yaml:"id,omitempty" validate:"required,min=5"` Address string `json:"address" bson:"address" yaml:"address" validate:"omitempty,ipv4"` Address6 string `json:"address6" bson:"address6" yaml:"address6" validate:"omitempty,ipv6"` LocalAddress string `json:"localaddress" bson:"localaddress" yaml:"localaddress" validate:"omitempty,ip"` @@ -46,7 +46,7 @@ type Node struct { ExpirationDateTime int64 `json:"expdatetime" bson:"expdatetime" yaml:"expdatetime"` LastPeerUpdate int64 `json:"lastpeerupdate" bson:"lastpeerupdate" yaml:"lastpeerupdate"` LastCheckIn int64 `json:"lastcheckin" bson:"lastcheckin" yaml:"lastcheckin"` - MacAddress string `json:"macaddress" bson:"macaddress" yaml:"macaddress" validate:"required,min=5,macaddress_unique"` + MacAddress string `json:"macaddress" bson:"macaddress" yaml:"macaddress"` // checkin interval is depreciated at the network level. Set on server with CHECKIN_INTERVAL CheckInInterval int32 `json:"checkininterval" bson:"checkininterval" yaml:"checkininterval"` Password string `json:"password" bson:"password" yaml:"password" validate:"required,min=6"` @@ -72,6 +72,7 @@ type Node struct { IPForwarding string `json:"ipforwarding" bson:"ipforwarding" yaml:"ipforwarding" validate:"checkyesorno"` OS string `json:"os" bson:"os" yaml:"os"` MTU int32 `json:"mtu" bson:"mtu" yaml:"mtu"` + Version string `json:"version" bson:"version" yaml:"version"` } // NodesArray - used for node sorting diff --git a/serverctl/serverctl.go b/serverctl/serverctl.go index 1e874daa..837536c2 100644 --- a/serverctl/serverctl.go +++ b/serverctl/serverctl.go @@ -42,7 +42,7 @@ func FileExists(f string) bool { // RemoveNetwork - removes a network locally on server func RemoveNetwork(network string) (bool, error) { - err := logic.ServerLeave(servercfg.GetNodeID(), network) + err := logic.ServerLeave(servercfg.GetNodeID()) return true, err } @@ -70,7 +70,7 @@ func HandleContainedClient() error { return err } for _, serverNet := range servernets { - err = logic.ServerCheckin(servercfg.GetNodeID(), serverNet.NetID) + err = logic.ServerCheckin(servercfg.GetNodeID(), servercfg.GetNodeID(), serverNet.NetID) if err != nil { logger.Log(1, "error occurred during server checkin:", err.Error()) } else {