private void GetNodeStatus(BlockchainNode node) { BlockchainNodeConfig config = BlockchainConfig.GetNodeConfig(node.NodeConfig.NodeConfigFullName); int apiPort = config.GetApiPort(); NodeStatus nodeStatus = BufferedRequestCaller.GetApiResult <NodeStatus>(RequestType.ApiNodeStatus, node.NodeEndpoint.FullNodeName, apiPort); if (nodeStatus == null) { node.NodeState.NodeOperationState.State = ProcessState.Stopped; return; } node.NodeState.NodeOperationState.State = ProcessState.Running; node.NodeState.NodeOperationState.AgentName = nodeStatus.Agent; node.NodeState.NodeOperationState.Version = nodeStatus.Version; node.NodeState.NodeOperationState.Network = nodeStatus.Network; node.NodeState.NodeOperationState.ConsensusHeight = nodeStatus.ConsensusHeight; node.NodeState.NodeOperationState.Peers.Clear(); foreach (Peer inboundPeer in nodeStatus.InboundPeers) { ConnectionPeer peer = new ConnectionPeer(); peer.PeerType = PeerType.Inbound; peer.RemoteSocketEndpoint = inboundPeer.RemoteSocketEndpoint; peer.TipHeight = inboundPeer.TipHeight; peer.Version = inboundPeer.Version; node.NodeState.NodeOperationState.Peers.Add(peer); } foreach (Peer outboundPeer in nodeStatus.OutboundPeers) { ConnectionPeer peer = new ConnectionPeer(); peer.PeerType = PeerType.Inbound; peer.RemoteSocketEndpoint = outboundPeer.RemoteSocketEndpoint; peer.TipHeight = outboundPeer.TipHeight; peer.Version = outboundPeer.Version; node.NodeState.NodeOperationState.Peers.Add(peer); } node.NodeState.NodeOperationState.DataDirectory = nodeStatus.DataDirectoryPath; node.NodeState.NodeOperationState.Uptime = nodeStatus.RunningTime; int maxInboundTipHeight = nodeStatus.InboundPeers.Any() ? nodeStatus.InboundPeers.Max(p => p.TipHeight) : 0; int maxOutboundTipHeight = nodeStatus.OutboundPeers.Any() ? nodeStatus.OutboundPeers.Max(p => p.TipHeight) : 0; node.NodeState.NodeOperationState.NetworkHeight = Math.Max(maxInboundTipHeight, maxOutboundTipHeight); }
public void MergeDataRows(List <ConnectionPeer> peers) { //Remove old peers List <DataRow> rowsToDelete = new List <DataRow>(); foreach (DataRow row in DataTable.Rows) { ConnectionPeer node = (ConnectionPeer)row["Address"]; if (peers.All(p => p.RemoteSocketEndpoint != node.RemoteSocketEndpoint)) { rowsToDelete.Add(row); } } foreach (DataRow row in rowsToDelete) { DataTable.Rows.Remove(row); } //Add and update nodes foreach (ConnectionPeer connectionPeer in peers) { var matchingNodes = from DataRow r in DataTable.Rows let nodeInDataTable = (ConnectionPeer)r["Address"] where nodeInDataTable.RemoteSocketEndpoint == connectionPeer.RemoteSocketEndpoint select r; if (!matchingNodes.Any()) { object[] rowData = new object[2]; CreateColumnIfNotExist("Type", "Type", typeof(String), 16); rowData[DataTable.Columns.IndexOf("Type")] = connectionPeer.PeerType; CreateColumnIfNotExist("Address", "Address", typeof(ConnectionPeer), 130); rowData[DataTable.Columns.IndexOf("Address")] = connectionPeer; DataTable.Rows.Add(rowData); } } }