Exemplo n.º 1
0
        public AgentDescriptor RegisterOrUpdate(AgentDescriptor descriptor)
        {
            Verify(descriptor);

            var desc = dbSetDescriptors.FirstOrDefault(d => d.Id == descriptor.Id);

            if (desc == null || desc.ExpirationDate < DateTime.UtcNow)
            {
                if (desc != null)
                {
                    //Expired
                    dbSetDescriptors.Remove(desc);
                }
                desc = descriptor;
                if (string.IsNullOrEmpty(desc.Id))
                {
                    desc.Id = GetDescriptorId();
                }
                desc.DateCreated    = DateTime.UtcNow;
                desc.ExpirationDate = descriptor.DateCreated.Value.AddDays(tunnelsConfig.ExpirationDays);
                dbSetDescriptors.Add(desc);
            }
            else
            {
                dbContext.Entry(desc).CurrentValues.SetValues(descriptor);
            }
            dbContext.SaveChanges();
            return(desc);
        }
Exemplo n.º 2
0
        private void CheckPortAvailable(AgentDescriptor descriptor)
        {
            var port = descriptor.RemotePort;

            if (port == 0)
            {
                port = tunnelsConfig.PortFrom;
            }
            var attempts    = 0;
            var maxAttempts = (tunnelsConfig.PortTo - tunnelsConfig.PortFrom);

            while (attempts < maxAttempts)
            {
                var exists = dbSetDescriptors.Count(d => d.Id != descriptor.Id && d.RemotePort == port) > 0;
                logger.LogInformation(exists ? "Remote port {0} exists" : "Remote port {0} doesn't exist", descriptor.RemotePort);
                attempts++;
                if (exists)
                {
                    port++;
                    if (port >= tunnelsConfig.PortTo)
                    {
                        port = tunnelsConfig.PortFrom;
                    }
                }
                else
                {
                    break;
                }
            }
            if (attempts > maxAttempts)
            {
                throw new ArgumentException("No more free remote ports");
            }
            descriptor.RemotePort = port;
        }
Exemplo n.º 3
0
        public AgentDescriptor RegisterOrUpdate(AgentDescriptor descriptor)
        {
            if (!descriptors.ContainsKey(descriptor.SshServer) || descriptors[descriptor.SshServer] == null)
            {
                descriptors[descriptor.SshServer] = new List <AgentDescriptor>();
            }
            Verify(descriptor);

            var desc = descriptors[descriptor.SshServer].FirstOrDefault(d => d.Id == descriptor.Id);

            if (desc == null || desc.ExpirationDate < DateTime.UtcNow)
            {
                if (desc != null)
                {
                    //Expired
                    descriptors[descriptor.SshServer].Remove(desc);
                }
                desc                = descriptor;
                desc.Id             = GetDescriptorId(GetAllDescriptors());
                desc.DateCreated    = DateTime.UtcNow;
                desc.ExpirationDate = descriptor.DateCreated.Value.AddDays(tunnelsConfig.ExpirationDays);
                descriptors[descriptor.SshServer].Add(descriptor);
            }
            else
            {
                desc.MachineName    = descriptor.MachineName;
                desc.ClientName     = descriptor.ClientName;
                desc.ExpirationDate = descriptor.ExpirationDate;
                desc.LocalPort      = descriptor.LocalPort;
                desc.RemotePort     = descriptor.RemotePort;
            }
            SaveDescriptors();
            return(desc);
        }
Exemplo n.º 4
0
 private AgentDescriptor RegisterOrUpdate(AgentDescriptor descriptor)
 {
     if (string.IsNullOrEmpty(descriptor.SshServer))
     {
         throw new ArgumentException("SSH server name must be supplied");
     }
     _logger.LogInformation("Registering descriptor {d}", JsonConvert.SerializeObject(descriptor));
     return(descriptorsService.RegisterOrUpdate(descriptor));
 }
