mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-27 19:00:25 +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