public Node FindNode(string id)
 {
     using (var db = ApiFab.GetDbContext())
     {
         return(db.Nodes.Find(id));
     }
 }
        private void OnTimer(object state)
        {
            foreach (var network in Network.Networks)
            {
                for (var numOfTryes = 0; numOfTryes < 3; numOfTryes++)
                {
                    try
                    {
                        using (var client = ApiFab.CreateSignalApi(network.SignalIp))
                        {
                            var result = client.GetActiveNodes();
                            var nodes  = result.Nodes.Distinct((n1, n2) => n1.Ip.Equals(n2.Ip)).ToArray();
                            using (var db = ApiFab.GetDbContext())
                            {
                                var dbNodes = db.Nodes.ToArray();
                                foreach (var serverNode in nodes)
                                {
                                    var ip = serverNode.Ip;
                                    if (string.IsNullOrEmpty(ip))
                                    {
                                        continue;
                                    }
                                    var exnode = dbNodes.FirstOrDefault(n => n.Ip.Equals(ip));
                                    if (exnode != null)
                                    {
                                        exnode.ModifyTime = DateTime.Now;
                                        exnode.Version    = serverNode.Version;
                                        db.Nodes.Update(exnode);
                                    }
                                    else
                                    {
                                        var node = new Node
                                        {
                                            Ip      = ip,
                                            Version = serverNode.Version,
                                            Network = network.Id
                                        };
                                        db.Nodes.Add(node);
                                    }

                                    db.SaveChanges();
                                }
                            }
                        }
                        break;
                    }
                    catch (Exception e)
                    {
                        _logger.LogError(e, $"Exception in NodesSource NumOfTryes={numOfTryes}");
                        Thread.Sleep(1000);
                    }
                }
            }

            _timer.Change(Period, 0);
        }
        public NodesData GetNodes(string network)
        {
            var net = Network.GetById(network);

            using (var db = ApiFab.GetDbContext())
            {
                var result = new NodesData
                {
                    Nodes = db.Nodes.Where(n => (n.Network == network) &&
                                           (net.RandomNodes || (n.ModifyTime.AddMinutes(LiveTimeMinutes) >= DateTime.Now)))
                            .OrderBy(n => n.ModifyTime)
                            .Take(1000).ToList()
                };
                return(result);
            }
        }
示例#4
0
        public NodesData GetNodes(string network)
        {
            var net = Network.GetById(network);

            using (var db = ApiFab.GetDbContext())
            {
                var now   = DateTime.Now;
                var nodes = db.Nodes.Where(n => n.Network == network &&
                                           (net.RandomNodes || n.ModifyTime.AddSeconds(Settings.NodesLivePeriodSec) >= now))
                            .OrderBy(n => n.ModifyTime)
                            .Take(1000).ToList();
                var result = new NodesData {
                    Nodes = nodes
                };
                return(result);
            }
        }
示例#5
0
        public ContractsData GetContracts(int page)
        {
            if (page <= 0)
            {
                page = 1;
            }
            var result = new ContractsData {
                Page = page, LastPage = 1
            };

            using (var db = ApiFab.GetDbContext())
            {
                var i = 1;
                foreach (var s in db.Smarts.Where(s => s.Network == Net))
                {
                    result.Contracts.Add(new ContractLinkInfo(i++, s.Address));
                }
            }
            result.NumStr = result.Contracts.Any() ? $"{result.Contracts.First().Index} - {result.Contracts.Last().Index}" : "0";
            return(result);
        }
示例#6
0
        public ContractsData GetContracts(int page)
        {
            if (page <= 0)
            {
                page = 1;
            }
            var result = new ContractsData {
                Page = page
            };

            if (Net == "tetris")
            {
                using (var client = CreateApi())
                {
                    var offset = result.NumPerPage * (page - 1);
                    var res    = client.SmartContractsAllListGet(offset, result.NumPerPage + 1);
                    result.HaveNextPage = res.SmartContractsList.Count > result.NumPerPage;
                    var count = Math.Min(result.NumPerPage, res.SmartContractsList.Count);
                    for (var i = 0; i < count; i++)
                    {
                        var c     = res.SmartContractsList[i];
                        var cInfo = new ContractLinkInfo(i + offset + 1, c.Address);
                        result.Contracts.Add(cInfo);
                    }
                }
            }
            else
            {
                using (var db = ApiFab.GetDbContext())
                {
                    var i = 1;
                    foreach (var s in db.Smarts.Where(s => s.Network == Net))
                    {
                        result.Contracts.Add(new ContractLinkInfo(i++, s.Address));
                    }
                }
            }
            return(result);
        }
