您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

DnsBusiness.cs 3.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Runtime.CompilerServices;
  6. using System.Threading.Tasks;
  7. using ARSoft.Tools.Net.Dns;
  8. using Microsoft.Extensions.Options;
  9. using SiteStatus.Dbo;
  10. namespace SiteStatus.Business
  11. {
  12. public class DnsBusiness
  13. {
  14. public SettingsDbo Options { get; }
  15. public DnsBusiness(IOptions<SettingsDbo> options)
  16. {
  17. Options = options.Value;
  18. }
  19. public async Task<DnsZoneStatusDbo> GetZoneStatusAsync(string zone, IEnumerable<string> servers)
  20. {
  21. var dnsStatus = new DnsZoneStatusDbo
  22. {
  23. Zone = zone,
  24. ServerStatus = new List<DnsZoneServerStatusDbo>()
  25. };
  26. var list = new List<KeyValuePair<string, Task<List<SoaRecord>>>>();
  27. var tasks = new List<Task<List<SoaRecord>>>();
  28. foreach (var server in servers)
  29. {
  30. try
  31. {
  32. var resolver = new DnsStubResolver(new []{IPAddress.Parse(server)});
  33. var recordsTask = resolver.ResolveAsync<SoaRecord>(zone, RecordType.Soa);
  34. list.Add(new KeyValuePair<string, Task<List<SoaRecord>>>(server, recordsTask));
  35. tasks.Add(recordsTask);
  36. }
  37. catch (Exception e)
  38. {
  39. tasks.Add(Task.FromResult<List<SoaRecord>>(null));
  40. }
  41. }
  42. await Task.WhenAll(tasks.ToArray());
  43. foreach (var recordResult in list)
  44. {
  45. try
  46. {
  47. var record = recordResult.Value.Result.FirstOrDefault();
  48. dnsStatus.ServerStatus.Add(new DnsZoneServerStatusDbo
  49. {
  50. Server = recordResult.Key,
  51. Soa = record?.ToString()
  52. });
  53. }
  54. catch (Exception e)
  55. {
  56. dnsStatus.ServerStatus.Add(new DnsZoneServerStatusDbo
  57. {
  58. Server = recordResult.Key,
  59. Soa = null
  60. });
  61. }
  62. }
  63. return dnsStatus;
  64. }
  65. public DnsStatusDbo GetDnsStatus()
  66. {
  67. var status = new DnsStatusDbo
  68. {
  69. Views = Options.Dns.Views.Select(view =>
  70. {
  71. var servers = view.Servers.Select(server => server.Ip).ToList();
  72. var tasks = view.Zones.Select(zone => GetZoneStatusAsync(zone.Name, servers)).ToArray();
  73. Task.WaitAll(tasks);
  74. var results = tasks.Select(task => task.Result).ToList();
  75. return new DnsStatusViewDbo
  76. {
  77. Name = view.Name,
  78. Zones = results
  79. };
  80. }).ToList()
  81. };
  82. return status;
  83. }
  84. }
  85. }