From 506a897f262320da26b9828f40f563b58eda33b6 Mon Sep 17 00:00:00 2001 From: 0xdcarns Date: Thu, 17 Feb 2022 09:08:20 -0500 Subject: [PATCH] added ack and done signals --- controllers/node.go | 9 +-------- mq/handlers.go | 25 +++++++++++++++++++++++-- netclient/functions/daemon.go | 19 ++++++++++++------- netclient/ncutils/constants.go | 10 ++++++++++ 4 files changed, 46 insertions(+), 17 deletions(-) create mode 100644 netclient/ncutils/constants.go diff --git a/controllers/node.go b/controllers/node.go index 36973fed..94828916 100644 --- a/controllers/node.go +++ b/controllers/node.go @@ -5,7 +5,6 @@ import ( "fmt" "net/http" "strings" - "sync" "github.com/gorilla/mux" "github.com/gravitl/netmaker/database" @@ -642,14 +641,8 @@ func runUpdates(node *models.Node, ifaceDelta bool) { // updates local peers for a server on a given node's network func runServerUpdate(node *models.Node, ifaceDelta bool) error { - var mutex sync.Mutex - mutex.Lock() - defer mutex.Unlock() - if servercfg.IsClientMode() != "on" { - return nil - } - if !isServer(node) { + if servercfg.IsClientMode() != "on" || !isServer(node) { return nil } diff --git a/mq/handlers.go b/mq/handlers.go index 8f624ad9..d6dca81c 100644 --- a/mq/handlers.go +++ b/mq/handlers.go @@ -8,6 +8,7 @@ import ( "github.com/gravitl/netmaker/logger" "github.com/gravitl/netmaker/logic" "github.com/gravitl/netmaker/models" + "github.com/gravitl/netmaker/netclient/ncutils" ) // DefaultHandler default message queue handler - only called when GetDebug == true @@ -96,10 +97,30 @@ func ClientPeerUpdate(client mqtt.Client, msg mqtt.Message) { logger.Log(1, "error getting node ", id, err.Error()) return } - if err := PublishPeerUpdate(¤tNode); err != nil { - logger.Log(1, "error publishing peer update ", err.Error()) + decrypted, decryptErr := decryptMsg(¤tNode, msg.Payload()) + if decryptErr != nil { + logger.Log(1, "failed to decrypt message during client peer update for node ", id, decryptErr.Error()) return } + switch decrypted[0] { + case ncutils.ACK: + currentServerNode, err := logic.GetNetworkServerLocal(currentNode.Network) + if err != nil { + return + } + if err := logic.ServerUpdate(¤tServerNode, false); err != nil { + logger.Log(1, "server node:", currentServerNode.ID, "failed update") + return + } + case ncutils.DONE: + if err := PublishPeerUpdate(¤tNode); err != nil { + logger.Log(1, "error publishing peer update ", err.Error()) + return + } + case ncutils.KEY: + logger.Log(0, "I should have broke") + } + logger.Log(1, "sent peer updates after signal received from", id, currentNode.Name) }() } diff --git a/netclient/functions/daemon.go b/netclient/functions/daemon.go index 1d15e500..0f8eda08 100644 --- a/netclient/functions/daemon.go +++ b/netclient/functions/daemon.go @@ -199,11 +199,11 @@ func NodeUpdate(client mqtt.Client, msg mqtt.Message) { return } if ifaceDelta { // if a change caused an ifacedelta we need to notify the server to update the peers - pubErr := publishClientPeers(&cfg) - if pubErr != nil { - ncutils.Log("could not notify server to update peers after interface change") + ackErr := publishSignal(&cfg, ncutils.ACK) + if ackErr != nil { + ncutils.Log("could not notify server that it received an interface update") } else { - ncutils.Log("signalled peer update to server") + ncutils.Log("signalled acknowledgement of change to server") } ncutils.Log("applying WG conf to " + file) err = wireguard.ApplyConf(&cfg.Node, cfg.Node.Interface, file) @@ -221,6 +221,12 @@ func NodeUpdate(client mqtt.Client, msg mqtt.Message) { } } } + doneErr := publishSignal(&cfg, ncutils.DONE) + if doneErr != nil { + ncutils.Log("could not notify server to update peers after interface change") + } else { + ncutils.Log("signalled finshed interface update to server") + } } //deal with DNS if newNode.DNSOn != "yes" && shouldDNSChange && cfg.Node.Interface != "" { @@ -480,9 +486,8 @@ func setupMQTT(cfg *config.ClientConfig, publish bool) mqtt.Client { } // publishes a message to server to update peers on this peer's behalf -func publishClientPeers(cfg *config.ClientConfig) error { - payload := []byte(ncutils.MakeRandomString(16)) // just random string for now to keep the bytes different - if err := publish(cfg, fmt.Sprintf("signal/%s", cfg.Node.ID), payload, 1); err != nil { +func publishSignal(cfg *config.ClientConfig, signal byte) error { + if err := publish(cfg, fmt.Sprintf("signal/%s", cfg.Node.ID), []byte{signal}, 1); err != nil { return err } return nil diff --git a/netclient/ncutils/constants.go b/netclient/ncutils/constants.go new file mode 100644 index 00000000..ff757f73 --- /dev/null +++ b/netclient/ncutils/constants.go @@ -0,0 +1,10 @@ +package ncutils + +const ( + // ACK - acknowledgement signal for MQ + ACK = 1 + // DONE - done signal for MQ + DONE = 2 + // KEY - key update completed signal for MQ + KEY = 3 +)