Exemplo n.º 5
0
        public void UpdateDescriptor(AgentDescriptor descriptor)
        {
            var desc = dbSetDescriptors.FirstOrDefault(d => d.Id == descriptor.Id);

            if (desc != null)
            {
                dbContext.Entry(desc).CurrentValues.SetValues(descriptor);
                dbContext.SaveChanges();
            }
        }
Exemplo n.º 6
0
        public void Verify(AgentDescriptor descriptor)
        {
            //check server
            if (string.IsNullOrEmpty(descriptor.SshServer))
            {
                descriptor.SshServer = GetAvailableServer(descriptor);
            }

            var port = CheckPortAvailable(descriptor);
        }
Exemplo n.º 7
0
 public void UpdateLastActive(AgentDescriptor descriptor)
 {
     lock (lockObj)
     {
         var desc = dbSetDescriptors.FirstOrDefault(d => d.Id == descriptor.Id);
         if (desc != null)
         {
             desc.LastActive = descriptor.LastActive;
             dbContext.SaveChanges();
         }
     }
 }
Exemplo n.º 8
0
        /// <summary>
        /// Returns sshserver and first available port
        /// </summary>
        /// <param name="descriptor"></param>
        /// <returns></returns>
        public void Verify(AgentDescriptor descriptor)
        {
            //check server
            GetAvailableServer(descriptor);

            CheckPortAvailable(descriptor);

            if (string.IsNullOrEmpty(descriptor.Id))
            {
                descriptor.Id = GetDescriptorId();
            }
        }
Exemplo n.º 9
0
 public AgentDescriptor RegisterAgent([FromBody] AgentDescriptor descriptor)
 {
     try
     {
         return(RegisterOrUpdate(descriptor));
     }
     catch (Exception ex)
     {
         _logger.LogError(ex.Message);
         throw;
     }
 }
Exemplo n.º 10
0
    public static AgentDescriptorData fromComponent(AgentDescriptor descriptor)
    {
        if (descriptor == null) {
            return null;
        }

        AgentDescriptorData descriptorData = new AgentDescriptorData();
        descriptorData.id = descriptor.id;
        descriptorData.agentName = descriptor.agentName;
        descriptorData.portraitId = descriptor.portraitId;
        return descriptorData;
    }
Exemplo n.º 11
0
    public static Agent GetAgent(AgentDescriptor agentDescriptor)
    {
        if (!agentDescriptor.isValid()) {
            return null;
        }

        if (!AGENTS.ContainsKey(agentDescriptor.agentName)) {
            GameLogger.printRed(string.Format("DynamicObjectRegistry:: agent {0} not found", agentDescriptor.agentName));
            return null;
        }

        return AGENTS[agentDescriptor.agentName];
    }
Exemplo n.º 12
0
    public static void AddAgent(AgentDescriptor agentDescriptor, Agent agent)
    {
        if (!agentDescriptor.isValid()) {
            GameLogger.printRed(string.Format("DynamicObjectRegistry:: Cannot add invalid {0} agent descriptor!", agentDescriptor.agentName));
            return;
        }

        if (AGENTS.ContainsKey(agentDescriptor.agentName)) {
            GameLogger.printRed(string.Format("DynamicObjectRegistry:: Agent {0} already present!", agentDescriptor.agentName));
            return;
        }

        AGENTS.Add(agentDescriptor.agentName, agent);
    }
Exemplo n.º 13
0
        public async Task <IActionResult> UpdateLastActive(AgentDescriptor descriptor)
        {
            //Call registrationwebapi and get all agent descriptors
            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Add("X-Api-Key", appSettings.AgentDescriptorsApiKey);
                var response = await client.PutAsync($"{appSettings.AgentDescriptorsApiUrl}/updateLastActive",
                                                     new StringContent(JsonConvert.SerializeObject(descriptor), Encoding.UTF8, "application/json"));

                if (response.StatusCode == System.Net.HttpStatusCode.OK)
                {
                    return(Ok(JsonConvert.DeserializeObject <AgentDescriptor>(response.Content.ReadAsStringAsync().Result)));
                }
                return(BadRequest(response.Content.ReadAsStringAsync().Result));
            }
        }
