You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

StatusController.cs 2.1KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using Microsoft.AspNetCore.Mvc;
  5. using Microsoft.Extensions.Options;
  6. using SiteStatus.Business;
  7. using SiteStatus.Dbo;
  8. namespace SiteStatus.Controllers
  9. {
  10. [Route("api/[controller]")]
  11. [ApiController]
  12. public class StatusController : SSController
  13. {
  14. protected HostBusiness HostBusiness { get; }
  15. public DnsBusiness DnsBusiness { get; }
  16. public SettingsDbo Options { get; }
  17. public StatusController(HostBusiness hostBusiness, DnsBusiness dnsBusiness, IOptions<SettingsDbo> options)
  18. {
  19. HostBusiness = hostBusiness;
  20. DnsBusiness = dnsBusiness;
  21. Options = options.Value;
  22. }
  23. [HttpGet("/api/[controller]/hosts")]
  24. public ApiResultDbo<List<SiteDbo>> GetHosts()
  25. {
  26. var sites = Options.VpnS2s.Sites.Select(site => new SiteDbo
  27. {
  28. Name = string.IsNullOrEmpty(site.Name) ? null : site.Name,
  29. Hosts = site.Hosts.Select(host => new HostDbo
  30. {
  31. HostStatus = null,
  32. Ip = host.Ip
  33. }).ToList()
  34. }).ToList();
  35. var hosts = sites.SelectMany(site => site.Hosts).ToList();
  36. var tasks = hosts.Select(host => HostBusiness.GetHostStatusAsync(host.Ip, Options.VpnS2s.Ping.Count, Options.VpnS2s.Ping.Timeout)).ToArray();
  37. Task.WaitAll(tasks);
  38. foreach (var task in tasks)
  39. {
  40. hosts.First(host => host.Ip == task.Result.Ip.ToString()).HostStatus = task.Result;
  41. }
  42. return Handle(sites);
  43. }
  44. [HttpGet("/api/[controller]/dns")]
  45. public ApiResultDbo<List<DnsZoneStatusDbo>> GetDns()
  46. {
  47. var servers = Options.Dns.Servers.Select(server => server.Ip).ToList();
  48. var tasks = Options.Dns.Zones.Select(zone => DnsBusiness.GetZoneStatusAsync(zone.Name, servers)).ToArray();
  49. Task.WaitAll(tasks);
  50. var results = tasks.Select(task => task.Result).ToList();
  51. return Handle(results);
  52. }
  53. }
  54. }