示例#7
0
        private void OnCacheTimer(object state)
        {
            var tpState = (IndexServiceState)state;

            try
            {
                if (tpState.Net.Api.EndsWith("/Api"))
                {
                    using (var client = ApiFab.CreateNodeApi(tpState.Net.Ip))
                    {
                        // Service available
                        if (tpState.Net.Updating)
                        {
                            tpState.Net.Updating = false;
                        }

                        // Request blocks
                        if ((!tpState.PoolsOut.Any() && !tpState.PoolsIn.Any()))
                        {
                            var result = client.PoolListGet(0, SizeOut);
                            tpState.PoolsOut = result.Pools.Select(p => new PoolInfo(p)).ToList();
                        }
                        else
                        {
                            var result = client.PoolListGet(0, 20);
                            lock (tpState.PoolsLock)
                            {
                                var firstPoolNum = tpState.PoolsIn.Any()
                                    ? tpState.PoolsIn[0].Number
                                    : tpState.PoolsOut[0].Number;
                                var nPools = result.Pools.TakeWhile(p => (p.PoolNumber > firstPoolNum) || (p.PoolNumber < firstPoolNum - 1000)).Select(p => new PoolInfo(p)).ToList();
                                tpState.PoolsIn = nPools.Concat(tpState.PoolsIn).ToList();
                            }
                        }

                        // Request stats
                        if (tpState.StatRequestCounter == 0)
                        {
                            var stats = client.StatsGet();
                            if (stats != null && stats.Stats.Count >= 4)
                            {
                                var statsSorted = stats.Stats.OrderBy(s => s.PeriodDuration).ToList();
                                var statData    = new StatData();
                                for (var i = 0; i < 4; i++)
                                {
                                    statData.Pdata[i] = new PeriodData(statsSorted[i]);
                                }
                                // Smart contracts count = n
                                using (var db = ApiFab.GetDbContext())
                                    statData.Correct(db.Smarts.Count(s => s.Network == tpState.Net.Id));
                                tpState.StatData = statData;
                            }
                        }
                    }
                }
                else
                {
                    using (var client = ApiFab.CreateTestApi(tpState.Net.Ip))
                    {
                        // Service available
                        if (tpState.Net.Updating)
                        {
                            tpState.Net.Updating = false;
                        }

                        // Request blocks
                        if ((!tpState.PoolsOut.Any() && !tpState.PoolsIn.Any()))
                        {
                            var result = client.PoolListGet(0, SizeOut);
                            tpState.PoolsOut = result.Pools.Where(p => p.PoolNumber > 0).Select(p => new PoolInfo(p)).ToList();
                        }
                        else
                        {
                            var result = client.PoolListGet(0, 20);
                            lock (tpState.PoolsLock)
                            {
                                var firstPoolNum = tpState.PoolsIn.Any()
                                    ? tpState.PoolsIn[0].Number
                                    : tpState.PoolsOut[0].Number;
                                var nPools = result.Pools.Where(p => p.PoolNumber > 0).TakeWhile(p => (p.PoolNumber > firstPoolNum) || (p.PoolNumber < firstPoolNum - 1000)).Select(p => new PoolInfo(p)).ToList();
                                tpState.PoolsIn = nPools.Concat(tpState.PoolsIn).ToList();
                            }
                        }

                        // Request stats
                        if (tpState.StatRequestCounter == 0)
                        {
                            var stats = client.StatsGet();
                            if (stats != null && stats.Stats.Count >= 4)
                            {
                                var statsSorted = stats.Stats.OrderBy(s => s.PeriodDuration).ToList();
                                var statData    = new StatData();
                                for (var i = 0; i < 4; i++)
                                {
                                    statData.Pdata[i] = new PeriodData(statsSorted[i]);
                                }
                                tpState.StatData = statData;
                            }
                        }
                    }
                }
                if (tpState.StatRequestCounter < (120000 / Period))
                {
                    tpState.StatRequestCounter++;
                }
                else
                {
                    tpState.StatRequestCounter = 0;
                }
            }
            catch (Thrift.Transport.TTransportException e)
            {
                tpState.Net.Updating = true;
                _logger.LogError(e, "TTransportException in TpsSource.OnCacheTimer");
            }
            catch (Exception e)
            {
                _logger.LogError(e, "Exception in TpsSource.OnCacheTimer");
            }
            tpState.TimerForCache.Change(Period, 0);
        }
示例#8
0
        private async void OnTimer(object state)
        {
            foreach (var network in Network.Networks)
            {
                for (var numOfTryes = 0; numOfTryes < 3; numOfTryes++)
                {
                    try
                    {
                        if (string.IsNullOrEmpty(network.SignalIp))
                        {
                            break;
                        }

                        using (var client = ApiFab.CreateSignalApi(network.SignalIp))
                        {
                            var result = client.GetActiveNodes();
                            var nodes  = result.Nodes.Distinct((n1, n2) => n1.Ip.Equals(n2.Ip)).ToArray();
                            using (var db = ApiFab.GetDbContext())
                            {
                                var dbNodes = db.Nodes.ToArray();
                                foreach (var serverNode in nodes)
                                {
                                    var ip = serverNode.Ip;
                                    if (string.IsNullOrEmpty(ip))
                                    {
                                        continue;
                                    }
                                    var exnode = dbNodes.FirstOrDefault(n => n.Ip.Equals(ip));
                                    if (exnode != null)
                                    {
                                        exnode.ModifyTime = DateTime.Now;
                                        exnode.Version    = serverNode.Version;
                                        exnode.Platform   = serverNode.Platform;
                                        exnode.Size       = result.Nodes.Count(n => n.Ip.Equals(ip));
                                        db.Nodes.Update(exnode);
                                    }
                                    else
                                    {
                                        var uri     = new Uri($"https://ipapi.co/{ip}/json/");
                                        var nodestr = await GetAsync(uri);

                                        var node = JsonConvert.DeserializeObject <Node>(nodestr);
                                        node.Ip       = ip;
                                        node.Version  = serverNode.Version;
                                        node.Network  = network.Id;
                                        node.Platform = serverNode.Platform;
                                        node.Size     = result.Nodes.Count(n => n.Ip.Equals(ip));
                                        db.Nodes.Add(node);
                                    }
                                    db.SaveChanges();
                                }
                            }
                        }

                        break;
                    }
                    catch (Exception e)
                    {
                        _logger.LogError(e, $"Exception in NodesSource NumOfTryes={numOfTryes}");
                        Thread.Sleep(1000);
                    }
                }
            }

            _timer.Change(_period, 0);
        }