diff --git a/controllers/node.go b/controllers/node.go index 625215d0..65e60320 100644 --- a/controllers/node.go +++ b/controllers/node.go @@ -2,7 +2,6 @@ package controller import ( "encoding/json" - "errors" "fmt" "net/http" "strings" @@ -610,10 +609,7 @@ func deleteNode(w http.ResponseWriter, r *http.Request) { func runUpdates(node *models.Node, nodeUpdate bool) error { //don't publish to server node - if node.IsServer == "yes" { - return errors.New("attempt to publish to server node") - } - if nodeUpdate { + if nodeUpdate && !isServer(node) { if err := mq.NodeUpdate(node); err != nil { logger.Log(1, "error publishing node update", err.Error()) return err diff --git a/controllers/node_grpc.go b/controllers/node_grpc.go index ddd31412..e30f0142 100644 --- a/controllers/node_grpc.go +++ b/controllers/node_grpc.go @@ -4,10 +4,9 @@ import ( "context" "encoding/json" "errors" - "log" + "fmt" "time" - "github.com/gravitl/netmaker/functions" nodepb "github.com/gravitl/netmaker/grpc" "github.com/gravitl/netmaker/logger" "github.com/gravitl/netmaker/logic" @@ -63,7 +62,6 @@ func (s *NodeServiceServer) CreateNode(ctx context.Context, req *nodepb.Object) if err != nil { return nil, err } - log.Println("DELETE ME: Operating System = " + node.OS) if !validKey { if node.NetworkSettings.AllowManualSignUp == "yes" { node.IsPending = "yes" @@ -71,11 +69,6 @@ func (s *NodeServiceServer) CreateNode(ctx context.Context, req *nodepb.Object) return nil, errors.New("invalid key, and network does not allow no-key signups") } } - unique, _ := functions.IsMacAddressUnique(node.MacAddress, node.Network) - if !unique { - return nil, errors.New("macaddress is not unique") - } - getServerAddrs(&node) key, keyErr := logic.RetrievePublicTrafficKey() @@ -84,6 +77,15 @@ func (s *NodeServiceServer) CreateNode(ctx context.Context, req *nodepb.Object) return nil, keyErr } + if key == nil { + logger.Log(0, "error: server traffic key is nil") + return nil, fmt.Errorf("error: server traffic key is nil") + } + if node.TrafficKeys.Mine == nil { + logger.Log(0, "error: node traffic key is nil") + return nil, fmt.Errorf("error: node traffic key is nil") + } + node.TrafficKeys = models.TrafficKeys{ Mine: node.TrafficKeys.Mine, Server: key, diff --git a/functions/helpers.go b/functions/helpers.go index a8dbc610..94b99247 100644 --- a/functions/helpers.go +++ b/functions/helpers.go @@ -127,17 +127,6 @@ func IsNetworkDisplayNameUnique(name string) (bool, error) { return isunique, nil } -// IsMacAddressUnique - checks if mac is unique -func IsMacAddressUnique(macaddress string, networkName string) (bool, error) { - - _, err := database.FetchRecord(database.NODES_TABLE_NAME, macaddress+"###"+networkName) - if err != nil { - return database.IsEmptyRecord(err), err - } - - return true, nil -} - // IsKeyValidGlobal - checks if a key is valid globally func IsKeyValidGlobal(keyvalue string) bool { diff --git a/logic/nodes.go b/logic/nodes.go index 723f0ec3..6940ac19 100644 --- a/logic/nodes.go +++ b/logic/nodes.go @@ -175,8 +175,10 @@ func ValidateNode(node *models.Node, isUpdate bool) error { if isUpdate { return true } + unique, _ := isMacAddressUnique(node.MacAddress, node.Network) + isFieldUnique, _ := IsNodeIDUnique(node) - return isFieldUnique + return isFieldUnique && unique }) _ = v.RegisterValidation("network_exists", func(fl validator.FieldLevel) bool { _, err := GetNetworkByNode(node) @@ -592,3 +594,23 @@ func validateServer(currentNode, newNode *models.Node) bool { newNode.ListenPort == currentNode.ListenPort && newNode.IsServer == "yes") } + +// isMacAddressUnique - checks if mac is unique +func isMacAddressUnique(macaddress string, networkName string) (bool, error) { + + isunique := true + + nodes, err := GetNetworkNodes(networkName) + if err != nil { + return database.IsEmptyRecord(err), err + } + + for _, node := range nodes { + + if node.MacAddress == macaddress { + isunique = false + } + } + + return isunique, nil +} diff --git a/logic/server.go b/logic/server.go index 6dca39e6..8880f9a1 100644 --- a/logic/server.go +++ b/logic/server.go @@ -44,6 +44,8 @@ func ServerJoin(networkSettings *models.Network) (models.Node, error) { UDPHolePunch: "no", IsLocal: networkSettings.IsLocal, LocalRange: networkSettings.LocalRange, + OS: runtime.GOOS, + Version: servercfg.Version, } SetNodeDefaults(node) diff --git a/netclient/functions/daemon.go b/netclient/functions/daemon.go index 2b47a3f7..d497feed 100644 --- a/netclient/functions/daemon.go +++ b/netclient/functions/daemon.go @@ -46,7 +46,10 @@ func insert(network, which, cache string) { func read(network, which string) string { val, isok := messageCache.Load(fmt.Sprintf("%s%s", network, which)) if isok { - var readMessage = val.(cachedMessage) // fetch current cached message + var readMessage = val.(cachedMessage) // fetch current cached message + if readMessage.LastSeen.IsZero() { + return "" + } if time.Now().After(readMessage.LastSeen.Add(time.Minute)) { // check if message has been there over a minute messageCache.Delete(fmt.Sprintf("%s%s", network, which)) // remove old message if expired ncutils.Log("cached message expired") diff --git a/netclient/functions/join.go b/netclient/functions/join.go index dfbaf306..0cf07728 100644 --- a/netclient/functions/join.go +++ b/netclient/functions/join.go @@ -60,6 +60,8 @@ func JoinNetwork(cfg config.ClientConfig, privateKey string) error { trafficPubKeyBytes, err := ncutils.ConvertKeyToBytes(trafficPubKey) if err != nil { return err + } else if trafficPubKeyBytes == nil { + return fmt.Errorf("traffic key is nil") } cfg.Node.TrafficKeys.Mine = trafficPubKeyBytes