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);
        }
Esempio n. 2
0
        private void OnTimer(object state)
        {
            try
            {
                foreach (var network in Network.Networks)
                {
                    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 = 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 uri = new Uri($"https://ipapi.co/{ip}/json/");
                                    //var nodestr = await GetAsync(uri);
                                    //var node = JsonConvert.DeserializeObject<Node>(nodestr);
                                    //if (!node.Ip.Equals(ip)) continue;
                                    var node = new Node
                                    {
                                        Ip      = ip,
                                        Version = serverNode.Version,
                                        Network = network.Id
                                    };
                                    db.Nodes.Add(node);
                                }

                                db.SaveChanges();
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                _logger.LogError(e, "Exception in NodesSource");
            }
            _timer.Change(Period, 0);
        }
Esempio n. 3
0
        // Updates the list of nodes, from signal server
        private async Task UpdateNetworkNodes(Network network)
        {
            // Create a connection to the signal server API
            using (var client = ApiFab.CreateSignalApi(network.SignalIp, network.SignalPort))
            {
                // Get the list of nodes from API
                var result = client.GetActiveNodes();

                // Convert nodes to nodeInfos
                var nodes = result.Nodes.Select(n => new NodeInfo(n)).ToList();

                // Try to get country and geo-location for all nodes
                try
                {
                    // Connect to DB
                    using (var db = CsmonDbContext.Create())
                    {
                        // Get nodes, stored in db
                        var dbNodes = db.Nodes.Where(n => n.Network == network.Id).ToList();

                        // Add new nodes into db and update existing
                        foreach (var node in nodes)
                        {
                            var dbNode = dbNodes.FirstOrDefault(n => n.PublicKey.Equals(node.PublicKey));
                            if (dbNode == null)
                            {
                                db.Nodes.Add(new Node(node, network.Id));
                            }
                            else if (!node.EqualsDbNode(dbNode))
                            {
                                db.Nodes.Update(node.UpdateDbNode(dbNode));
                            }
                        }
                        db.SaveChanges();

                        // Get Non-Active nodes from db
                        foreach (var node in dbNodes.Where(n => !nodes.Any(d => d.PublicKey.Equals(n.PublicKey))))
                        {
                            nodes.Add(new NodeInfo(node));
                        }

                        // Find geo data for nodes
                        foreach (var ip in nodes.Select(n => n.Ip).Distinct())
                        {
                            // Try to find node in db by ip address
                            var location = db.Locations.FirstOrDefault(l => l.Ip.Equals(ip));

                            // If not found, try to get info by ip using ipapi.co web service
                            if (location == null)
                            {
                                try
                                {
                                    var uri     = new Uri("https://ipapi.co/" + $"{ip}/json/");
                                    var nodeStr = await GetAsync(uri);

                                    nodeStr     = nodeStr.Replace("\"latitude\": null,", "");
                                    nodeStr     = nodeStr.Replace("\"longitude\": null,", "");
                                    location    = JsonConvert.DeserializeObject <Location>(nodeStr);
                                    location.Ip = ip;
                                    if (location.Org.Length > 64)
                                    {
                                        location.Org = location.Org.Substring(0, 64);
                                    }
                                    // Store data in db
                                    db.Locations.Add(location);
                                    db.SaveChanges();
                                }
                                catch (Exception e)
                                {
                                    _logger.LogError(e, "");
                                    continue;
                                }
                            }

                            // Set location data to nodes
                            foreach (var nodeInfo in nodes.Where(n => n.Ip.Equals(ip)))
                            {
                                nodeInfo.SetLocation(location);
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    _logger.LogError(e, "");
                }

                // Collect additional info about nodes from the network
                try
                {
                    using (var cnt = ApiFab.CreateReleaseApi(network.Ip))
                    {
                        var page = 0;
                        while (true)
                        {
                            var writers = cnt.WritersGet(page++);
                            if (!writers.Writers.Any())
                            {
                                break;
                            }
                            foreach (var writer in writers.Writers)
                            {
                                var key  = Base58Encoding.Encode(writer.Address);
                                var node = nodes.FirstOrDefault(n => n.PublicKey == key);
                                if (node == null)
                                {
                                    continue;
                                }
                                node.TotalFee    = ConvUtils.FormatAmount(writer.FeeCollected);
                                node.TimesWriter = writer.TimesWriter;
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    _logger.LogError(e, "");
                }

                // Hide Ip addresses before output
                foreach (var nodeInfo in nodes)
                {
                    nodeInfo.HideIp();
                }

                // Put the ordered list into the storage
                _states[network.Id].Nodes = nodes.OrderByDescending(n => n.Active).ThenBy(n => n.Ip).ToList();
            }
        }
Esempio n. 4
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);
        }