Merge pull request #1536 from gravitl/feature_v0.15.2_connect_status

send connected status on checkin
This commit is contained in:
Alex Feiszli 2022-09-12 11:51:55 -04:00 committed by GitHub
commit 5d27db6e22
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 34 additions and 15 deletions

View file

@ -39,6 +39,12 @@ const (
var seededRand *rand.Rand = rand.New(
rand.NewSource(time.Now().UnixNano()))
// NodeCheckin - struct for node checkins with server
type NodeCheckin struct {
Version string
Connected string
}
// Node - struct for node model
type Node struct {
ID string `json:"id,omitempty" bson:"id,omitempty" yaml:"id,omitempty" validate:"required,min=5,id_unique"`

View file

@ -36,13 +36,19 @@ func Ping(client mqtt.Client, msg mqtt.Message) {
logger.Log(0, record)
return
}
version, decryptErr := decryptMsg(&node, msg.Payload())
decrypted, decryptErr := decryptMsg(&node, msg.Payload())
if decryptErr != nil {
logger.Log(0, "error decrypting when updating node ", node.ID, decryptErr.Error())
return
}
var checkin models.NodeCheckin
if err := json.Unmarshal(decrypted, &checkin); err != nil {
logger.Log(1, "error unmarshaling payload ", err.Error())
return
}
node.SetLastCheckIn()
node.Version = string(version)
node.Version = checkin.Version
node.Connected = checkin.Connected
if err := logic.UpdateNode(&node, &node); err != nil {
logger.Log(0, "error updating node", node.Name, node.ID, " on checkin", err.Error())
return

View file

@ -3,8 +3,8 @@ package functions
import (
"fmt"
"github.com/gravitl/netmaker/logger"
"github.com/gravitl/netmaker/netclient/config"
"github.com/gravitl/netmaker/netclient/daemon"
"github.com/gravitl/netmaker/netclient/ncutils"
"github.com/gravitl/netmaker/netclient/wireguard"
)
@ -24,11 +24,9 @@ func Connect(network string) error {
if err = wireguard.ApplyConf(&cfg.Node, cfg.Node.Interface, filePath); err != nil {
return err
}
if err := PublishNodeUpdate(cfg); err != nil {
logger.Log(0, "network:", cfg.Node.Network, "could not publish connection change, it will likely get reverted")
}
return config.ModNodeConfig(&cfg.Node)
err = config.ModNodeConfig(&cfg.Node)
daemon.Restart()
return err
}
// Disconnect - attempts to disconnect a node on given network
@ -46,9 +44,7 @@ func Disconnect(network string) error {
if err = wireguard.ApplyConf(&cfg.Node, cfg.Node.Interface, filePath); err != nil {
return err
}
if err := PublishNodeUpdate(cfg); err != nil {
logger.Log(0, "network:", cfg.Node.Network, "could not publish connection change, it will likely get reverted")
}
return config.ModNodeConfig(&cfg.Node)
err = config.ModNodeConfig(&cfg.Node)
daemon.Restart()
return err
}

View file

@ -26,13 +26,16 @@ import (
func Checkin(ctx context.Context, wg *sync.WaitGroup) {
logger.Log(2, "starting checkin goroutine")
defer wg.Done()
checkin()
ticker := time.NewTicker(time.Second * 60)
defer ticker.Stop()
for {
select {
case <-ctx.Done():
logger.Log(0, "checkin routine closed")
return
//delay should be configuraable -> use cfg.Node.NetworkSettings.DefaultCheckInInterval ??
case <-time.After(time.Second * 60):
case <-ticker.C:
checkin()
}
}
@ -123,7 +126,15 @@ func PublishNodeUpdate(nodeCfg *config.ClientConfig) error {
// Hello -- ping the broker to let server know node it's alive and well
func Hello(nodeCfg *config.ClientConfig) {
if err := publish(nodeCfg, fmt.Sprintf("ping/%s", nodeCfg.Node.ID), []byte(ncutils.Version), 0); err != nil {
var checkin models.NodeCheckin
checkin.Version = ncutils.Version
checkin.Connected = nodeCfg.Node.Connected
data, err := json.Marshal(checkin)
if err != nil {
logger.Log(0, "unable to marshal checkin data", err.Error())
return
}
if err := publish(nodeCfg, fmt.Sprintf("ping/%s", nodeCfg.Node.ID), data, 0); err != nil {
logger.Log(0, fmt.Sprintf("Network: %s error publishing ping, %v", nodeCfg.Node.Network, err))
logger.Log(0, "running pull on "+nodeCfg.Node.Network+" to reconnect")
_, err := Pull(nodeCfg.Node.Network, true)