using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using SiteStatus.Business; using SiteStatus.Dbo; namespace SiteStatus.Controllers { [Route("api/[controller]")] [ApiController] public class StatusController : SSController { protected HostBusiness HostBusiness { get; } public DnsBusiness DnsBusiness { get; } public SettingsDbo Options { get; } public StatusController(HostBusiness hostBusiness, DnsBusiness dnsBusiness, IOptions options) { HostBusiness = hostBusiness; DnsBusiness = dnsBusiness; Options = options.Value; } [HttpGet("/api/[controller]/hosts")] public ApiResultDbo> GetHosts() { var sites = Options.VpnS2s.Sites.Select(site => new SiteDbo { Name = string.IsNullOrEmpty(site.Name) ? null : site.Name, Hosts = site.Hosts.Select(host => new HostDbo { HostStatus = null, Ip = host.Ip }).ToList() }).ToList(); var hosts = sites.SelectMany(site => site.Hosts).ToList(); var tasks = hosts.Select(host => HostBusiness.GetHostStatusAsync(host.Ip, Options.VpnS2s.Ping.Count, Options.VpnS2s.Ping.Timeout)).ToArray(); Task.WaitAll(tasks); foreach (var task in tasks) { hosts.First(host => host.Ip == task.Result.Ip.ToString()).HostStatus = task.Result; } return Handle(sites); } [HttpGet("/api/[controller]/dns")] public ApiResultDbo> GetDns() { var servers = Options.Dns.Servers.Select(server => server.Ip).ToList(); var tasks = Options.Dns.Zones.Select(zone => DnsBusiness.GetZoneStatusAsync(zone.Name, servers)).ToArray(); Task.WaitAll(tasks); var results = tasks.Select(task => task.Result).ToList(); return Handle(results); } } }