Kaynağa Gözat

Update from develop

0xdcarns 2 yıl önce
ebeveyn
işleme
1ad5d03d11

+ 5 - 0
controllers/hosts.go

@@ -251,6 +251,11 @@ func addHostToNetwork(w http.ResponseWriter, r *http.Request) {
 			logger.Log(0, r.Header.Get("user"), "failed to update host to join network:", hostid, network, err.Error())
 		}
 	}
+	go func() { // notify of peer change
+		if err := mq.PublishPeerUpdate(); err != nil {
+			logger.Log(1, "error publishing peer update ", err.Error())
+		}
+	}()
 
 	logger.Log(2, r.Header.Get("user"), fmt.Sprintf("added host %s to network %s", currHost.Name, network))
 	w.WriteHeader(http.StatusOK)

+ 18 - 1
controllers/network.go

@@ -415,7 +415,24 @@ func createNetwork(w http.ResponseWriter, r *http.Request) {
 			network.NetID, err.Error()))
 	}
 
-	// TODO: Send message notifying host of new peers/network conf
+	defaultHosts := logic.GetDefaultHosts()
+	for i := range defaultHosts {
+		currHost := &defaultHosts[i]
+		newNode, err := logic.UpdateHostNetwork(currHost, network.NetID, true)
+		if err != nil {
+			logger.Log(0, r.Header.Get("user"), "failed to add host to network:", currHost.ID.String(), network.NetID, err.Error())
+			logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
+			return
+		}
+		logger.Log(1, "added new node", newNode.ID.String(), "to host", currHost.Name)
+		if err = mq.HostUpdate(&models.HostUpdate{
+			Action: models.JoinHostToNetwork,
+			Host:   *currHost,
+			Node:   *newNode,
+		}); err != nil {
+			logger.Log(0, r.Header.Get("user"), "failed to add host to network:", currHost.ID.String(), network.NetID, err.Error())
+		}
+	}
 
 	logger.Log(1, r.Header.Get("user"), "created network", network.NetID)
 	w.WriteHeader(http.StatusOK)

+ 12 - 0
controllers/relay.go

