mirror of
				https://github.com/gravitl/netmaker.git
				synced 2025-10-27 02:41:26 +08:00 
			
		
		
		
	began server client reactive
This commit is contained in:
		| @@ -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
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								main.go
									
									
									
									
									
								
							| @@ -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() | ||||||
|   | |||||||
| @@ -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-" | ||||||
|   | |||||||
| @@ -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"` | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 0xdcarns
					0xdcarns