12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net;
- using System.Runtime.CompilerServices;
- using System.Threading.Tasks;
- using ARSoft.Tools.Net.Dns;
- using Microsoft.Extensions.Options;
- using SiteStatus.Dbo;
-
- namespace SiteStatus.Business
- {
- public class DnsBusiness
- {
- public SettingsDbo Options { get; }
-
- public DnsBusiness(IOptions<SettingsDbo> options)
- {
- Options = options.Value;
- }
-
- public async Task<DnsZoneStatusDbo> GetZoneStatusAsync(string zone, IEnumerable<string> servers)
- {
- var dnsStatus = new DnsZoneStatusDbo
- {
- Zone = zone,
- ServerStatus = new List<DnsZoneServerStatusDbo>()
- };
-
- var list = new List<KeyValuePair<string, Task<List<SoaRecord>>>>();
- var tasks = new List<Task<List<SoaRecord>>>();
- foreach (var server in servers)
- {
- try
- {
- var resolver = new DnsStubResolver(new []{IPAddress.Parse(server)});
- var recordsTask = resolver.ResolveAsync<SoaRecord>(zone, RecordType.Soa);
- list.Add(new KeyValuePair<string, Task<List<SoaRecord>>>(server, recordsTask));
- tasks.Add(recordsTask);
- }
- catch (Exception e)
- {
- tasks.Add(Task.FromResult<List<SoaRecord>>(null));
- }
- }
-
- await Task.WhenAll(tasks.ToArray());
-
- foreach (var recordResult in list)
- {
- try
- {
- var record = recordResult.Value.Result.FirstOrDefault();
- dnsStatus.ServerStatus.Add(new DnsZoneServerStatusDbo
- {
- Server = recordResult.Key,
- Soa = record?.ToString()
- });
- }
- catch (Exception e)
- {
- dnsStatus.ServerStatus.Add(new DnsZoneServerStatusDbo
- {
- Server = recordResult.Key,
- Soa = null
- });
- }
- }
-
- return dnsStatus;
- }
-
- public DnsStatusDbo GetDnsStatus()
- {
- var status = new DnsStatusDbo
- {
- Views = Options.Dns.Views.Select(view =>
- {
- var servers = view.Servers.Select(server => server.Ip).ToList();
- var tasks = view.Zones.Select(zone => GetZoneStatusAsync(zone.Name, servers)).ToArray();
-
- Task.WaitAll(tasks);
-
- var results = tasks.Select(task => task.Result).ToList();
-
- return new DnsStatusViewDbo
- {
- Name = view.Name,
- Zones = results
- };
- }).ToList()
- };
-
- return status;
- }
- }
- }
|