began server client reactive

This commit is contained in:
0xdcarns
2022-01-17 14:20:52 -05:00
parent f9b3d46c20
commit 2a5405982e
4 changed files with 92 additions and 21 deletions

View File

@@ -166,6 +166,59 @@ func ValidateNode(node *models.Node, isUpdate bool) error {
return err return err
} }
// ShouldPeersUpdate - takes old node and sees if certain fields changing would trigger a peer update
func ShouldPeersUpdate(currentNode *models.Node, newNode *models.Node) bool {
// single comparison statements
if newNode.Endpoint != currentNode.Endpoint ||
newNode.LocalAddress != currentNode.LocalAddress ||
newNode.PublicKey != currentNode.PublicKey ||
newNode.Address != currentNode.Address ||
newNode.IsEgressGateway != currentNode.IsEgressGateway ||
newNode.IsIngressGateway != currentNode.IsIngressGateway ||
newNode.IsRelay != currentNode.IsRelay ||
newNode.UDPHolePunch != currentNode.UDPHolePunch ||
len(newNode.AllowedIPs) != len(currentNode.AllowedIPs) {
return true
}
// multi-comparison statements
if newNode.IsDualStack == "yes" {
if newNode.Address6 != currentNode.Address6 {
return true
}
}
if newNode.IsEgressGateway == "yes" {
if len(currentNode.EgressGatewayRanges) != len(newNode.EgressGatewayRanges) {
return true
}
for _, address := range newNode.EgressGatewayRanges {
if !StringSliceContains(currentNode.EgressGatewayRanges, address) {
return true
}
}
}
if newNode.IsRelay == "yes" {
if len(currentNode.RelayAddrs) != len(newNode.RelayAddrs) {
return true
}
for _, address := range newNode.RelayAddrs {
if !StringSliceContains(currentNode.RelayAddrs, address) {
return true
}
}
}
for _, address := range newNode.AllowedIPs {
if !StringSliceContains(currentNode.AllowedIPs, address) {
return true
}
}
return false
}
// GetAllNodes - returns all nodes in the DB // GetAllNodes - returns all nodes in the DB
func GetAllNodes() ([]models.Node, error) { func GetAllNodes() ([]models.Node, error) {
var nodes []models.Node var nodes []models.Node

17
main.go
View File

@@ -9,7 +9,6 @@ import (
"runtime/debug" "runtime/debug"
"strconv" "strconv"
"sync" "sync"
"time"
"github.com/gravitl/netmaker/auth" "github.com/gravitl/netmaker/auth"
controller "github.com/gravitl/netmaker/controllers" controller "github.com/gravitl/netmaker/controllers"
@@ -110,25 +109,9 @@ func startControllers() {
logger.Log(0, "No Server Mode selected, so nothing is being served! Set either Agent mode (AGENT_BACKEND) or Rest mode (REST_BACKEND) to 'true'.") logger.Log(0, "No Server Mode selected, so nothing is being served! Set either Agent mode (AGENT_BACKEND) or Rest mode (REST_BACKEND) to 'true'.")
} }
if servercfg.IsClientMode() == "on" {
var checkintime = time.Duration(servercfg.GetServerCheckinInterval()) * time.Second
for { // best effort currently
var serverGroup sync.WaitGroup
serverGroup.Add(1)
go runClient(&serverGroup)
serverGroup.Wait()
time.Sleep(checkintime)
}
}
waitnetwork.Wait() waitnetwork.Wait()
} }
func runClient(wg *sync.WaitGroup) {
defer wg.Done()
go serverctl.HandleContainedClient()
}
func runGRPC(wg *sync.WaitGroup) { func runGRPC(wg *sync.WaitGroup) {
defer wg.Done() defer wg.Done()

View File

@@ -73,6 +73,7 @@ type Node struct {
OS string `json:"os" bson:"os" yaml:"os"` OS string `json:"os" bson:"os" yaml:"os"`
MTU int32 `json:"mtu" bson:"mtu" yaml:"mtu"` MTU int32 `json:"mtu" bson:"mtu" yaml:"mtu"`
Version string `json:"version" bson:"version" yaml:"version"` Version string `json:"version" bson:"version" yaml:"version"`
ExcludedAddrs []string `json:"excludedaddrs" bson:"excludedaddrs" yaml:"excludedaddrs"`
} }
// NodesArray - used for node sorting // NodesArray - used for node sorting
@@ -107,78 +108,91 @@ func (node *Node) SetDefaulIsPending() {
} }
} }
// Node.SetDefaultIsRelayed - set default is relayed
func (node *Node) SetDefaultIsRelayed() { func (node *Node) SetDefaultIsRelayed() {
if node.IsRelayed == "" { if node.IsRelayed == "" {
node.IsRelayed = "no" node.IsRelayed = "no"
} }
} }
// Node.SetDefaultIsRelay - set default isrelay
func (node *Node) SetDefaultIsRelay() { func (node *Node) SetDefaultIsRelay() {
if node.IsRelay == "" { if node.IsRelay == "" {
node.IsRelay = "no" node.IsRelay = "no"
} }
} }
// Node.SetDefaultEgressGateway - sets default egress gateway status
func (node *Node) SetDefaultEgressGateway() { func (node *Node) SetDefaultEgressGateway() {
if node.IsEgressGateway == "" { if node.IsEgressGateway == "" {
node.IsEgressGateway = "no" node.IsEgressGateway = "no"
} }
} }
// Node.SetDefaultIngressGateway - sets default ingress gateway status
func (node *Node) SetDefaultIngressGateway() { func (node *Node) SetDefaultIngressGateway() {
if node.IsIngressGateway == "" { if node.IsIngressGateway == "" {
node.IsIngressGateway = "no" node.IsIngressGateway = "no"
} }
} }
// Node.SetDefaultAction - sets default action status
func (node *Node) SetDefaultAction() { func (node *Node) SetDefaultAction() {
if node.Action == "" { if node.Action == "" {
node.Action = NODE_NOOP node.Action = NODE_NOOP
} }
} }
// Node.SetRoamingDefault - sets default roaming status
func (node *Node) SetRoamingDefault() { func (node *Node) SetRoamingDefault() {
if node.Roaming == "" { if node.Roaming == "" {
node.Roaming = "yes" node.Roaming = "yes"
} }
} }
// Node.SetPullChangesDefault - sets default pull changes status
func (node *Node) SetPullChangesDefault() { func (node *Node) SetPullChangesDefault() {
if node.PullChanges == "" { if node.PullChanges == "" {
node.PullChanges = "no" node.PullChanges = "no"
} }
} }
// Node.SetIPForwardingDefault - set ip forwarding default
func (node *Node) SetIPForwardingDefault() { func (node *Node) SetIPForwardingDefault() {
if node.IPForwarding == "" { if node.IPForwarding == "" {
node.IPForwarding = "yes" node.IPForwarding = "yes"
} }
} }
// Node.SetIsLocalDefault - set is local default
func (node *Node) SetIsLocalDefault() { func (node *Node) SetIsLocalDefault() {
if node.IsLocal == "" { if node.IsLocal == "" {
node.IsLocal = "no" node.IsLocal = "no"
} }
} }
// Node.SetDNSOnDefault - sets dns on default
func (node *Node) SetDNSOnDefault() { func (node *Node) SetDNSOnDefault() {
if node.DNSOn == "" { if node.DNSOn == "" {
node.DNSOn = "yes" node.DNSOn = "yes"
} }
} }
// Node.SetIsDualStackDefault - set is dual stack default status
func (node *Node) SetIsDualStackDefault() { func (node *Node) SetIsDualStackDefault() {
if node.IsDualStack == "" { if node.IsDualStack == "" {
node.IsDualStack = "no" node.IsDualStack = "no"
} }
} }
// Node.SetIsServerDefault - sets node isserver default
func (node *Node) SetIsServerDefault() { func (node *Node) SetIsServerDefault() {
if node.IsServer != "yes" { if node.IsServer != "yes" {
node.IsServer = "no" node.IsServer = "no"
} }
} }
// Node.SetIsStaticDefault - set is static default
func (node *Node) SetIsStaticDefault() { func (node *Node) SetIsStaticDefault() {
if node.IsServer == "yes" { if node.IsServer == "yes" {
node.IsStatic = "yes" node.IsStatic = "yes"
@@ -187,28 +201,41 @@ func (node *Node) SetIsStaticDefault() {
} }
} }
// Node.SetLastModified - set last modified initial time
func (node *Node) SetLastModified() { func (node *Node) SetLastModified() {
node.LastModified = time.Now().Unix() node.LastModified = time.Now().Unix()
} }
// Node.SetLastCheckIn - time.Now().Unix()
func (node *Node) SetLastCheckIn() { func (node *Node) SetLastCheckIn() {
node.LastCheckIn = time.Now().Unix() node.LastCheckIn = time.Now().Unix()
} }
// Node.SetLastPeerUpdate - sets last peer update time
func (node *Node) SetLastPeerUpdate() { func (node *Node) SetLastPeerUpdate() {
node.LastPeerUpdate = time.Now().Unix() node.LastPeerUpdate = time.Now().Unix()
} }
// Node.SetExpirationDateTime - sets node expiry time
func (node *Node) SetExpirationDateTime() { func (node *Node) SetExpirationDateTime() {
node.ExpirationDateTime = time.Now().Unix() + TEN_YEARS_IN_SECONDS node.ExpirationDateTime = time.Now().Unix() + TEN_YEARS_IN_SECONDS
} }
// Node.SetDefaultName - sets a random name to node
func (node *Node) SetDefaultName() { func (node *Node) SetDefaultName() {
if node.Name == "" { if node.Name == "" {
node.Name = GenerateNodeName() node.Name = GenerateNodeName()
} }
} }
// Node.SetDefaultExcludedAddrs - sets ExcludedAddrs to empty array if nil
func (node *Node) SetDefaultExcludedAddrs() {
if node.ExcludedAddrs == nil {
node.ExcludedAddrs = make([]string, 0)
}
}
// Node.Fill - fills other node data into calling node data if not set on calling node
func (newNode *Node) Fill(currentNode *Node) { func (newNode *Node) Fill(currentNode *Node) {
newNode.ID = currentNode.ID newNode.ID = currentNode.ID
@@ -354,8 +381,15 @@ func (newNode *Node) Fill(currentNode *Node) {
if newNode.IsRelayed == "" { if newNode.IsRelayed == "" {
newNode.IsRelayed = currentNode.IsRelayed newNode.IsRelayed = currentNode.IsRelayed
} }
if newNode.Version == "" {
newNode.Version = currentNode.Version
}
if newNode.ExcludedAddrs == nil || len(newNode.ExcludedAddrs) != len(currentNode.ExcludedAddrs) {
newNode.ExcludedAddrs = currentNode.ExcludedAddrs
}
} }
// StringWithCharset - returns random string inside defined charset
func StringWithCharset(length int, charset string) string { func StringWithCharset(length int, charset string) string {
b := make([]byte, length) b := make([]byte, length)
for i := range b { for i := range b {
@@ -364,13 +398,14 @@ func StringWithCharset(length int, charset string) string {
return string(b) return string(b)
} }
//Check for valid IPv4 address // IsIpv4Net - check for valid IPv4 address
// Note: We dont handle IPv6 AT ALL!!!!! This definitely is needed at some point // Note: We dont handle IPv6 AT ALL!!!!! This definitely is needed at some point
// But for iteration 1, lets just stick to IPv4. Keep it simple stupid. // But for iteration 1, lets just stick to IPv4. Keep it simple stupid.
func IsIpv4Net(host string) bool { func IsIpv4Net(host string) bool {
return net.ParseIP(host) != nil return net.ParseIP(host) != nil
} }
// Node.NameInNodeCharset - returns if name is in charset below or not
func (node *Node) NameInNodeCharSet() bool { func (node *Node) NameInNodeCharSet() bool {
charset := "abcdefghijklmnopqrstuvwxyz1234567890-" charset := "abcdefghijklmnopqrstuvwxyz1234567890-"

View File

@@ -16,7 +16,7 @@ func init() {
// ServerUpdateData - contains data to configure server // ServerUpdateData - contains data to configure server
// and if it should set peers // and if it should set peers
type ServerUpdateData struct { type ServerUpdateData struct {
RemakePeers bool `json:"remakepeers" bson:"remakepeers"` UpdatePeers bool `json:"updatepeers" bson:"updatepeers"`
ServerNode models.Node `json:"servernode" bson:"servernode"` ServerNode models.Node `json:"servernode" bson:"servernode"`
} }