Browse Source

added deleted node peer calculation

0xdcarns 2 years ago
parent
commit
dc540a266b
1 changed files with 31 additions and 4 deletions
  1. 31 4
      logic/peers.go

+ 31 - 4
logic/peers.go

@@ -122,6 +122,8 @@ func GetPeerUpdateForHost(network string, host *models.Host) (models.HostPeerUpd
 	if host == nil {
 	if host == nil {
 		return models.HostPeerUpdate{}, errors.New("host is nil")
 		return models.HostPeerUpdate{}, errors.New("host is nil")
 	}
 	}
+	// track which nodes are deleted
+	// after peer calculation, if peer not in list, add delete config of peer
 	hostPeerUpdate := models.HostPeerUpdate{
 	hostPeerUpdate := models.HostPeerUpdate{
 		Host:          *host,
 		Host:          *host,
 		Server:        servercfg.GetServer(),
 		Server:        servercfg.GetServer(),
@@ -136,6 +138,7 @@ func GetPeerUpdateForHost(network string, host *models.Host) (models.HostPeerUpd
 		Peers:      []wgtypes.PeerConfig{},
 		Peers:      []wgtypes.PeerConfig{},
 		NodePeers:  []wgtypes.PeerConfig{},
 		NodePeers:  []wgtypes.PeerConfig{},
 	}
 	}
+	var deletedNodes = []models.Node{} // used to track deleted nodes
 	logger.Log(1, "peer update for host ", host.ID.String())
 	logger.Log(1, "peer update for host ", host.ID.String())
 	peerIndexMap := make(map[string]int)
 	peerIndexMap := make(map[string]int)
 	for _, nodeID := range host.Nodes {
 	for _, nodeID := range host.Nodes {
@@ -143,7 +146,7 @@ func GetPeerUpdateForHost(network string, host *models.Host) (models.HostPeerUpd
 		if err != nil {
 		if err != nil {
 			continue
 			continue
 		}
 		}
-		if !node.Connected || node.Action == models.NODE_DELETE || node.PendingDelete {
+		if !node.Connected || node.PendingDelete || node.Action == models.NODE_DELETE {
 			continue
 			continue
 		}
 		}
 		currentPeers, err := GetNetworkNodes(node.Network)
 		currentPeers, err := GetNetworkNodes(node.Network)
@@ -162,6 +165,10 @@ func GetPeerUpdateForHost(network string, host *models.Host) (models.HostPeerUpd
 				//skip yourself
 				//skip yourself
 				continue
 				continue
 			}
 			}
+			if peer.Action == models.NODE_DELETE || peer.PendingDelete {
+				deletedNodes = append(deletedNodes, peer) // track deleted node for peer update
+				continue
+			}
 			var peerConfig wgtypes.PeerConfig
 			var peerConfig wgtypes.PeerConfig
 			peerHost, err := GetHost(peer.HostID.String())
 			peerHost, err := GetHost(peer.HostID.String())
 			if err != nil {
 			if err != nil {
@@ -221,6 +228,7 @@ func GetPeerUpdateForHost(network string, host *models.Host) (models.HostPeerUpd
 					_, extPeerIDAndAddrs, err := getExtPeers(&peer)
 					_, extPeerIDAndAddrs, err := getExtPeers(&peer)
 					if err == nil {
 					if err == nil {
 						for _, extPeerIdAndAddr := range extPeerIDAndAddrs {
 						for _, extPeerIdAndAddr := range extPeerIDAndAddrs {
+							extPeerIdAndAddr := extPeerIdAndAddr
 							nodePeerMap[extPeerIdAndAddr.ID] = models.PeerRouteInfo{
 							nodePeerMap[extPeerIdAndAddr.ID] = models.PeerRouteInfo{
 								PeerAddr: net.IPNet{
 								PeerAddr: net.IPNet{
 									IP:   net.ParseIP(extPeerIdAndAddr.Address),
 									IP:   net.ParseIP(extPeerIdAndAddr.Address),
@@ -249,9 +257,6 @@ func GetPeerUpdateForHost(network string, host *models.Host) (models.HostPeerUpd
 			var nodePeer wgtypes.PeerConfig
 			var nodePeer wgtypes.PeerConfig
 			if _, ok := hostPeerUpdate.HostPeerIDs[peerHost.PublicKey.String()]; !ok {
 			if _, ok := hostPeerUpdate.HostPeerIDs[peerHost.PublicKey.String()]; !ok {
 				hostPeerUpdate.HostPeerIDs[peerHost.PublicKey.String()] = make(map[string]models.IDandAddr)
 				hostPeerUpdate.HostPeerIDs[peerHost.PublicKey.String()] = make(map[string]models.IDandAddr)
-				if peer.Action == models.NODE_DELETE || peer.PendingDelete {
-					peerConfig.Remove = true
-				}
 				hostPeerUpdate.Peers = append(hostPeerUpdate.Peers, peerConfig)
 				hostPeerUpdate.Peers = append(hostPeerUpdate.Peers, peerConfig)
 				peerIndexMap[peerHost.PublicKey.String()] = len(hostPeerUpdate.Peers) - 1
 				peerIndexMap[peerHost.PublicKey.String()] = len(hostPeerUpdate.Peers) - 1
 				hostPeerUpdate.HostPeerIDs[peerHost.PublicKey.String()][peer.ID.String()] = models.IDandAddr{
 				hostPeerUpdate.HostPeerIDs[peerHost.PublicKey.String()][peer.ID.String()] = models.IDandAddr{
@@ -347,6 +352,28 @@ func GetPeerUpdateForHost(network string, host *models.Host) (models.HostPeerUpd
 		}
 		}
 	}
 	}
 
 
+	// run through delete nodes
+	if len(deletedNodes) > 0 {
+		for i := range deletedNodes {
+			delNode := deletedNodes[i]
+			delHost, err := GetHost(delNode.HostID.String())
+			if err != nil {
+				continue
+			}
+			if _, ok := hostPeerUpdate.HostPeerIDs[delHost.PublicKey.String()]; !ok {
+				var peerConfig = wgtypes.PeerConfig{}
+				peerConfig.PublicKey = delHost.PublicKey
+				peerConfig.Endpoint = &net.UDPAddr{
+					IP:   delHost.EndpointIP,
+					Port: GetPeerListenPort(delHost),
+				}
+				peerConfig.Remove = true
+				peerConfig.AllowedIPs = []net.IPNet{delNode.Address, delNode.Address6}
+				hostPeerUpdate.Peers = append(hostPeerUpdate.Peers, peerConfig)
+			}
+		}
+	}
+
 	return hostPeerUpdate, nil
 	return hostPeerUpdate, nil
 }
 }