Exemplo n.º 14
0
 public IActionResult UpdateDescriptor([FromBody] AgentDescriptor descriptor)
 {
     if (string.IsNullOrEmpty(descriptor.SshServer))
     {
         throw new ArgumentException("SSH server must be specified");
     }
     try
     {
         descriptorsService.UpdateDescriptor(descriptor);
     }
     catch (DuplicateRemotePortException)
     {
         return(BadRequest($"Remote port {descriptor.RemotePort} already in use"));
     }
     return(Ok(descriptor));
 }
Exemplo n.º 15
0
 public void UpdateDescriptor(AgentDescriptor descriptor)
 {
     if (descriptors.ContainsKey(descriptor.SshServer))
     {
         var found = descriptors[descriptor.SshServer].FirstOrDefault(d => d.Id == descriptor.Id);
         if (found != null)
         {
             //Check duplicate port
             if (descriptors[descriptor.SshServer].Count(d => d.RemotePort == descriptor.RemotePort && d.Id != descriptor.Id) > 0)
             {
                 throw new DuplicateRemotePortException();
             }
             CopyDescriptor(found, descriptor);
             SaveDescriptors();
         }
     }
 }
Exemplo n.º 16
0
 private void GetAvailableServer(AgentDescriptor descriptor)
 {
     if (string.IsNullOrEmpty(descriptor.SshServer) || descriptor.IdSSHServer <= 0)
     {
         //Find first pingable server with free ports
         var servers = dbSetServers.ToList();
         foreach (var server in servers)
         {
             if (dbSetDescriptors.Count(d => d.SshServer == server.Url || d.IdSSHServer == server.Id) < (tunnelsConfig.PortTo - tunnelsConfig.PortFrom))
             {
                 //there are free ports
                 if (IsServerLive(server))
                 {
                     descriptor.SshServer   = server.Url;
                     descriptor.IdSSHServer = server.Id;
                     return;
                 }
             }
         }
         throw new ArgumentException("No available SSH servers.");
     }
 }
Exemplo n.º 17
0
        public async Task <bool> CheckTunnelAlive([FromBody] AgentDescriptor descriptor)
        {
            try
            {
                using (var client = new HttpClient())
                {
                    var url      = $"http://{descriptor.SshServer}:{descriptor.RemotePort}/?cmd=status&detaillevel=ping";
                    var response = await client.GetAsync(url);

                    var result = JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().Result);
                    if (result != null)
                    {
                        descriptor.LastActive = DateTime.Now;
                        descriptorsService.UpdateLastActive(descriptor);
                    }
                    return(result != null);
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex.Message);
                return(false);
            }
        }
Exemplo n.º 18
0
 public IActionResult UpdateLastActive([FromBody] AgentDescriptor descriptor)
 {
     descriptorsService.UpdateLastActive(descriptor);
     return(Ok(descriptor));
 }
Exemplo n.º 19
0
 public AgentDescriptor VerifyDescriptor([FromBody] AgentDescriptor descriptor)
 {
     descriptorsService.Verify(descriptor);
     return(descriptor);
 }
Exemplo n.º 20
0
 private string GetAvailableServer(AgentDescriptor descriptor)
 {
     //TODO
     return(string.Empty);
 }
Exemplo n.º 21
0
 public void UpdateLastActive(AgentDescriptor descriptor)
 {
     throw new NotImplementedException();
 }
Exemplo n.º 22
0
 public static void toComponent(AgentDescriptorData descriptorData, AgentDescriptor descriptor)
 {
     descriptor.id = descriptorData.id;
     descriptor.agentName = descriptorData.agentName;
     descriptor.portraitId = descriptorData.portraitId;
 }