|
@@ -59,6 +59,80 @@ var (
|
|
|
}
|
|
|
)
|
|
|
|
|
|
+// GetHostPeerInfo - fetches required peer info per network
|
|
|
+func GetHostPeerInfo(host *models.Host) (models.HostPeerInfo, error) {
|
|
|
+ peerInfo := models.HostPeerInfo{
|
|
|
+ NetworkPeerIDs: make(map[models.NetworkID]models.PeerMap),
|
|
|
+ }
|
|
|
+ allNodes, err := GetAllNodes()
|
|
|
+ if err != nil {
|
|
|
+ return peerInfo, err
|
|
|
+ }
|
|
|
+ for _, nodeID := range host.Nodes {
|
|
|
+ nodeID := nodeID
|
|
|
+ node, err := GetNodeByID(nodeID)
|
|
|
+ if err != nil {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ if !node.Connected || node.PendingDelete || node.Action == models.NODE_DELETE {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ networkPeersInfo := make(models.PeerMap)
|
|
|
+ defaultDevicePolicy, _ := GetDefaultPolicy(models.NetworkID(node.Network), models.DevicePolicy)
|
|
|
+
|
|
|
+ currentPeers := GetNetworkNodesMemory(allNodes, node.Network)
|
|
|
+ for _, peer := range currentPeers {
|
|
|
+ peer := peer
|
|
|
+ if peer.ID.String() == node.ID.String() {
|
|
|
+ logger.Log(2, "peer update, skipping self")
|
|
|
+ // skip yourself
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ peerHost, err := GetHost(peer.HostID.String())
|
|
|
+ if err != nil {
|
|
|
+ logger.Log(1, "no peer host", peer.HostID.String(), err.Error())
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ var allowedToComm bool
|
|
|
+ if defaultDevicePolicy.Enabled {
|
|
|
+ allowedToComm = true
|
|
|
+ } else {
|
|
|
+ allowedToComm = IsPeerAllowed(node, peer, false)
|
|
|
+ }
|
|
|
+ if peer.Action != models.NODE_DELETE &&
|
|
|
+ !peer.PendingDelete &&
|
|
|
+ peer.Connected &&
|
|
|
+ nodeacls.AreNodesAllowed(nodeacls.NetworkID(node.Network), nodeacls.NodeID(node.ID.String()), nodeacls.NodeID(peer.ID.String())) &&
|
|
|
+ (defaultDevicePolicy.Enabled || allowedToComm) {
|
|
|
+
|
|
|
+ networkPeersInfo[peerHost.PublicKey.String()] = models.IDandAddr{
|
|
|
+ ID: peer.ID.String(),
|
|
|
+ HostID: peerHost.ID.String(),
|
|
|
+ Address: peer.PrimaryAddress(),
|
|
|
+ Name: peerHost.Name,
|
|
|
+ Network: peer.Network,
|
|
|
+ ListenPort: peerHost.ListenPort,
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ var extPeerIDAndAddrs []models.IDandAddr
|
|
|
+ if node.IsIngressGateway {
|
|
|
+ _, extPeerIDAndAddrs, _, err = GetExtPeers(&node, &node)
|
|
|
+ if err == nil {
|
|
|
+ for _, extPeerIdAndAddr := range extPeerIDAndAddrs {
|
|
|
+ networkPeersInfo[extPeerIdAndAddr.ID] = extPeerIdAndAddr
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ peerInfo.NetworkPeerIDs[models.NetworkID(node.Network)] = networkPeersInfo
|
|
|
+ }
|
|
|
+ return peerInfo, nil
|
|
|
+}
|
|
|
+
|
|
|
// GetPeerUpdateForHost - gets the consolidated peer update for the host from all networks
|
|
|
func GetPeerUpdateForHost(network string, host *models.Host, allNodes []models.Node,
|
|
|
deletedNode *models.Node, deletedClients []models.ExtClient) (models.HostPeerUpdate, error) {
|