From c5c5443922e25df8400f19e36e2d4f830ed5fe41 Mon Sep 17 00:00:00 2001
From: xljiulang <366193849@qq.com>
Date: Tue, 15 Jun 2021 23:51:11 +0800
Subject: [PATCH] =?UTF-8?q?=E5=88=86=E8=A7=A3=E9=A1=B9=E7=9B=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
FastGithub.Core/FastGithub.Core.csproj | 12 ++
FastGithub.Core/OptionsAttribute.cs | 29 +++++
FastGithub.Core/ServiceAttribute.cs | 32 +++++
.../ServiceCollectionExtensions.cs | 118 ++++++++++++++++++
FastGithub.Dns/DnsHostedService.cs | 38 ++++++
{FastGithub => FastGithub.Dns}/DnsOptions.cs | 5 +-
.../DnsServiceCollectionExtensions.cs | 27 ++++
FastGithub.Dns/FastGithub.Dns.csproj | 15 +++
FastGithub.Dns/GithubRequestResolver.cs | 48 +++++++
FastGithub.Scanner/FastGithub.Scanner.csproj | 18 +++
.../GithubContext.cs | 4 +-
.../GithubContextHashSet.cs | 2 +-
.../GithubFullScanHostedService.cs | 11 +-
.../GithubMetaService.cs | 6 +-
.../GithubOptions.cs | 3 +-
.../GithubResultScanHostedService.cs | 11 +-
.../GithubScanBuilder.cs | 2 +-
.../GithubScanBuilderExtensions.cs | 2 +-
.../GithubScanDelegate.cs | 2 +-
.../GithubScanService.cs | 24 ++--
.../IGithubScanBuilder.cs | 2 +-
.../IGithubScanMiddleware.cs | 2 +-
FastGithub.Scanner/IGithubScanService.cs | 13 ++
{FastGithub => FastGithub.Scanner}/IPRange.cs | 2 +-
{FastGithub => FastGithub.Scanner}/Meta.cs | 2 +-
.../Middlewares/ConcurrentMiddleware.cs | 6 +-
.../Middlewares/HttpsScanMiddleware.cs | 6 +-
.../Middlewares/PortScanMiddleware.cs | 6 +-
.../Middlewares/ScanOkLogMiddleware.cs | 6 +-
.../ScannerServiceCollectionExtensions.cs | 40 ++++++
FastGithub.sln | 18 +++
FastGithub/DnsHostedService.cs | 76 -----------
FastGithub/FastGithub.csproj | 33 +++--
FastGithub/Program.cs | 31 +----
34 files changed, 489 insertions(+), 163 deletions(-)
create mode 100644 FastGithub.Core/FastGithub.Core.csproj
create mode 100644 FastGithub.Core/OptionsAttribute.cs
create mode 100644 FastGithub.Core/ServiceAttribute.cs
create mode 100644 FastGithub.Core/ServiceCollectionExtensions.cs
create mode 100644 FastGithub.Dns/DnsHostedService.cs
rename {FastGithub => FastGithub.Dns}/DnsOptions.cs (62%)
create mode 100644 FastGithub.Dns/DnsServiceCollectionExtensions.cs
create mode 100644 FastGithub.Dns/FastGithub.Dns.csproj
create mode 100644 FastGithub.Dns/GithubRequestResolver.cs
create mode 100644 FastGithub.Scanner/FastGithub.Scanner.csproj
rename {FastGithub => FastGithub.Scanner}/GithubContext.cs (91%)
rename {FastGithub => FastGithub.Scanner}/GithubContextHashSet.cs (84%)
rename FastGithub/GithubScanAllHostedService.cs => FastGithub.Scanner/GithubFullScanHostedService.cs (71%)
rename {FastGithub => FastGithub.Scanner}/GithubMetaService.cs (88%)
rename {FastGithub => FastGithub.Scanner}/GithubOptions.cs (90%)
rename FastGithub/GithubScanResultHostedService.cs => FastGithub.Scanner/GithubResultScanHostedService.cs (71%)
rename {FastGithub => FastGithub.Scanner}/GithubScanBuilder.cs (98%)
rename {FastGithub => FastGithub.Scanner}/GithubScanBuilderExtensions.cs (97%)
rename {FastGithub => FastGithub.Scanner}/GithubScanDelegate.cs (90%)
rename {FastGithub => FastGithub.Scanner}/GithubScanService.cs (73%)
rename {FastGithub => FastGithub.Scanner}/IGithubScanBuilder.cs (95%)
rename {FastGithub => FastGithub.Scanner}/IGithubScanMiddleware.cs (93%)
create mode 100644 FastGithub.Scanner/IGithubScanService.cs
rename {FastGithub => FastGithub.Scanner}/IPRange.cs (99%)
rename {FastGithub => FastGithub.Scanner}/Meta.cs (98%)
rename {FastGithub => FastGithub.Scanner}/Middlewares/ConcurrentMiddleware.cs (78%)
rename {FastGithub => FastGithub.Scanner}/Middlewares/HttpsScanMiddleware.cs (92%)
rename {FastGithub => FastGithub.Scanner}/Middlewares/PortScanMiddleware.cs (88%)
rename {FastGithub => FastGithub.Scanner}/Middlewares/ScanOkLogMiddleware.cs (77%)
create mode 100644 FastGithub.Scanner/ScannerServiceCollectionExtensions.cs
delete mode 100644 FastGithub/DnsHostedService.cs
diff --git a/FastGithub.Core/FastGithub.Core.csproj b/FastGithub.Core/FastGithub.Core.csproj
new file mode 100644
index 00000000..9b80a69b
--- /dev/null
+++ b/FastGithub.Core/FastGithub.Core.csproj
@@ -0,0 +1,12 @@
+
+
+
+ net5.0
+ enable
+
+
+
+
+
+
+
diff --git a/FastGithub.Core/OptionsAttribute.cs b/FastGithub.Core/OptionsAttribute.cs
new file mode 100644
index 00000000..65dadb60
--- /dev/null
+++ b/FastGithub.Core/OptionsAttribute.cs
@@ -0,0 +1,29 @@
+using System;
+
+namespace FastGithub
+{
+ ///
+ /// 表示选项特性
+ ///
+ [AttributeUsage(AttributeTargets.Class)]
+ public sealed class OptionsAttribute : Attribute
+ {
+ public string? SessionKey { get; }
+
+ ///
+ /// 选项特性
+ ///
+ public OptionsAttribute()
+ {
+ }
+
+ ///
+ /// 选项特性
+ ///
+ ///
+ public OptionsAttribute(string sessionKey)
+ {
+ this.SessionKey = sessionKey;
+ }
+ }
+}
diff --git a/FastGithub.Core/ServiceAttribute.cs b/FastGithub.Core/ServiceAttribute.cs
new file mode 100644
index 00000000..be8f59dd
--- /dev/null
+++ b/FastGithub.Core/ServiceAttribute.cs
@@ -0,0 +1,32 @@
+using Microsoft.Extensions.DependencyInjection;
+using System;
+
+namespace FastGithub
+{
+ ///
+ /// 表示服务特性
+ ///
+ [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)]
+ public sealed class ServiceAttribute : Attribute
+ {
+ ///
+ /// 获取服务的生命周期
+ ///
+ public ServiceLifetime Lifetime { get; }
+
+ ///
+ /// 获取或设置注册的服务类型
+ /// 为null直接使得当前类型
+ ///
+ public Type? ServiceType { get; set; }
+
+ ///
+ /// 将当前实现类型注册为服务的特性
+ ///
+ /// 生命周期
+ public ServiceAttribute(ServiceLifetime lifetime)
+ {
+ Lifetime = lifetime;
+ }
+ }
+}
diff --git a/FastGithub.Core/ServiceCollectionExtensions.cs b/FastGithub.Core/ServiceCollectionExtensions.cs
new file mode 100644
index 00000000..7b0e7443
--- /dev/null
+++ b/FastGithub.Core/ServiceCollectionExtensions.cs
@@ -0,0 +1,118 @@
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using System;
+using System.Linq;
+using System.Reflection;
+
+namespace FastGithub
+{
+ ///
+ /// 服务注册扩展
+ ///
+ public static class ServiceCollectionExtensions
+ {
+ ///
+ /// 注册程序集下所有服务下选项
+ ///
+ ///
+ /// 配置
+ ///
+ public static IServiceCollection AddServiceAndOptions(this IServiceCollection services, Assembly assembly, IConfiguration configuration)
+ {
+ services.AddAttributeServices(assembly);
+ services.AddAttributeOptions(assembly, configuration);
+
+ return services;
+ }
+
+ ///
+ /// 添加程序集下ServiceAttribute标记的服务
+ ///
+ ///
+ ///
+ ///
+ private static IServiceCollection AddAttributeServices(this IServiceCollection services, Assembly assembly)
+ {
+ var implTypes = assembly
+ .GetTypes()
+ .Where(item => item.IsClass && item.IsAbstract == false)
+ .ToArray();
+
+ foreach (var implType in implTypes)
+ {
+ var attributes = implType.GetCustomAttributes(false);
+ foreach (var attr in attributes)
+ {
+ var serviceType = attr.ServiceType ?? implType;
+ if (services.Any(item => item.ServiceType == serviceType && item.ImplementationType == implType) == false)
+ {
+ var descriptor = ServiceDescriptor.Describe(serviceType, implType, attr.Lifetime);
+ services.Add(descriptor);
+ }
+ }
+ }
+ return services;
+ }
+
+
+ ///
+ /// 添加程序集下OptionsAttribute标记的服务
+ ///
+ ///
+ ///
+ ///
+ private static IServiceCollection AddAttributeOptions(this IServiceCollection services, Assembly assembly, IConfiguration configuration)
+ {
+ foreach (var optionsType in assembly.GetTypes())
+ {
+ var optionsAttribute = optionsType.GetCustomAttribute();
+ if (optionsAttribute != null)
+ {
+ var key = optionsAttribute.SessionKey ?? optionsType.Name;
+ var section = configuration.GetSection(key);
+ OptionsBinder.Create(services, optionsType).Bind(section);
+ }
+ }
+ return services;
+ }
+
+ ///
+ /// options绑定器
+ ///
+ private abstract class OptionsBinder
+ {
+ public abstract void Bind(IConfiguration configuration);
+
+ ///
+ /// 创建OptionsBinder实例
+ ///
+ ///
+ ///
+ ///
+ public static OptionsBinder Create(IServiceCollection services, Type optionsType)
+ {
+ var binderType = typeof(OptionsBinderImpl<>).MakeGenericType(optionsType);
+ var binder = Activator.CreateInstance(binderType, new object[] { services });
+
+ return binder is OptionsBinder optionsBinder
+ ? optionsBinder
+ : throw new TypeInitializationException(binderType.FullName, null);
+ }
+
+ private class OptionsBinderImpl : OptionsBinder where TOptions : class
+ {
+ private readonly IServiceCollection services;
+
+ public OptionsBinderImpl(IServiceCollection services)
+ {
+ this.services = services;
+ }
+
+ public override void Bind(IConfiguration configuration)
+ {
+ this.services.AddOptions().Bind(configuration);
+ }
+ }
+ }
+ }
+}
diff --git a/FastGithub.Dns/DnsHostedService.cs b/FastGithub.Dns/DnsHostedService.cs
new file mode 100644
index 00000000..1a952fbb
--- /dev/null
+++ b/FastGithub.Dns/DnsHostedService.cs
@@ -0,0 +1,38 @@
+using DNS.Server;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FastGithub.Dns
+{
+ sealed class DnsHostedService : IHostedService
+ {
+ private readonly DnsServer dnsServer;
+ private readonly ILogger logger;
+
+ public DnsHostedService(
+ GithubRequestResolver githubRequestResolver,
+ IOptions options,
+ ILogger logger)
+ {
+ this.dnsServer = new DnsServer(githubRequestResolver, options.Value.UpStream);
+ this.logger = logger;
+ }
+
+ public Task StartAsync(CancellationToken cancellationToken)
+ {
+ this.dnsServer.Listen();
+ this.logger.LogInformation("dns服务启用成功");
+ return Task.CompletedTask;
+ }
+
+ public Task StopAsync(CancellationToken cancellationToken)
+ {
+ this.dnsServer.Dispose();
+ this.logger.LogInformation("dns服务已终止");
+ return Task.CompletedTask;
+ }
+ }
+}
diff --git a/FastGithub/DnsOptions.cs b/FastGithub.Dns/DnsOptions.cs
similarity index 62%
rename from FastGithub/DnsOptions.cs
rename to FastGithub.Dns/DnsOptions.cs
index a77c8241..39ef3731 100644
--- a/FastGithub/DnsOptions.cs
+++ b/FastGithub.Dns/DnsOptions.cs
@@ -1,8 +1,9 @@
using System.Net;
-namespace FastGithub
+namespace FastGithub.Dns
{
- class DnsOptions
+ [Options("Dns")]
+ sealed class DnsOptions
{
public IPAddress UpStream { get; set; } = IPAddress.Parse("114.114.114.114");
}
diff --git a/FastGithub.Dns/DnsServiceCollectionExtensions.cs b/FastGithub.Dns/DnsServiceCollectionExtensions.cs
new file mode 100644
index 00000000..ccbf60bc
--- /dev/null
+++ b/FastGithub.Dns/DnsServiceCollectionExtensions.cs
@@ -0,0 +1,27 @@
+using FastGithub.Dns;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace FastGithub
+{
+ ///
+ /// 服务注册扩展
+ ///
+ public static class DnsServiceCollectionExtensions
+ {
+ ///
+ /// 注册github的dns服务
+ ///
+ ///
+ /// 配置
+ ///
+ public static IServiceCollection AddGithubDns(this IServiceCollection services, IConfiguration configuration)
+ {
+ var assembly = typeof(DnsServiceCollectionExtensions).Assembly;
+ return services
+ .AddGithubScanner(configuration)
+ .AddServiceAndOptions(assembly, configuration)
+ .AddHostedService();
+ }
+ }
+}
diff --git a/FastGithub.Dns/FastGithub.Dns.csproj b/FastGithub.Dns/FastGithub.Dns.csproj
new file mode 100644
index 00000000..33f532d6
--- /dev/null
+++ b/FastGithub.Dns/FastGithub.Dns.csproj
@@ -0,0 +1,15 @@
+
+
+
+ net5.0
+ enable
+
+
+
+
+
+
+
+
+
+
diff --git a/FastGithub.Dns/GithubRequestResolver.cs b/FastGithub.Dns/GithubRequestResolver.cs
new file mode 100644
index 00000000..98e8c660
--- /dev/null
+++ b/FastGithub.Dns/GithubRequestResolver.cs
@@ -0,0 +1,48 @@
+using DNS.Client.RequestResolver;
+using DNS.Protocol;
+using DNS.Protocol.ResourceRecords;
+using FastGithub.Scanner;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FastGithub.Dns
+{
+ [Service(ServiceLifetime.Singleton)]
+ sealed class GithubRequestResolver : IRequestResolver
+ {
+ private readonly IGithubScanService githubScanService;
+ private readonly ILogger logger;
+
+ public GithubRequestResolver(
+ IGithubScanService githubScanService,
+ ILogger logger)
+ {
+ this.githubScanService = githubScanService;
+ this.logger = logger;
+ }
+
+ public Task Resolve(IRequest request, CancellationToken cancellationToken = default)
+ {
+ var response = Response.FromRequest(request);
+ var question = request.Questions.FirstOrDefault();
+
+ if (question != null && question.Type == RecordType.A)
+ {
+ var domain = question.Name.ToString();
+ var fastAddress = this.githubScanService.FindFastAddress(domain);
+
+ if (fastAddress != null)
+ {
+ var record = new IPAddressResourceRecord(question.Name, fastAddress);
+ response.AnswerRecords.Add(record);
+ this.logger.LogInformation(record.ToString());
+ }
+ }
+
+ return Task.FromResult(response);
+ }
+ }
+}
diff --git a/FastGithub.Scanner/FastGithub.Scanner.csproj b/FastGithub.Scanner/FastGithub.Scanner.csproj
new file mode 100644
index 00000000..493d088b
--- /dev/null
+++ b/FastGithub.Scanner/FastGithub.Scanner.csproj
@@ -0,0 +1,18 @@
+
+
+
+ net5.0
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FastGithub/GithubContext.cs b/FastGithub.Scanner/GithubContext.cs
similarity index 91%
rename from FastGithub/GithubContext.cs
rename to FastGithub.Scanner/GithubContext.cs
index ff467e07..3f233b79 100644
--- a/FastGithub/GithubContext.cs
+++ b/FastGithub.Scanner/GithubContext.cs
@@ -1,9 +1,9 @@
using System;
using System.Net;
-namespace FastGithub
+namespace FastGithub.Scanner
{
- class GithubContext : IEquatable
+ sealed class GithubContext : IEquatable
{
public string Domain { get; }
diff --git a/FastGithub/GithubContextHashSet.cs b/FastGithub.Scanner/GithubContextHashSet.cs
similarity index 84%
rename from FastGithub/GithubContextHashSet.cs
rename to FastGithub.Scanner/GithubContextHashSet.cs
index d4bd3f2f..828893ae 100644
--- a/FastGithub/GithubContextHashSet.cs
+++ b/FastGithub.Scanner/GithubContextHashSet.cs
@@ -1,6 +1,6 @@
using System.Collections.Generic;
-namespace FastGithub
+namespace FastGithub.Scanner
{
class GithubContextHashSet : HashSet
{
diff --git a/FastGithub/GithubScanAllHostedService.cs b/FastGithub.Scanner/GithubFullScanHostedService.cs
similarity index 71%
rename from FastGithub/GithubScanAllHostedService.cs
rename to FastGithub.Scanner/GithubFullScanHostedService.cs
index 819e4d58..6fc20618 100644
--- a/FastGithub/GithubScanAllHostedService.cs
+++ b/FastGithub.Scanner/GithubFullScanHostedService.cs
@@ -1,17 +1,18 @@
-using Microsoft.Extensions.Hosting;
+using FastGithub.Scanner;
+using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
using System.Threading;
using System.Threading.Tasks;
namespace FastGithub
{
- sealed class GithubScanAllHostedService : BackgroundService
+ sealed class GithubFullScanHostedService : BackgroundService
{
- private readonly GithubScanService githubScanService;
+ private readonly IGithubScanService githubScanService;
private readonly IOptionsMonitor options;
- public GithubScanAllHostedService(
- GithubScanService githubScanService,
+ public GithubFullScanHostedService(
+ IGithubScanService githubScanService,
IOptionsMonitor options)
{
this.githubScanService = githubScanService;
diff --git a/FastGithub/GithubMetaService.cs b/FastGithub.Scanner/GithubMetaService.cs
similarity index 88%
rename from FastGithub/GithubMetaService.cs
rename to FastGithub.Scanner/GithubMetaService.cs
index fd7911c8..265d5564 100644
--- a/FastGithub/GithubMetaService.cs
+++ b/FastGithub.Scanner/GithubMetaService.cs
@@ -1,4 +1,5 @@
-using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System;
using System.Net.Http;
@@ -6,8 +7,9 @@
using System.Threading;
using System.Threading.Tasks;
-namespace FastGithub
+namespace FastGithub.Scanner
{
+ [Service(ServiceLifetime.Singleton)]
sealed class GithubMetaService
{
private readonly IHttpClientFactory httpClientFactory;
diff --git a/FastGithub/GithubOptions.cs b/FastGithub.Scanner/GithubOptions.cs
similarity index 90%
rename from FastGithub/GithubOptions.cs
rename to FastGithub.Scanner/GithubOptions.cs
index cfcae52d..c5f751c1 100644
--- a/FastGithub/GithubOptions.cs
+++ b/FastGithub.Scanner/GithubOptions.cs
@@ -1,7 +1,8 @@
using System;
-namespace FastGithub
+namespace FastGithub.Scanner
{
+ [Options("Github")]
class GithubOptions
{
public TimeSpan ScanAllInterval { get; set; } = TimeSpan.FromHours(12d);
diff --git a/FastGithub/GithubScanResultHostedService.cs b/FastGithub.Scanner/GithubResultScanHostedService.cs
similarity index 71%
rename from FastGithub/GithubScanResultHostedService.cs
rename to FastGithub.Scanner/GithubResultScanHostedService.cs
index 6442a81d..11ab4a0c 100644
--- a/FastGithub/GithubScanResultHostedService.cs
+++ b/FastGithub.Scanner/GithubResultScanHostedService.cs
@@ -1,17 +1,18 @@
-using Microsoft.Extensions.Hosting;
+using FastGithub.Scanner;
+using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
using System.Threading;
using System.Threading.Tasks;
namespace FastGithub
{
- sealed class GithubScanResultHostedService : BackgroundService
+ sealed class GithubResultScanHostedService : BackgroundService
{
- private readonly GithubScanService githubScanService;
+ private readonly IGithubScanService githubScanService;
private readonly IOptionsMonitor options;
- public GithubScanResultHostedService(
- GithubScanService githubScanService,
+ public GithubResultScanHostedService(
+ IGithubScanService githubScanService,
IOptionsMonitor options)
{
this.githubScanService = githubScanService;
diff --git a/FastGithub/GithubScanBuilder.cs b/FastGithub.Scanner/GithubScanBuilder.cs
similarity index 98%
rename from FastGithub/GithubScanBuilder.cs
rename to FastGithub.Scanner/GithubScanBuilder.cs
index d3469261..077e0a30 100644
--- a/FastGithub/GithubScanBuilder.cs
+++ b/FastGithub.Scanner/GithubScanBuilder.cs
@@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Threading.Tasks;
-namespace FastGithub
+namespace FastGithub.Scanner
{
///
/// 表示中间件创建者
diff --git a/FastGithub/GithubScanBuilderExtensions.cs b/FastGithub.Scanner/GithubScanBuilderExtensions.cs
similarity index 97%
rename from FastGithub/GithubScanBuilderExtensions.cs
rename to FastGithub.Scanner/GithubScanBuilderExtensions.cs
index 6c99ce32..e70cca50 100644
--- a/FastGithub/GithubScanBuilderExtensions.cs
+++ b/FastGithub.Scanner/GithubScanBuilderExtensions.cs
@@ -1,7 +1,7 @@
using System;
using System.Threading.Tasks;
-namespace FastGithub
+namespace FastGithub.Scanner
{
///
/// 中间件创建者扩展
diff --git a/FastGithub/GithubScanDelegate.cs b/FastGithub.Scanner/GithubScanDelegate.cs
similarity index 90%
rename from FastGithub/GithubScanDelegate.cs
rename to FastGithub.Scanner/GithubScanDelegate.cs
index d2908d37..7ae6c838 100644
--- a/FastGithub/GithubScanDelegate.cs
+++ b/FastGithub.Scanner/GithubScanDelegate.cs
@@ -1,6 +1,6 @@
using System.Threading.Tasks;
-namespace FastGithub
+namespace FastGithub.Scanner
{
///
/// 表示所有中间件执行委托
diff --git a/FastGithub/GithubScanService.cs b/FastGithub.Scanner/GithubScanService.cs
similarity index 73%
rename from FastGithub/GithubScanService.cs
rename to FastGithub.Scanner/GithubScanService.cs
index b0a2a87d..11755bfd 100644
--- a/FastGithub/GithubScanService.cs
+++ b/FastGithub.Scanner/GithubScanService.cs
@@ -1,12 +1,15 @@
-using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using System;
using System.Linq;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
-namespace FastGithub
+namespace FastGithub.Scanner
{
- sealed class GithubScanService
+ [Service(ServiceLifetime.Singleton, ServiceType = typeof(IGithubScanService))]
+ sealed class GithubScanService : IGithubScanService
{
private readonly GithubMetaService metaService;
private readonly GithubScanDelegate scanDelegate;
@@ -25,6 +28,7 @@ public GithubScanService(
public async Task ScanAllAsync(CancellationToken cancellationToken = default)
{
+ this.logger.LogInformation("完整扫描开始");
var meta = await this.metaService.GetMetaAsync(cancellationToken);
if (meta != null)
{
@@ -32,7 +36,7 @@ public async Task ScanAllAsync(CancellationToken cancellationToken = default)
await Task.WhenAll(scanTasks);
}
- this.logger.LogInformation("完全扫描完成");
+ this.logger.LogInformation("完整扫描结束");
async Task ScanAsync(GithubContext context)
{
@@ -49,6 +53,7 @@ async Task ScanAsync(GithubContext context)
public async Task ScanResultAsync()
{
+ this.logger.LogInformation("结果扫描开始");
GithubContext[] contexts;
lock (this.results.SyncRoot)
{
@@ -61,18 +66,23 @@ public async Task ScanResultAsync()
await this.scanDelegate(context);
}
- this.logger.LogInformation("结果扫描完成");
+ this.logger.LogInformation("结果扫描结束");
}
- public IPAddress[] FindAddress(string domain)
+ public IPAddress? FindFastAddress(string domain)
{
+ if (domain.Contains("github", StringComparison.OrdinalIgnoreCase))
+ {
+ return default;
+ }
+
lock (this.results.SyncRoot)
{
return this.results
.Where(item => item.Domain == domain && item.HttpElapsed != null)
.OrderBy(item => item.HttpElapsed)
.Select(item => item.Address)
- .ToArray();
+ .FirstOrDefault();
}
}
}
diff --git a/FastGithub/IGithubScanBuilder.cs b/FastGithub.Scanner/IGithubScanBuilder.cs
similarity index 95%
rename from FastGithub/IGithubScanBuilder.cs
rename to FastGithub.Scanner/IGithubScanBuilder.cs
index 94495c9e..3ad34534 100644
--- a/FastGithub/IGithubScanBuilder.cs
+++ b/FastGithub.Scanner/IGithubScanBuilder.cs
@@ -1,6 +1,6 @@
using System;
-namespace FastGithub
+namespace FastGithub.Scanner
{
///
/// 定义中间件管道创建者的接口
diff --git a/FastGithub/IGithubScanMiddleware.cs b/FastGithub.Scanner/IGithubScanMiddleware.cs
similarity index 93%
rename from FastGithub/IGithubScanMiddleware.cs
rename to FastGithub.Scanner/IGithubScanMiddleware.cs
index 6dc1bec2..d1cdf628 100644
--- a/FastGithub/IGithubScanMiddleware.cs
+++ b/FastGithub.Scanner/IGithubScanMiddleware.cs
@@ -1,7 +1,7 @@
using System;
using System.Threading.Tasks;
-namespace FastGithub
+namespace FastGithub.Scanner
{
///
/// 定义中间件的接口
diff --git a/FastGithub.Scanner/IGithubScanService.cs b/FastGithub.Scanner/IGithubScanService.cs
new file mode 100644
index 00000000..44553a37
--- /dev/null
+++ b/FastGithub.Scanner/IGithubScanService.cs
@@ -0,0 +1,13 @@
+using System.Net;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FastGithub.Scanner
+{
+ public interface IGithubScanService
+ {
+ Task ScanAllAsync(CancellationToken cancellationToken = default);
+ Task ScanResultAsync();
+ IPAddress? FindFastAddress(string domain);
+ }
+}
\ No newline at end of file
diff --git a/FastGithub/IPRange.cs b/FastGithub.Scanner/IPRange.cs
similarity index 99%
rename from FastGithub/IPRange.cs
rename to FastGithub.Scanner/IPRange.cs
index 910a9537..f59c08ae 100644
--- a/FastGithub/IPRange.cs
+++ b/FastGithub.Scanner/IPRange.cs
@@ -6,7 +6,7 @@
using System.Net;
using System.Net.Sockets;
-namespace FastGithub
+namespace FastGithub.Scanner
{
sealed class IPRange : IEnumerable
{
diff --git a/FastGithub/Meta.cs b/FastGithub.Scanner/Meta.cs
similarity index 98%
rename from FastGithub/Meta.cs
rename to FastGithub.Scanner/Meta.cs
index 310e01a8..cac86c0c 100644
--- a/FastGithub/Meta.cs
+++ b/FastGithub.Scanner/Meta.cs
@@ -4,7 +4,7 @@
using System.Net.Sockets;
using System.Text.Json.Serialization;
-namespace FastGithub
+namespace FastGithub.Scanner
{
class Meta
{
diff --git a/FastGithub/Middlewares/ConcurrentMiddleware.cs b/FastGithub.Scanner/Middlewares/ConcurrentMiddleware.cs
similarity index 78%
rename from FastGithub/Middlewares/ConcurrentMiddleware.cs
rename to FastGithub.Scanner/Middlewares/ConcurrentMiddleware.cs
index 5a0f38b6..918b2dcc 100644
--- a/FastGithub/Middlewares/ConcurrentMiddleware.cs
+++ b/FastGithub.Scanner/Middlewares/ConcurrentMiddleware.cs
@@ -1,9 +1,11 @@
-using System;
+using Microsoft.Extensions.DependencyInjection;
+using System;
using System.Threading;
using System.Threading.Tasks;
-namespace FastGithub.Middlewares
+namespace FastGithub.Scanner.Middlewares
{
+ [Service(ServiceLifetime.Singleton)]
sealed class ConcurrentMiddleware : IGithubScanMiddleware
{
private readonly SemaphoreSlim semaphoreSlim = new(Environment.ProcessorCount * 4);
diff --git a/FastGithub/Middlewares/HttpsScanMiddleware.cs b/FastGithub.Scanner/Middlewares/HttpsScanMiddleware.cs
similarity index 92%
rename from FastGithub/Middlewares/HttpsScanMiddleware.cs
rename to FastGithub.Scanner/Middlewares/HttpsScanMiddleware.cs
index 2eee9087..e9744955 100644
--- a/FastGithub/Middlewares/HttpsScanMiddleware.cs
+++ b/FastGithub.Scanner/Middlewares/HttpsScanMiddleware.cs
@@ -1,4 +1,5 @@
-using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System;
using System.Linq;
@@ -6,8 +7,9 @@
using System.Threading;
using System.Threading.Tasks;
-namespace FastGithub.Middlewares
+namespace FastGithub.Scanner.Middlewares
{
+ [Service(ServiceLifetime.Singleton)]
sealed class HttpsScanMiddleware : IGithubScanMiddleware
{
private readonly IOptionsMonitor options;
diff --git a/FastGithub/Middlewares/PortScanMiddleware.cs b/FastGithub.Scanner/Middlewares/PortScanMiddleware.cs
similarity index 88%
rename from FastGithub/Middlewares/PortScanMiddleware.cs
rename to FastGithub.Scanner/Middlewares/PortScanMiddleware.cs
index fff41a91..f3058c95 100644
--- a/FastGithub/Middlewares/PortScanMiddleware.cs
+++ b/FastGithub.Scanner/Middlewares/PortScanMiddleware.cs
@@ -1,12 +1,14 @@
-using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System;
using System.Net.Sockets;
using System.Threading;
using System.Threading.Tasks;
-namespace FastGithub.Middlewares
+namespace FastGithub.Scanner.Middlewares
{
+ [Service(ServiceLifetime.Singleton)]
sealed class PortScanMiddleware : IGithubScanMiddleware
{
private const int PORT = 443;
diff --git a/FastGithub/Middlewares/ScanOkLogMiddleware.cs b/FastGithub.Scanner/Middlewares/ScanOkLogMiddleware.cs
similarity index 77%
rename from FastGithub/Middlewares/ScanOkLogMiddleware.cs
rename to FastGithub.Scanner/Middlewares/ScanOkLogMiddleware.cs
index 0e3984de..52aafc55 100644
--- a/FastGithub/Middlewares/ScanOkLogMiddleware.cs
+++ b/FastGithub.Scanner/Middlewares/ScanOkLogMiddleware.cs
@@ -1,9 +1,11 @@
-using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
using System;
using System.Threading.Tasks;
-namespace FastGithub.Middlewares
+namespace FastGithub.Scanner.Middlewares
{
+ [Service(ServiceLifetime.Singleton)]
sealed class ScanOkLogMiddleware : IGithubScanMiddleware
{
private readonly ILogger logger;
diff --git a/FastGithub.Scanner/ScannerServiceCollectionExtensions.cs b/FastGithub.Scanner/ScannerServiceCollectionExtensions.cs
new file mode 100644
index 00000000..8fd91379
--- /dev/null
+++ b/FastGithub.Scanner/ScannerServiceCollectionExtensions.cs
@@ -0,0 +1,40 @@
+using FastGithub.Scanner;
+using FastGithub.Scanner.Middlewares;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using System.Threading.Tasks;
+
+namespace FastGithub
+{
+ ///
+ /// 服务注册扩展
+ ///
+ public static class ScannerServiceCollectionExtensions
+ {
+ ///
+ /// 注册程序集下所有服务下选项
+ ///
+ ///
+ /// 配置
+ ///
+ public static IServiceCollection AddGithubScanner(this IServiceCollection services, IConfiguration configuration)
+ {
+ var assembly = typeof(ScannerServiceCollectionExtensions).Assembly;
+ return services
+ .AddHttpClient()
+ .AddSingleton(serviceProvider =>
+ {
+ return new GithubScanBuilder(serviceProvider, ctx => Task.CompletedTask)
+ .Use()
+ .Use()
+ .Use()
+ .Use()
+ .Build();
+ })
+ .AddServiceAndOptions(assembly, configuration)
+ .AddHostedService()
+ .AddHostedService()
+ ;
+ }
+ }
+}
diff --git a/FastGithub.sln b/FastGithub.sln
index 6f75c346..2b0900c7 100644
--- a/FastGithub.sln
+++ b/FastGithub.sln
@@ -5,6 +5,12 @@ VisualStudioVersion = 16.0.31320.298
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FastGithub", "FastGithub\FastGithub.csproj", "{C1099390-6103-4917-A740-A3002B542FE0}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FastGithub.Core", "FastGithub.Core\FastGithub.Core.csproj", "{4E4841D2-F743-40BB-BE28-729DB53775CC}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FastGithub.Dns", "FastGithub.Dns\FastGithub.Dns.csproj", "{43FF9C79-51D5-4037-AA0B-CA3006E2A7E6}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FastGithub.Scanner", "FastGithub.Scanner\FastGithub.Scanner.csproj", "{7F24CD2F-07C0-4002-A534-80688DE95ECF}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -15,6 +21,18 @@ Global
{C1099390-6103-4917-A740-A3002B542FE0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C1099390-6103-4917-A740-A3002B542FE0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C1099390-6103-4917-A740-A3002B542FE0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4E4841D2-F743-40BB-BE28-729DB53775CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4E4841D2-F743-40BB-BE28-729DB53775CC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4E4841D2-F743-40BB-BE28-729DB53775CC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4E4841D2-F743-40BB-BE28-729DB53775CC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {43FF9C79-51D5-4037-AA0B-CA3006E2A7E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {43FF9C79-51D5-4037-AA0B-CA3006E2A7E6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {43FF9C79-51D5-4037-AA0B-CA3006E2A7E6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {43FF9C79-51D5-4037-AA0B-CA3006E2A7E6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7F24CD2F-07C0-4002-A534-80688DE95ECF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7F24CD2F-07C0-4002-A534-80688DE95ECF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7F24CD2F-07C0-4002-A534-80688DE95ECF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7F24CD2F-07C0-4002-A534-80688DE95ECF}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/FastGithub/DnsHostedService.cs b/FastGithub/DnsHostedService.cs
deleted file mode 100644
index 3e4d0bc6..00000000
--- a/FastGithub/DnsHostedService.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-using DNS.Client.RequestResolver;
-using DNS.Protocol;
-using DNS.Protocol.ResourceRecords;
-using DNS.Server;
-using Microsoft.Extensions.Hosting;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Options;
-using System;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace FastGithub
-{
- sealed class DnsHostedService : IHostedService, IRequestResolver
- {
- private readonly DnsServer dnsServer;
- private readonly GithubScanService githubScanService;
- private readonly ILogger logger;
-
- public DnsHostedService(
- GithubScanService githubScanService,
- IOptions options,
- ILogger logger)
- {
- this.dnsServer = new DnsServer(this, options.Value.UpStream);
- this.githubScanService = githubScanService;
- this.logger = logger;
- }
-
- ///
- /// 解析dns
- ///
- ///
- ///
- ///
- Task IRequestResolver.Resolve(IRequest request, CancellationToken cancellationToken)
- {
- var response = Response.FromRequest(request);
- var question = request.Questions.FirstOrDefault();
-
- if (question != null && question.Type == RecordType.A)
- {
- var domain = question.Name.ToString();
- if (domain.Contains("github", StringComparison.OrdinalIgnoreCase))
- {
- var addressArray = this.githubScanService.FindAddress(domain);
- foreach (var address in addressArray)
- {
- var record = new IPAddressResourceRecord(question.Name, address);
- response.AnswerRecords.Add(record);
- }
-
- var addressString = string.Join(',', addressArray.Select(a => a.ToString()));
- this.logger.LogInformation($"{domain}=>{addressString}");
- }
- }
-
- return Task.FromResult(response);
- }
-
- public Task StartAsync(CancellationToken cancellationToken)
- {
- this.dnsServer.Listen();
- this.logger.LogInformation("dns服务启用成功");
- return Task.CompletedTask;
- }
-
- public Task StopAsync(CancellationToken cancellationToken)
- {
- this.dnsServer.Dispose();
- this.logger.LogInformation("dns服务已终止");
- return Task.CompletedTask;
- }
- }
-}
diff --git a/FastGithub/FastGithub.csproj b/FastGithub/FastGithub.csproj
index 0d95d9a2..d10c7022 100644
--- a/FastGithub/FastGithub.csproj
+++ b/FastGithub/FastGithub.csproj
@@ -1,24 +1,21 @@
-
- Exe
- enable
- net5.0
- true
- 1.0.2
-
+
+ Exe
+ enable
+ net5.0
+ true
+ 1.0.2
+
-
-
-
-
-
-
+
+
+
-
-
- PreserveNewest
-
-
+
+
+ PreserveNewest
+
+
diff --git a/FastGithub/Program.cs b/FastGithub/Program.cs
index c0265628..916f2bdc 100644
--- a/FastGithub/Program.cs
+++ b/FastGithub/Program.cs
@@ -1,7 +1,4 @@
-using FastGithub.Middlewares;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Hosting;
-using System.Threading.Tasks;
+using Microsoft.Extensions.Hosting;
namespace FastGithub
{
@@ -27,32 +24,8 @@ public static IHostBuilder CreateHostBuilder(string[] args)
.CreateDefaultBuilder(args)
.ConfigureServices((ctx, services) =>
{
- services
- .Configure(ctx.Configuration.GetSection("Dns"))
- .Configure(ctx.Configuration.GetSection("Github"))
- .AddHttpClient()
- .AddSingleton()
- .AddSingleton()
-
- .AddSingleton()
- .AddSingleton()
- .AddSingleton()
- .AddSingleton()
- .AddSingleton(serviceProvider =>
- {
- return new GithubScanBuilder(serviceProvider, ctx => Task.CompletedTask)
- .Use()
- .Use()
- .Use()
- .Use()
- .Build();
- })
- .AddHostedService()
- .AddHostedService()
- .AddHostedService()
- ;
+ services.AddGithubDns(ctx.Configuration);
});
-
}
}
}