Beispiel #1
0
        public async Task RelayXServerAsync(ServerNodeData newServer, List <ServerNodeData> activeXServers, CancellationToken cancellationToken)
        {
            ServerRegisterRequest registerRequest = new ServerRegisterRequest()
            {
                ProfileName     = newServer.ProfileName,
                NetworkAddress  = newServer.NetworkAddress,
                NetworkPort     = newServer.NetworkPort,
                NetworkProtocol = newServer.NetworkProtocol,
                Signature       = newServer.Signature,
                Tier            = newServer.Tier,
                FeeAddress      = newServer.FeeAddress,
                KeyAddress      = newServer.KeyAddress,
                SignAddress     = newServer.SignAddress
            };

            foreach (var activeServer in activeXServers)
            {
                string xServerURL          = networkFeatures.GetServerUrl(activeServer.NetworkProtocol, activeServer.NetworkAddress, activeServer.NetworkPort);
                var    client              = new RestClient(xServerURL);
                var    registerRestRequest = new RestRequest("/registerserver", Method.POST);
                var    request             = JsonConvert.SerializeObject(registerRequest);
                registerRestRequest.AddParameter("application/json; charset=utf-8", request, ParameterType.RequestBody);
                registerRestRequest.RequestFormat = DataFormat.Json;

                var result = await client.ExecuteAsync(registerRestRequest, cancellationToken);
            }
        }
Beispiel #2
0
        private async Task <ServerNodeData> ServerCheck(ServerNodeData serverNode)
        {
            var serverCheck = await networkFeatures.Register(serverNode, serverCheckOnly : true);

            if (serverCheck.Success)
            {
                serverNode.Active   = true;
                serverNode.LastSeen = DateTime.UtcNow;
            }
            else
            {
                serverNode.Active = false;
            }
            return(serverNode);
        }
Beispiel #3
0
        public async Task <IActionResult> RegisterServerAsync([FromBody] ServerRegisterRequest registerRequest)
        {
            xServer.Stats.IncrementPublicRequest();
            ServerNodeData serverNode = new ServerNodeData()
            {
                ProfileName     = registerRequest.ProfileName,
                NetworkAddress  = registerRequest.NetworkAddress,
                NetworkPort     = registerRequest.NetworkPort,
                KeyAddress      = registerRequest.KeyAddress,
                SignAddress     = registerRequest.SignAddress,
                FeeAddress      = registerRequest.FeeAddress,
                Signature       = registerRequest.Signature,
                Tier            = registerRequest.Tier,
                NetworkProtocol = registerRequest.NetworkProtocol
            };

            RegisterResult registerResult = await xServer.Register(serverNode);

            return(Json(registerResult));
        }
Beispiel #4
0
        /// <summary>
        ///     Return xServer from profile name or sign address.
        /// </summary>
        /// <param name="profileName">The profile name to search for the xserver</param>
        /// <param name="signAddress">The sign address to search for the xserver</param>
        /// <returns>xServer found by the search.</returns>
        public ServerRegisterResult SearchForXServer(string profileName = "", string signAddress = "")
        {
            ServerRegisterResult result = new ServerRegisterResult();

            using (X42DbContext dbContext = new X42DbContext(ConnectionString))
            {
                ServerNodeData serverNode = null;
                if (!string.IsNullOrEmpty(profileName))
                {
                    serverNode = dbContext.ServerNodes.Where(sn => sn.ProfileName == profileName).FirstOrDefault();
                }
                else if (!string.IsNullOrEmpty(profileName))
                {
                    serverNode = dbContext.ServerNodes.Where(sn => sn.SignAddress == signAddress).FirstOrDefault();
                }

                if (serverNode != null)
                {
                    result = new ServerRegisterResult()
                    {
                        Id              = serverNode.Id,
                        ProfileName     = serverNode.ProfileName,
                        NetworkProtocol = serverNode.NetworkProtocol,
                        NetworkAddress  = serverNode.NetworkAddress,
                        NetworkPort     = serverNode.NetworkPort,
                        Signature       = serverNode.Signature,
                        Tier            = serverNode.Tier,
                        FeeAddress      = serverNode.FeeAddress,
                        KeyAddress      = serverNode.KeyAddress,
                        SignAddress     = serverNode.SignAddress
                    };
                }
            }

            return(result);
        }
