合并后台服务
This commit is contained in:
parent
c542c628f1
commit
249ff7a081
@ -116,19 +116,30 @@ namespace FastGithub.DomainResolve
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 停止dnscrypt-proxy
|
/// 停止dnscrypt-proxy
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void Stop()
|
/// <returns></returns>
|
||||||
|
public bool Stop()
|
||||||
{
|
{
|
||||||
if (OperatingSystem.IsWindows())
|
try
|
||||||
{
|
{
|
||||||
StartDnscryptProxy("-service stop")?.WaitForExit();
|
if (OperatingSystem.IsWindows())
|
||||||
StartDnscryptProxy("-service uninstall")?.WaitForExit();
|
{
|
||||||
|
StartDnscryptProxy("-service stop")?.WaitForExit();
|
||||||
|
StartDnscryptProxy("-service uninstall")?.WaitForExit();
|
||||||
|
}
|
||||||
|
if (this.process != null && this.process.HasExited == false)
|
||||||
|
{
|
||||||
|
this.process.Kill();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
catch (Exception)
|
||||||
if (this.process != null && this.process.HasExited == false)
|
|
||||||
{
|
{
|
||||||
this.process.Kill();
|
return false;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
this.LocalEndPoint = null;
|
||||||
}
|
}
|
||||||
this.LocalEndPoint = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@ -1,65 +0,0 @@
|
|||||||
using Microsoft.Extensions.Hosting;
|
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using System;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace FastGithub.DomainResolve
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// DnscryptProxy后台服务
|
|
||||||
/// </summary>
|
|
||||||
sealed class DnscryptProxyHostedService : BackgroundService
|
|
||||||
{
|
|
||||||
private readonly ILogger<DnscryptProxyHostedService> logger;
|
|
||||||
private readonly DnscryptProxy dnscryptProxy;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// DnscryptProxy后台服务
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="dnscryptProxy"></param>
|
|
||||||
/// <param name="logger"></param>
|
|
||||||
public DnscryptProxyHostedService(
|
|
||||||
DnscryptProxy dnscryptProxy,
|
|
||||||
ILogger<DnscryptProxyHostedService> logger)
|
|
||||||
{
|
|
||||||
this.dnscryptProxy = dnscryptProxy;
|
|
||||||
this.logger = logger;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 启动dnscrypt-proxy
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="stoppingToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await this.dnscryptProxy.StartAsync(stoppingToken);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
this.logger.LogWarning($"{this.dnscryptProxy}启动失败:{ex.Message}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 停止dnscrypt-proxy
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public override Task StopAsync(CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
this.dnscryptProxy.Stop();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
this.logger.LogWarning($"{this.dnscryptProxy}停止失败:{ex.Message}");
|
|
||||||
}
|
|
||||||
return base.StopAsync(cancellationToken);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
74
FastGithub.DomainResolve/DomainResolveHostedService.cs
Normal file
74
FastGithub.DomainResolve/DomainResolveHostedService.cs
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
using Microsoft.Extensions.Hosting;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using System;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace FastGithub.DomainResolve
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 域名解析后台服务
|
||||||
|
/// </summary>
|
||||||
|
sealed class DomainResolveHostedService : BackgroundService
|
||||||
|
{
|
||||||
|
private readonly DnscryptProxy dnscryptProxy;
|
||||||
|
private readonly DomainSpeedTester speedTester;
|
||||||
|
private readonly ILogger<DomainResolveHostedService> logger;
|
||||||
|
|
||||||
|
private readonly TimeSpan speedTestDueTime = TimeSpan.FromSeconds(10d);
|
||||||
|
private readonly TimeSpan speedTestPeriod = TimeSpan.FromMinutes(2d);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 域名解析后台服务
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="dnscryptProxy"></param>
|
||||||
|
/// <param name="speedTester"></param>
|
||||||
|
/// <param name="logger"></param>
|
||||||
|
public DomainResolveHostedService(
|
||||||
|
DnscryptProxy dnscryptProxy,
|
||||||
|
DomainSpeedTester speedTester,
|
||||||
|
ILogger<DomainResolveHostedService> logger)
|
||||||
|
{
|
||||||
|
this.dnscryptProxy = dnscryptProxy;
|
||||||
|
this.speedTester = speedTester;
|
||||||
|
this.logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 停止时
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="cancellationToken"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public override async Task StopAsync(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
await this.speedTester.SaveDomainsAsync();
|
||||||
|
this.dnscryptProxy.Stop();
|
||||||
|
await base.StopAsync(cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 后台任务
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="stoppingToken"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await this.dnscryptProxy.StartAsync(stoppingToken);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
this.logger.LogWarning($"{this.dnscryptProxy}启动失败:{ex.Message}");
|
||||||
|
}
|
||||||
|
|
||||||
|
await Task.Delay(this.speedTestDueTime, stoppingToken);
|
||||||
|
await this.speedTester.LoadDomainsAsync(stoppingToken);
|
||||||
|
while (stoppingToken.IsCancellationRequested == false)
|
||||||
|
{
|
||||||
|
await this.speedTester.TestSpeedAsync(stoppingToken);
|
||||||
|
await Task.Delay(this.speedTestPeriod, stoppingToken);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -13,19 +13,19 @@ namespace FastGithub.DomainResolve
|
|||||||
sealed class DomainResolver : IDomainResolver
|
sealed class DomainResolver : IDomainResolver
|
||||||
{
|
{
|
||||||
private readonly DnsClient dnsClient;
|
private readonly DnsClient dnsClient;
|
||||||
private readonly DomainSpeedTestService speedTestService;
|
private readonly DomainSpeedTester speedTester;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 域名解析器
|
/// 域名解析器
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="dnsClient"></param>
|
/// <param name="dnsClient"></param>
|
||||||
/// <param name="speedTestService"></param>
|
/// <param name="speedTester"></param>
|
||||||
public DomainResolver(
|
public DomainResolver(
|
||||||
DnsClient dnsClient,
|
DnsClient dnsClient,
|
||||||
DomainSpeedTestService speedTestService)
|
DomainSpeedTester speedTester)
|
||||||
{
|
{
|
||||||
this.dnsClient = dnsClient;
|
this.dnsClient = dnsClient;
|
||||||
this.speedTestService = speedTestService;
|
this.speedTester = speedTester;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -51,7 +51,7 @@ namespace FastGithub.DomainResolve
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async IAsyncEnumerable<IPAddress> ResolveAllAsync(string domain, [EnumeratorCancellation] CancellationToken cancellationToken)
|
public async IAsyncEnumerable<IPAddress> ResolveAllAsync(string domain, [EnumeratorCancellation] CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var addresses = this.speedTestService.GetIPAddresses(domain);
|
var addresses = this.speedTester.GetIPAddresses(domain);
|
||||||
if (addresses.Length > 0)
|
if (addresses.Length > 0)
|
||||||
{
|
{
|
||||||
foreach (var address in addresses)
|
foreach (var address in addresses)
|
||||||
@ -61,7 +61,7 @@ namespace FastGithub.DomainResolve
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.speedTestService.Add(domain);
|
this.speedTester.Add(domain);
|
||||||
await foreach (var address in this.dnsClient.ResolveAsync(domain, cancellationToken))
|
await foreach (var address in this.dnsClient.ResolveAsync(domain, cancellationToken))
|
||||||
{
|
{
|
||||||
yield return address;
|
yield return address;
|
||||||
|
|||||||
@ -1,61 +0,0 @@
|
|||||||
using Microsoft.Extensions.Hosting;
|
|
||||||
using System;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace FastGithub.DomainResolve
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 域名的IP测速后台服务
|
|
||||||
/// </summary>
|
|
||||||
sealed class DomainSpeedTestHostedService : BackgroundService
|
|
||||||
{
|
|
||||||
private readonly DomainSpeedTestService speedTestService;
|
|
||||||
private readonly TimeSpan testDueTime = TimeSpan.FromMinutes(1d);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 域名的IP测速后台服务
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="speedTestService"></param>
|
|
||||||
public DomainSpeedTestHostedService(DomainSpeedTestService speedTestService)
|
|
||||||
{
|
|
||||||
this.speedTestService = speedTestService;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 启动时
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public override async Task StartAsync(CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
await this.speedTestService.LoadDataAsync(cancellationToken);
|
|
||||||
await base.StartAsync(cancellationToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 停止时
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public override async Task StopAsync(CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
await this.speedTestService.SaveDataAsync();
|
|
||||||
await base.StopAsync(cancellationToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 后台测速
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="stoppingToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
|
||||||
{
|
|
||||||
while (stoppingToken.IsCancellationRequested == false)
|
|
||||||
{
|
|
||||||
await this.speedTestService.TestSpeedAsync(stoppingToken);
|
|
||||||
await Task.Delay(this.testDueTime, stoppingToken);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -13,9 +13,9 @@ namespace FastGithub.DomainResolve
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 域名的IP测速服务
|
/// 域名的IP测速服务
|
||||||
/// </summary>
|
/// </summary>
|
||||||
sealed class DomainSpeedTestService
|
sealed class DomainSpeedTester
|
||||||
{
|
{
|
||||||
private const string DATA_FILE = "domains.json";
|
private const string DOMAINS_JSON_FILE = "domains.json";
|
||||||
private readonly DnsClient dnsClient;
|
private readonly DnsClient dnsClient;
|
||||||
|
|
||||||
private readonly object syncRoot = new();
|
private readonly object syncRoot = new();
|
||||||
@ -25,7 +25,7 @@ namespace FastGithub.DomainResolve
|
|||||||
/// 域名的IP测速服务
|
/// 域名的IP测速服务
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="dnsClient"></param>
|
/// <param name="dnsClient"></param>
|
||||||
public DomainSpeedTestService(DnsClient dnsClient)
|
public DomainSpeedTester(DnsClient dnsClient)
|
||||||
{
|
{
|
||||||
this.dnsClient = dnsClient;
|
this.dnsClient = dnsClient;
|
||||||
}
|
}
|
||||||
@ -61,18 +61,18 @@ namespace FastGithub.DomainResolve
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 加载数据
|
/// 加载域名数据
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="cancellationToken"></param>
|
/// <param name="cancellationToken"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task LoadDataAsync(CancellationToken cancellationToken)
|
public async Task LoadDomainsAsync(CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
if (File.Exists(DATA_FILE) == false)
|
if (File.Exists(DOMAINS_JSON_FILE) == false)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
using var fileStream = File.OpenRead(DATA_FILE);
|
using var fileStream = File.OpenRead(DOMAINS_JSON_FILE);
|
||||||
var domains = await JsonSerializer.DeserializeAsync<string[]>(fileStream, cancellationToken: cancellationToken);
|
var domains = await JsonSerializer.DeserializeAsync<string[]>(fileStream, cancellationToken: cancellationToken);
|
||||||
if (domains == null)
|
if (domains == null)
|
||||||
{
|
{
|
||||||
@ -89,10 +89,10 @@ namespace FastGithub.DomainResolve
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 保存数据
|
/// 保存域名数据
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<bool> SaveDataAsync()
|
public async Task<bool> SaveDomainsAsync()
|
||||||
{
|
{
|
||||||
var domains = this.domainIPAddressHashSet.Keys
|
var domains = this.domainIPAddressHashSet.Keys
|
||||||
.Select(item => new DomainPattern(item))
|
.Select(item => new DomainPattern(item))
|
||||||
@ -102,7 +102,7 @@ namespace FastGithub.DomainResolve
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using var fileStream = File.OpenWrite(DATA_FILE);
|
using var fileStream = File.OpenWrite(DOMAINS_JSON_FILE);
|
||||||
await JsonSerializer.SerializeAsync(fileStream, domains, new JsonSerializerOptions { WriteIndented = true });
|
await JsonSerializer.SerializeAsync(fileStream, domains, new JsonSerializerOptions { WriteIndented = true });
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -18,10 +18,9 @@ namespace FastGithub
|
|||||||
{
|
{
|
||||||
services.TryAddSingleton<DnsClient>();
|
services.TryAddSingleton<DnsClient>();
|
||||||
services.TryAddSingleton<DnscryptProxy>();
|
services.TryAddSingleton<DnscryptProxy>();
|
||||||
services.TryAddSingleton<DomainSpeedTestService>();
|
services.TryAddSingleton<DomainSpeedTester>();
|
||||||
services.TryAddSingleton<IDomainResolver, DomainResolver>();
|
services.TryAddSingleton<IDomainResolver, DomainResolver>();
|
||||||
services.AddHostedService<DnscryptProxyHostedService>();
|
services.AddHostedService<DomainResolveHostedService>();
|
||||||
services.AddHostedService<DomainSpeedTestHostedService>();
|
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user