@@ -134,12 +134,24 @@ func createHostRelay(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
+	if err := mq.HostUpdate(&models.HostUpdate{
+		Action: models.UpdateHost,
+		Host:   *relayHost,
+	}); err != nil {
+		logger.Log(0, "failed to send host update: ", relayHost.ID.String(), err.Error())
+	}
 	logger.Log(1, r.Header.Get("user"), "created relay on host", relay.HostID)
 	go func(relayHostID string) {
 		relatedhosts := logic.GetRelatedHosts(relayHostID)
 		for _, relatedHost := range relatedhosts {
 			relatedHost.ProxyEnabled = true
 			logic.UpsertHost(&relatedHost)
+			if err := mq.HostUpdate(&models.HostUpdate{
+				Action: models.UpdateHost,
+				Host:   relatedHost,
+			}); err != nil {
+				logger.Log(0, "failed to send host update: ", relatedHost.ID.String(), err.Error())
+			}
 		}
 		if servercfg.IsMessageQueueBackend() {
 			if err := mq.PublishPeerUpdate(); err != nil {

+ 13 - 0
database/database.go

@@ -4,6 +4,7 @@ import (
 	"crypto/rand"
 	"encoding/json"
 	"errors"
+	"sync"
 	"time"
 
 	"github.com/google/uuid"
@@ -84,6 +85,8 @@ const (
 	isConnected = "isconnected"
 )
 
+var dbMutex sync.RWMutex
+
 func getCurrentDB() map[string]interface{} {
 	switch servercfg.GetDB() {
 	case "rqlite":
@@ -150,6 +153,8 @@ func IsJSONString(value string) bool {
 
 // Insert - inserts object into db
 func Insert(key string, value string, tableName string) error {
+	dbMutex.Lock()
+	defer dbMutex.Unlock()
 	if key != "" && value != "" && IsJSONString(value) {
 		return getCurrentDB()[INSERT].(func(string, string, string) error)(key, value, tableName)
 	} else {
@@ -159,6 +164,8 @@ func Insert(key string, value string, tableName string) error {
 
 // InsertPeer - inserts peer into db
 func InsertPeer(key string, value string) error {
+	dbMutex.Lock()
+	defer dbMutex.Unlock()
 	if key != "" && value != "" && IsJSONString(value) {
 		return getCurrentDB()[INSERT_PEER].(func(string, string) error)(key, value)
 	} else {
@@ -168,11 +175,15 @@ func InsertPeer(key string, value string) error {
 
 // DeleteRecord - deletes a record from db
 func DeleteRecord(tableName string, key string) error {
+	dbMutex.Lock()
+	defer dbMutex.Unlock()
 	return getCurrentDB()[DELETE].(func(string, string) error)(tableName, key)
 }
 
 // DeleteAllRecords - removes a table and remakes
 func DeleteAllRecords(tableName string) error {
+	dbMutex.Lock()
+	defer dbMutex.Unlock()
 	err := getCurrentDB()[DELETE_ALL].(func(string) error)(tableName)
 	if err != nil {
 		return err
@@ -198,6 +209,8 @@ func FetchRecord(tableName string, key string) (string, error) {
 
 // FetchRecords - fetches all records in given table
 func FetchRecords(tableName string) (map[string]string, error) {
+	dbMutex.RLock()
+	defer dbMutex.RUnlock()
 	return getCurrentDB()[FETCH_ALL].(func(string) (map[string]string, error))(tableName)
 }
 

+ 11 - 14
logic/peers.go

@@ -266,7 +266,7 @@ func GetProxyUpdateForHost(host *models.Host) (models.ProxyManagerPayload, error
 			if peerHost.IsRelayed && peerHost.RelayedBy != host.ID.String() {
 				relayHost, err := GetHost(peerHost.RelayedBy)
 				if err == nil {
-					relayTo, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", relayHost.EndpointIP, getPeerListenPort(peerHost)))
+					relayTo, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", relayHost.EndpointIP, getPeerListenPort(relayHost)))
 					if err == nil {
 						currPeerConf.IsRelayed = true
 						currPeerConf.RelayedTo = relayTo
@@ -434,6 +434,16 @@ func GetPeerUpdateForHost(host *models.Host) (models.HostPeerUpdate, error) {
 		if node.IsIngressGateway {
 			extPeers, extPeerIDAndAddrs, err = getExtPeers(&node)
 			if err == nil {
+				for _, extPeerIdAndAddr := range extPeerIDAndAddrs {
+					nodePeerMap[extPeerIdAndAddr.ID] = models.PeerRouteInfo{
+						PeerAddr: net.IPNet{
+							IP:   net.ParseIP(extPeerIdAndAddr.Address),
+							Mask: getCIDRMaskFromAddr(extPeerIdAndAddr.Address),
+						},
+						PeerKey: extPeerIdAndAddr.ID,
+						Allow:   true,
+					}
+				}
 				hostPeerUpdate.Peers = append(hostPeerUpdate.Peers, extPeers...)
 				for _, extPeerIdAndAddr := range extPeerIDAndAddrs {
 					hostPeerUpdate.PeerIDs[extPeerIdAndAddr.ID] = make(map[string]models.IDandAddr)
@@ -464,19 +474,6 @@ func GetPeerUpdateForHost(host *models.Host) (models.HostPeerUpdate, error) {
 			}
 		}
 		if node.IsEgressGateway {
-			if node.IsIngressGateway {
-				for _, extPeerIdAndAddr := range extPeerIDAndAddrs {
-					nodePeerMap[extPeerIdAndAddr.ID] = models.PeerRouteInfo{
-						PeerAddr: net.IPNet{
-							IP:   net.ParseIP(extPeerIdAndAddr.Address),
-							Mask: getCIDRMaskFromAddr(extPeerIdAndAddr.Address),
-						},
-						PeerKey: extPeerIdAndAddr.ID,
-						Allow:   true,
-					}
-				}
-
-			}
 			hostPeerUpdate.EgressInfo[node.ID.String()] = models.EgressInfo{
 				EgressID: node.ID.String(),
 				Network:  node.PrimaryNetworkRange(),

+ 0 - 28
metrics/metrics.go

@@ -1,12 +1,9 @@
 package metrics
 
 import (
-	"fmt"
 	"sync"
 	"time"
 
-	"github.com/go-ping/ping"
-	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/models"
 )
 
@@ -84,28 +81,3 @@ func ResetMetricForNode(server, peerKey, peerID string) {
 
 // MetricCollectionInterval - collection interval for metrics
 const MetricCollectionInterval = time.Second * 25
-
-// PeerConnectionStatus - get peer connection status by pinging
-func PeerConnectionStatus(address string) (connected bool) {
-	fmt.Println("PINGER ADDR: ", address)
-	pinger, err := ping.NewPinger(address)
-	if err != nil {
-		logger.Log(0, "could not initiliaze ping peer address", address, err.Error())
-		connected = false
-	} else {
-		pinger.Timeout = time.Second * 2
-		err = pinger.Run()
-		if err != nil {
-			logger.Log(0, "failed to ping on peer address", address, err.Error())
-			return false
-		} else {
-			pingStats := pinger.Statistics()
-			if pingStats.PacketsRecv > 0 {
-				connected = true
-				return
-			}
-		}
-	}
-
-	return
-}

+ 9 - 2
models/api_host.go

@@ -1,6 +1,9 @@
 package models
 
-import "net"
+import (
+	"net"
+	"strings"
+)
 
 // ApiHost - the host struct for API usage
 type ApiHost struct {
@@ -76,7 +79,11 @@ func (a *ApiHost) ConvertAPIHostToNMHost(currentHost *Host) *Host {
 	h.ID = currentHost.ID
 	h.HostPass = currentHost.HostPass
 	h.DaemonInstalled = currentHost.DaemonInstalled
-	h.EndpointIP = net.ParseIP(a.EndpointIP)
+	if len(a.EndpointIP) == 0 || strings.Contains(a.EndpointIP, "nil") {
+		h.EndpointIP = currentHost.EndpointIP
+	} else {
+		h.EndpointIP = net.ParseIP(a.EndpointIP)
+	}
 	h.Debug = a.Debug
 	h.FirewallInUse = a.FirewallInUse
 	h.IPForwarding = currentHost.IPForwarding

+ 2 - 1
models/api_node.go

@@ -58,7 +58,8 @@ func (a *ApiNode) ConvertToServerNode(currentNode *Node) *Node {
 	convertedNode.Failover = a.Failover
 	convertedNode.IsEgressGateway = a.IsEgressGateway
 	convertedNode.IsIngressGateway = a.IsIngressGateway
-	convertedNode.EgressGatewayRanges = a.EgressGatewayRanges
+	// prevents user from changing ranges, must delete and recreate
+	convertedNode.EgressGatewayRanges = currentNode.EgressGatewayRanges
 	convertedNode.IngressGatewayRange = currentNode.IngressGatewayRange
 	convertedNode.IngressGatewayRange6 = currentNode.IngressGatewayRange6
 	convertedNode.DNSOn = a.DNSOn