Beispiel #5
0
        private async Task <List <string> > LocateAndAddNewServers(CancellationToken cancellationToken)
        {
            List <string> result = new List <string>();

            using (X42DbContext dbContext = new X42DbContext(databaseSettings.ConnectionString))
            {
                List <ServerNodeData> serverNodes = dbContext.ServerNodes.Where(s => s.Active).ToList();
                string selfProfile      = networkFeatures.GetServerProfile();
                int    localActiveCount = serverNodes.Count();
                var    xServerStats     = await networkFeatures.GetXServerStats();

                if (xServerStats == null)
                {
                    return(result);
                }
                foreach (var connectedXServer in xServerStats.Nodes)
                {
                    var xServer = serverNodes.Where(x => x.NetworkAddress == connectedXServer.NetworkAddress);
                    if (xServer.Count() == 0)
                    {
                        serverNodes.Add(new ServerNodeData()
                        {
                            NetworkAddress  = connectedXServer.NetworkAddress,
                            NetworkPort     = connectedXServer.NetworkPort,
                            NetworkProtocol = connectedXServer.NetworkProtocol
                        });
                    }
                }

                if (serverNodes.Count() > 0)
                {
                    List <ServerNodeData> newserverNodes = new List <ServerNodeData>();
                    foreach (ServerNodeData server in serverNodes)
                    {
                        bool foundSelf           = false;
                        bool xServerSyncComplete = false;
                        long lastId = 0;
                        try
                        {
                            string xServerURL = networkFeatures.GetServerUrl(server.NetworkProtocol, server.NetworkAddress, server.NetworkPort);
                            while (!xServerSyncComplete)
                            {
                                try
                                {
                                    var client = new RestClient(xServerURL);
                                    var allActiveXServersRequest = new RestRequest("/getactivexservers/", Method.GET);
                                    allActiveXServersRequest.AddParameter("fromId", lastId);
                                    var allActiveXServersResult = await client.ExecuteAsync <List <ServerRegisterResult> >(allActiveXServersRequest, cancellationToken).ConfigureAwait(false);

                                    if (allActiveXServersResult.StatusCode == HttpStatusCode.OK)
                                    {
                                        var activeXServersList = allActiveXServersResult.Data;
                                        if (activeXServersList.Count() == 0)
                                        {
                                            xServerSyncComplete = true;
                                        }
                                        else
                                        {
                                            foreach (var serverResult in activeXServersList)
                                            {
                                                if (serverResult.Id > lastId)
                                                {
                                                    lastId = serverResult.Id;
                                                }
                                                if (serverResult.ProfileName == selfProfile)
                                                {
                                                    foundSelf = true;
                                                }
                                                var registeredServer = serverNodes.Where(s => s.Signature == serverResult.Signature).FirstOrDefault();
                                                if (registeredServer == null)
                                                {
                                                    var newServer = new ServerNodeData()
                                                    {
                                                        ProfileName     = serverResult.ProfileName,
                                                        NetworkAddress  = serverResult.NetworkAddress,
                                                        NetworkPort     = serverResult.NetworkPort,
                                                        NetworkProtocol = serverResult.NetworkProtocol,
                                                        Signature       = serverResult.Signature,
                                                        Tier            = serverResult.Tier,
                                                        FeeAddress      = serverResult.FeeAddress,
                                                        SignAddress     = serverResult.SignAddress,
                                                        KeyAddress      = serverResult.KeyAddress,
                                                        Active          = true,
                                                        DateAdded       = DateTime.UtcNow,
                                                        LastSeen        = DateTime.UtcNow,
                                                        Priority        = 0,
                                                        Relayed         = true
                                                    };

                                                    // Local Registration of new nodes we don't know about.
                                                    await networkFeatures.Register(newServer);
                                                }
                                            }
                                        }
                                    }
                                    else
                                    {
                                        xServerSyncComplete = true;
                                    }
                                }
                                catch (Exception ex)
                                {
                                    logger.LogDebug($"Server failed to request during reco", ex);
                                }
                            }
                            if (!foundSelf)
                            {
                                result.Add(xServerURL);
                            }
                        }
                        catch (Exception ex)
                        {
                            logger.LogDebug($"Error in Reconciliation Service", ex);
                        }
                    }
                }
            }
            return(result);
        }