From d19564131920c9925e359374800157e508544d67 Mon Sep 17 00:00:00 2001
From: xljiulang <366193849@qq.com>
Date: Thu, 17 Jun 2021 23:39:51 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84xml=E6=B3=A8=E9=87=8A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
FastGithub.Core/OptionsAttribute.cs | 5 ++-
FastGithub.Dns/DnsHostedService.cs | 25 +++++++++--
FastGithub.Dns/DnsOptions.cs | 9 ++++
FastGithub.Dns/GithubRequestResolver.cs | 17 +++++++-
FastGithub.Scanner/DomainAddress.cs | 8 ++++
FastGithub.Scanner/DomainAddressFacotry.cs | 11 +++++
.../GithubMetaProvider.cs | 19 +++++++++
.../IPAddressComProvider.cs | 18 ++++++++
.../PublicDnsProvider.cs | 18 ++++++++
FastGithub.Scanner/GithubContext.cs | 21 +++++++---
FastGithub.Scanner/GithubContextCollection.cs | 22 ++++++++--
FastGithub.Scanner/GithubContextHistory.cs | 11 +++++
.../GithubFullScanHostedService.cs | 14 ++++++-
FastGithub.Scanner/GithubOptions.cs | 15 +++++++
.../GithubResultScanHostedService.cs | 13 ++++++
FastGithub.Scanner/GithubScanService.cs | 28 ++++++++++---
FastGithub.Scanner/IDomainAddressProvider.cs | 7 ++++
FastGithub.Scanner/IGithubScanResults.cs | 14 +++++++
FastGithub.Scanner/IPAddressRange.cs | 42 ++++++++++++++++---
.../ScanMiddlewares/ConcurrentMiddleware.cs | 12 ++++++
.../ScanMiddlewares/HttpsScanMiddleware.cs | 14 +++++++
.../ScanMiddlewares/StatisticsMiddleware.cs | 13 ++++++
.../ScanMiddlewares/TcpScanMiddleware.cs | 14 +++++++
23 files changed, 345 insertions(+), 25 deletions(-)
diff --git a/FastGithub.Core/OptionsAttribute.cs b/FastGithub.Core/OptionsAttribute.cs
index 65dadb6..a123be5 100644
--- a/FastGithub.Core/OptionsAttribute.cs
+++ b/FastGithub.Core/OptionsAttribute.cs
@@ -8,6 +8,9 @@ namespace FastGithub
[AttributeUsage(AttributeTargets.Class)]
public sealed class OptionsAttribute : Attribute
{
+ ///
+ /// 获取配置节点名称
+ ///
public string? SessionKey { get; }
///
@@ -20,7 +23,7 @@ namespace FastGithub
///
/// 选项特性
///
- ///
+ /// 配置节点名称
public OptionsAttribute(string sessionKey)
{
this.SessionKey = sessionKey;
diff --git a/FastGithub.Dns/DnsHostedService.cs b/FastGithub.Dns/DnsHostedService.cs
index 1a952fb..bbad889 100644
--- a/FastGithub.Dns/DnsHostedService.cs
+++ b/FastGithub.Dns/DnsHostedService.cs
@@ -7,20 +7,34 @@ using System.Threading.Tasks;
namespace FastGithub.Dns
{
+ ///
+ /// dns后台服务
+ ///
sealed class DnsHostedService : IHostedService
{
- private readonly DnsServer dnsServer;
+ private readonly DnsServer dnsServer;
private readonly ILogger logger;
+ ///
+ /// dns后台服务
+ ///
+ ///
+ ///
+ ///
public DnsHostedService(
GithubRequestResolver githubRequestResolver,
IOptions options,
ILogger logger)
{
- this.dnsServer = new DnsServer(githubRequestResolver, options.Value.UpStream);
+ this.dnsServer = new DnsServer(githubRequestResolver, options.Value.UpStream);
this.logger = logger;
- }
+ }
+ ///
+ /// 启动dns服务
+ ///
+ ///
+ ///
public Task StartAsync(CancellationToken cancellationToken)
{
this.dnsServer.Listen();
@@ -28,6 +42,11 @@ namespace FastGithub.Dns
return Task.CompletedTask;
}
+ ///
+ /// 停止dns服务
+ ///
+ ///
+ ///
public Task StopAsync(CancellationToken cancellationToken)
{
this.dnsServer.Dispose();
diff --git a/FastGithub.Dns/DnsOptions.cs b/FastGithub.Dns/DnsOptions.cs
index 2718086..40d561e 100644
--- a/FastGithub.Dns/DnsOptions.cs
+++ b/FastGithub.Dns/DnsOptions.cs
@@ -3,11 +3,20 @@ using System.Net;
namespace FastGithub.Dns
{
+ ///
+ /// dns服务选项
+ ///
[Options("Dns")]
sealed class DnsOptions
{
+ ///
+ /// 获取或设置上游ip地址
+ ///
public IPAddress UpStream { get; set; } = IPAddress.Parse("114.114.114.114");
+ ///
+ /// 获取或设置github相关域名的ip存活时长
+ ///
public TimeSpan GithubTTL { get; set; } = TimeSpan.FromMinutes(10d);
}
}
diff --git a/FastGithub.Dns/GithubRequestResolver.cs b/FastGithub.Dns/GithubRequestResolver.cs
index 3bfa8c9..1948342 100644
--- a/FastGithub.Dns/GithubRequestResolver.cs
+++ b/FastGithub.Dns/GithubRequestResolver.cs
@@ -11,13 +11,22 @@ using System.Threading.Tasks;
namespace FastGithub.Dns
{
+ ///
+ /// github相关域名解析器
+ ///
[Service(ServiceLifetime.Singleton)]
sealed class GithubRequestResolver : IRequestResolver
{
private readonly IGithubScanResults githubScanResults;
private readonly IOptionsMonitor options;
- private readonly ILogger logger;
+ private readonly ILogger logger;
+ ///
+ /// github相关域名解析器
+ ///
+ ///
+ ///
+ ///
public GithubRequestResolver(
IGithubScanResults githubScanResults,
IOptionsMonitor options,
@@ -28,6 +37,12 @@ namespace FastGithub.Dns
this.logger = logger;
}
+ ///
+ /// 解析域名
+ ///
+ ///
+ ///
+ ///
public Task Resolve(IRequest request, CancellationToken cancellationToken = default)
{
var response = Response.FromRequest(request);
diff --git a/FastGithub.Scanner/DomainAddress.cs b/FastGithub.Scanner/DomainAddress.cs
index 189145f..5f7989a 100644
--- a/FastGithub.Scanner/DomainAddress.cs
+++ b/FastGithub.Scanner/DomainAddress.cs
@@ -3,6 +3,9 @@ using System.Net;
namespace FastGithub.Scanner
{
+ ///
+ /// 域名与ip关系
+ ///
class DomainAddress : IEquatable
{
///
@@ -15,6 +18,11 @@ namespace FastGithub.Scanner
///
public IPAddress Address { get; }
+ ///
+ /// 域名与ip关系
+ ///
+ ///
+ ///
public DomainAddress(string domain, IPAddress address)
{
this.Domain = domain;
diff --git a/FastGithub.Scanner/DomainAddressFacotry.cs b/FastGithub.Scanner/DomainAddressFacotry.cs
index fec8e0a..d82a691 100644
--- a/FastGithub.Scanner/DomainAddressFacotry.cs
+++ b/FastGithub.Scanner/DomainAddressFacotry.cs
@@ -4,16 +4,27 @@ using System.Threading.Tasks;
namespace FastGithub.Scanner
{
+ ///
+ /// 域名与ip关系工厂
+ ///
[Service(ServiceLifetime.Singleton)]
sealed class DomainAddressFacotry
{
private readonly IEnumerable providers;
+ ///
+ /// 域名与ip关系工厂
+ ///
+ ///
public DomainAddressFacotry(IEnumerable providers)
{
this.providers = providers;
}
+ ///
+ /// 创建域名与ip的关系
+ ///
+ ///
public async Task> CreateDomainAddressesAsync()
{
var hashSet = new HashSet();
diff --git a/FastGithub.Scanner/DomainAddressProviders/GithubMetaProvider.cs b/FastGithub.Scanner/DomainAddressProviders/GithubMetaProvider.cs
index d0543a7..3de74d1 100644
--- a/FastGithub.Scanner/DomainAddressProviders/GithubMetaProvider.cs
+++ b/FastGithub.Scanner/DomainAddressProviders/GithubMetaProvider.cs
@@ -12,12 +12,20 @@ using System.Threading.Tasks;
namespace FastGithub.Scanner.DomainMiddlewares
{
+ ///
+ /// Github公开的域名与ip关系提供者
+ ///
[Service(ServiceLifetime.Singleton, ServiceType = typeof(IDomainAddressProvider))]
sealed class GithubMetaProvider : IDomainAddressProvider
{
private readonly IOptionsMonitor options;
private readonly ILogger logger;
+ ///
+ /// Github公开的域名与ip关系提供者
+ ///
+ ///
+ ///
public GithubMetaProvider(
IOptionsMonitor options,
ILogger logger)
@@ -26,6 +34,10 @@ namespace FastGithub.Scanner.DomainMiddlewares
this.logger = logger;
}
+ ///
+ /// 创建域名与ip的关系
+ ///
+ ///
public async Task> CreateDomainAddressesAsync()
{
var setting = this.options.CurrentValue.DominAddressProviders.GithubMetaProvider;
@@ -51,11 +63,18 @@ namespace FastGithub.Scanner.DomainMiddlewares
return Enumerable.Empty();
}
+ ///
+ /// github的meta结构
+ ///
private class Meta
{
[JsonPropertyName("web")]
public string[] Web { get; set; } = Array.Empty();
+ ///
+ /// 转换为域名与ip关系
+ ///
+ ///
public IEnumerable ToDomainAddresses()
{
foreach (var range in IPAddressRange.From(this.Web).OrderBy(item => item.Size))
diff --git a/FastGithub.Scanner/DomainAddressProviders/IPAddressComProvider.cs b/FastGithub.Scanner/DomainAddressProviders/IPAddressComProvider.cs
index d518236..f2cbe04 100644
--- a/FastGithub.Scanner/DomainAddressProviders/IPAddressComProvider.cs
+++ b/FastGithub.Scanner/DomainAddressProviders/IPAddressComProvider.cs
@@ -11,6 +11,9 @@ using System.Threading.Tasks;
namespace FastGithub.Scanner.DomainMiddlewares
{
+ ///
+ /// ipaddress.com的域名与ip关系提供者
+ ///
[Service(ServiceLifetime.Singleton, ServiceType = typeof(IDomainAddressProvider))]
sealed class IPAddressComProvider : IDomainAddressProvider
{
@@ -18,6 +21,11 @@ namespace FastGithub.Scanner.DomainMiddlewares
private readonly ILogger logger;
private readonly Uri lookupUri = new("https://www.ipaddress.com/ip-lookup");
+ ///
+ /// ipaddress.com的域名与ip关系提供者
+ ///
+ ///
+ ///
public IPAddressComProvider(
IOptionsMonitor options,
ILogger logger)
@@ -26,6 +34,10 @@ namespace FastGithub.Scanner.DomainMiddlewares
this.logger = logger;
}
+ ///
+ /// 创建域名与ip的关系
+ ///
+ ///
public async Task> CreateDomainAddressesAsync()
{
var setting = this.options.CurrentValue.DominAddressProviders.IPAddressComProvider;
@@ -54,6 +66,12 @@ namespace FastGithub.Scanner.DomainMiddlewares
return result;
}
+ ///
+ /// 反查ip
+ ///
+ ///
+ ///
+ ///
private async Task> LookupAsync(HttpClient httpClient, string domain)
{
var keyValue = new KeyValuePair("host", domain);
diff --git a/FastGithub.Scanner/DomainAddressProviders/PublicDnsProvider.cs b/FastGithub.Scanner/DomainAddressProviders/PublicDnsProvider.cs
index 88d4dbd..fd430a6 100644
--- a/FastGithub.Scanner/DomainAddressProviders/PublicDnsProvider.cs
+++ b/FastGithub.Scanner/DomainAddressProviders/PublicDnsProvider.cs
@@ -10,12 +10,20 @@ using System.Threading.Tasks;
namespace FastGithub.Scanner.DomainMiddlewares
{
+ ///
+ /// 公共dns的域名与ip关系提供者
+ ///
[Service(ServiceLifetime.Singleton, ServiceType = typeof(IDomainAddressProvider))]
sealed class PublicDnsProvider : IDomainAddressProvider
{
private readonly IOptionsMonitor options;
private readonly ILogger logger;
+ ///
+ /// 公共dns的域名与ip关系提供者
+ ///
+ ///
+ ///
public PublicDnsProvider(
IOptionsMonitor options,
ILogger logger)
@@ -24,6 +32,10 @@ namespace FastGithub.Scanner.DomainMiddlewares
this.logger = logger;
}
+ ///
+ /// 创建域名与ip的关系
+ ///
+ ///
public async Task> CreateDomainAddressesAsync()
{
var setting = this.options.CurrentValue.DominAddressProviders.PublicDnsProvider;
@@ -45,6 +57,12 @@ namespace FastGithub.Scanner.DomainMiddlewares
return result;
}
+ ///
+ /// 反查ip
+ ///
+ /// dns服务器
+ /// 域名
+ ///
private async Task> LookupAsync(string dns, IEnumerable domains)
{
var client = new DnsClient(dns);
diff --git a/FastGithub.Scanner/GithubContext.cs b/FastGithub.Scanner/GithubContext.cs
index abeb8de..07e5227 100644
--- a/FastGithub.Scanner/GithubContext.cs
+++ b/FastGithub.Scanner/GithubContext.cs
@@ -3,14 +3,11 @@ using System.Net;
namespace FastGithub.Scanner
{
+ ///
+ /// Github扫描上下文
+ ///
sealed class GithubContext : DomainAddress, IEquatable
{
- private record Github(
- string Domain,
- IPAddress Address,
- double AvailableRate,
- double AvgElapsed);
-
///
/// 获取或设置是否可用
///
@@ -22,6 +19,11 @@ namespace FastGithub.Scanner
public GithubContextHistory History { get; } = new();
+ ///
+ /// Github扫描上下文
+ ///
+ ///
+ ///
public GithubContext(string domain, IPAddress address)
: base(domain, address)
{
@@ -41,5 +43,12 @@ namespace FastGithub.Scanner
this.History.AvgElapsed.TotalSeconds
).ToString();
}
+
+ private record Github(
+ string Domain,
+ IPAddress Address,
+ double AvailableRate,
+ double AvgElapsed);
+
}
}
diff --git a/FastGithub.Scanner/GithubContextCollection.cs b/FastGithub.Scanner/GithubContextCollection.cs
index b04cbe3..99aa50a 100644
--- a/FastGithub.Scanner/GithubContextCollection.cs
+++ b/FastGithub.Scanner/GithubContextCollection.cs
@@ -5,12 +5,20 @@ using System.Net;
namespace FastGithub.Scanner
{
+ ///
+ /// GithubContext集合
+ ///
[Service(ServiceLifetime.Singleton)]
sealed class GithubContextCollection : IGithubScanResults
{
private readonly object syncRoot = new();
private readonly List contextList = new();
+ ///
+ /// 添加GithubContext
+ ///
+ ///
+ ///
public bool Add(GithubContext context)
{
lock (this.syncRoot)
@@ -24,7 +32,10 @@ namespace FastGithub.Scanner
}
}
-
+ ///
+ /// 转换为数组
+ ///
+ ///
public GithubContext[] ToArray()
{
lock (this.syncRoot)
@@ -33,7 +44,12 @@ namespace FastGithub.Scanner
}
}
-
+ ///
+ /// 查询ip是否可用
+ ///
+ ///
+ ///
+ ///
public bool IsAvailable(string domain, IPAddress address)
{
lock (this.syncRoot)
@@ -45,7 +61,7 @@ namespace FastGithub.Scanner
}
///
- /// 查找又稳又快的ip
+ /// 查找最优的ip
///
///
///
diff --git a/FastGithub.Scanner/GithubContextHistory.cs b/FastGithub.Scanner/GithubContextHistory.cs
index aec2095..5f9f70e 100644
--- a/FastGithub.Scanner/GithubContextHistory.cs
+++ b/FastGithub.Scanner/GithubContextHistory.cs
@@ -4,8 +4,14 @@ using System.Linq;
namespace FastGithub.Scanner
{
+ ///
+ /// GithubContext的扫描历史
+ ///
sealed class GithubContextHistory
{
+ ///
+ /// 最多保存最的近的10条记录
+ ///
private const int MAX_LOG_COUNT = 10;
private record ScanLog(bool Available, TimeSpan Elapsed);
@@ -54,6 +60,11 @@ namespace FastGithub.Scanner
}
}
+ ///
+ /// 添加记录
+ ///
+ /// 是否可用
+ /// 扫描耗时
public void Add(bool available, TimeSpan elapsed)
{
this.scanLogs.Enqueue(new ScanLog(available, elapsed));
diff --git a/FastGithub.Scanner/GithubFullScanHostedService.cs b/FastGithub.Scanner/GithubFullScanHostedService.cs
index 33eb41f..d745b69 100644
--- a/FastGithub.Scanner/GithubFullScanHostedService.cs
+++ b/FastGithub.Scanner/GithubFullScanHostedService.cs
@@ -6,11 +6,19 @@ using System.Threading.Tasks;
namespace FastGithub
{
+ ///
+ /// 完整扫描后台服务
+ ///
sealed class GithubFullScanHostedService : BackgroundService
{
private readonly GithubScanService githubScanService;
private readonly IOptionsMonitor options;
+ ///
+ /// 完整扫描后台服务
+ ///
+ ///
+ ///
public GithubFullScanHostedService(
GithubScanService githubScanService,
IOptionsMonitor options)
@@ -19,7 +27,11 @@ namespace FastGithub
this.options = options;
}
-
+ ///
+ /// 后台轮询扫描
+ ///
+ ///
+ ///
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (stoppingToken.IsCancellationRequested == false)
diff --git a/FastGithub.Scanner/GithubOptions.cs b/FastGithub.Scanner/GithubOptions.cs
index 5910756..230f456 100644
--- a/FastGithub.Scanner/GithubOptions.cs
+++ b/FastGithub.Scanner/GithubOptions.cs
@@ -2,13 +2,25 @@
namespace FastGithub.Scanner
{
+ ///
+ /// github选项
+ ///
[Options("Github")]
sealed class GithubOptions
{
+ ///
+ /// 扫描配置
+ ///
public ScanSetting Scan { get; set; } = new ScanSetting();
+ ///
+ /// 域名与ip关系提供者配置
+ ///
public DomainAddressProvidersSetting DominAddressProviders { get; set; } = new DomainAddressProvidersSetting();
+ ///
+ /// 扫描配置
+ ///
public class ScanSetting
{
public TimeSpan FullScanInterval = TimeSpan.FromHours(2d);
@@ -20,6 +32,9 @@ namespace FastGithub.Scanner
public TimeSpan HttpsScanTimeout { get; set; } = TimeSpan.FromSeconds(2d);
}
+ ///
+ /// 域名与ip关系提供者配置
+ ///
public class DomainAddressProvidersSetting
{
public GithubMetaProviderSetting GithubMetaProvider { get; set; } = new GithubMetaProviderSetting();
diff --git a/FastGithub.Scanner/GithubResultScanHostedService.cs b/FastGithub.Scanner/GithubResultScanHostedService.cs
index 9ec46b1..510efc9 100644
--- a/FastGithub.Scanner/GithubResultScanHostedService.cs
+++ b/FastGithub.Scanner/GithubResultScanHostedService.cs
@@ -6,11 +6,19 @@ using System.Threading.Tasks;
namespace FastGithub
{
+ ///
+ /// 扫描结果轮询扫描后台服务
+ ///
sealed class GithubResultScanHostedService : BackgroundService
{
private readonly GithubScanService githubScanService;
private readonly IOptionsMonitor options;
+ ///
+ /// 扫描结果轮询扫描后台服务
+ ///
+ ///
+ ///
public GithubResultScanHostedService(
GithubScanService githubScanService,
IOptionsMonitor options)
@@ -19,6 +27,11 @@ namespace FastGithub
this.options = options;
}
+ ///
+ /// 后台轮询扫描
+ ///
+ ///
+ ///
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (stoppingToken.IsCancellationRequested == false)
diff --git a/FastGithub.Scanner/GithubScanService.cs b/FastGithub.Scanner/GithubScanService.cs
index c57dad2..c63684a 100644
--- a/FastGithub.Scanner/GithubScanService.cs
+++ b/FastGithub.Scanner/GithubScanService.cs
@@ -7,24 +7,34 @@ using System.Threading.Tasks;
namespace FastGithub.Scanner
{
+ ///
+ /// github扫描服务
+ ///
[Service(ServiceLifetime.Singleton)]
sealed class GithubScanService
{
private readonly DomainAddressFacotry domainAddressFactory;
+ private readonly GithubContextCollection scanResults;
private readonly ILogger logger;
- private readonly GithubContextCollection contextCollection;
private readonly InvokeDelegate fullScanDelegate;
private readonly InvokeDelegate resultScanDelegate;
+ ///
+ /// github扫描服务
+ ///
+ ///
+ ///
+ ///
+ ///
public GithubScanService(
DomainAddressFacotry domainAddressFactory,
- GithubContextCollection contextCollection,
+ GithubContextCollection scanResults,
IServiceProvider appService,
ILogger logger)
{
this.domainAddressFactory = domainAddressFactory;
- this.contextCollection = contextCollection;
+ this.scanResults = scanResults;
this.logger = logger;
this.fullScanDelegate = new PipelineBuilder(appService, ctx => Task.CompletedTask)
@@ -40,6 +50,10 @@ namespace FastGithub.Scanner
.Build();
}
+ ///
+ /// 扫描所有的ip
+ ///
+ ///
public async Task ScanAllAsync()
{
this.logger.LogInformation("完整扫描开始..");
@@ -59,17 +73,21 @@ namespace FastGithub.Scanner
await this.fullScanDelegate(context);
if (context.Available == true)
{
- this.contextCollection.Add(context);
+ this.scanResults.Add(context);
}
return context.Available;
}
}
+ ///
+ /// 扫描曾经扫描到的结果
+ ///
+ ///
public async Task ScanResultAsync()
{
this.logger.LogInformation("结果扫描开始..");
- var contexts = this.contextCollection.ToArray();
+ var contexts = this.scanResults.ToArray();
foreach (var context in contexts)
{
await this.resultScanDelegate(context);
diff --git a/FastGithub.Scanner/IDomainAddressProvider.cs b/FastGithub.Scanner/IDomainAddressProvider.cs
index af0d97f..1b06dc1 100644
--- a/FastGithub.Scanner/IDomainAddressProvider.cs
+++ b/FastGithub.Scanner/IDomainAddressProvider.cs
@@ -3,8 +3,15 @@ using System.Threading.Tasks;
namespace FastGithub.Scanner
{
+ ///
+ /// 定义域名的ip提值者
+ ///
interface IDomainAddressProvider
{
+ ///
+ /// 创建域名与ip的关系
+ ///
+ ///
Task> CreateDomainAddressesAsync();
}
}
diff --git a/FastGithub.Scanner/IGithubScanResults.cs b/FastGithub.Scanner/IGithubScanResults.cs
index ef126ef..b12be24 100644
--- a/FastGithub.Scanner/IGithubScanResults.cs
+++ b/FastGithub.Scanner/IGithubScanResults.cs
@@ -2,10 +2,24 @@
namespace FastGithub.Scanner
{
+ ///
+ /// 定义扫描结果的接口
+ ///
public interface IGithubScanResults
{
+ ///
+ /// 查询ip是否可用
+ ///
+ ///
+ ///
+ ///
bool IsAvailable(string domain, IPAddress address);
+ ///
+ /// 查找最优的ip
+ ///
+ ///
+ ///
IPAddress? FindBestAddress(string domain);
}
}
diff --git a/FastGithub.Scanner/IPAddressRange.cs b/FastGithub.Scanner/IPAddressRange.cs
index e47ecb6..16ec763 100644
--- a/FastGithub.Scanner/IPAddressRange.cs
+++ b/FastGithub.Scanner/IPAddressRange.cs
@@ -8,12 +8,29 @@ using System.Net.Sockets;
namespace FastGithub.Scanner
{
+ ///
+ /// 表示IP范围
+ ///
+ ///
+ /// • 192.168.1.0/24
+ /// • 192.168.1.1-192.168.1.254
+ ///
abstract class IPAddressRange : IEnumerable
{
+ ///
+ /// 获取ip数量
+ ///
public abstract int Size { get; }
+ ///
+ /// 获取地址族
+ ///
public abstract AddressFamily AddressFamily { get; }
+ ///
+ /// 获取迭代器
+ ///
+ ///
public abstract IEnumerator GetEnumerator();
@@ -22,6 +39,11 @@ namespace FastGithub.Scanner
return this.GetEnumerator();
}
+ ///
+ /// 从多个ip范围文本解析
+ ///
+ ///
+ ///
public static IEnumerable From(IEnumerable ranges)
{
foreach (var item in ranges)
@@ -33,12 +55,17 @@ namespace FastGithub.Scanner
}
}
-
+ ///
+ /// 尝试解析
+ ///
+ ///
+ ///
+ ///
public static bool TryParse(ReadOnlySpan range, [MaybeNullWhen(false)] out IPAddressRange value)
{
if (range.IsEmpty == false && IPNetwork.TryParse(range.ToString(), out var ipNetwork))
{
- value = new NetworkIPAddressRange(ipNetwork);
+ value = new CidrIPAddressRange(ipNetwork);
return true;
}
@@ -61,8 +88,10 @@ namespace FastGithub.Scanner
return false;
}
-
- private class NetworkIPAddressRange : IPAddressRange
+ ///
+ /// 192.168.1.0/24
+ ///
+ private class CidrIPAddressRange : IPAddressRange
{
private readonly IPAddressCollection addressCollection;
@@ -72,7 +101,7 @@ namespace FastGithub.Scanner
public override AddressFamily AddressFamily => this.addressFamily;
- public NetworkIPAddressRange(IPNetwork network)
+ public CidrIPAddressRange(IPNetwork network)
{
this.addressCollection = network.ListIPAddress(FilterEnum.All);
this.addressFamily = network.AddressFamily;
@@ -84,6 +113,9 @@ namespace FastGithub.Scanner
}
}
+ ///
+ /// 192.168.1.1-192.168.1.254
+ ///
private class SplitIPAddressRange : IPAddressRange
{
private readonly IPAddress start;
diff --git a/FastGithub.Scanner/ScanMiddlewares/ConcurrentMiddleware.cs b/FastGithub.Scanner/ScanMiddlewares/ConcurrentMiddleware.cs
index 8a4af05..6b97dde 100644
--- a/FastGithub.Scanner/ScanMiddlewares/ConcurrentMiddleware.cs
+++ b/FastGithub.Scanner/ScanMiddlewares/ConcurrentMiddleware.cs
@@ -5,17 +5,29 @@ using System.Threading.Tasks;
namespace FastGithub.Scanner.ScanMiddlewares
{
+ ///
+ /// 扫描并发限制中间件
+ ///
[Service(ServiceLifetime.Singleton)]
sealed class ConcurrentMiddleware : IMiddleware
{
private readonly SemaphoreSlim semaphoreSlim;
+ ///
+ /// 扫描并发限制中间件
+ ///
public ConcurrentMiddleware()
{
var currentCount = Environment.ProcessorCount * 2;
this.semaphoreSlim = new SemaphoreSlim(currentCount, currentCount);
}
+ ///
+ /// 限制描并发扫
+ ///
+ ///
+ ///
+ ///
public async Task InvokeAsync(GithubContext context, Func next)
{
try
diff --git a/FastGithub.Scanner/ScanMiddlewares/HttpsScanMiddleware.cs b/FastGithub.Scanner/ScanMiddlewares/HttpsScanMiddleware.cs
index 4786dab..69151a8 100644
--- a/FastGithub.Scanner/ScanMiddlewares/HttpsScanMiddleware.cs
+++ b/FastGithub.Scanner/ScanMiddlewares/HttpsScanMiddleware.cs
@@ -10,12 +10,20 @@ using System.Threading.Tasks;
namespace FastGithub.Scanner.ScanMiddlewares
{
+ ///
+ /// https扫描中间件
+ ///
[Service(ServiceLifetime.Singleton)]
sealed class HttpsScanMiddleware : IMiddleware
{
private readonly IOptionsMonitor options;
private readonly ILogger logger;
+ ///
+ /// https扫描中间件
+ ///
+ ///
+ ///
public HttpsScanMiddleware(
IOptionsMonitor options,
ILogger logger)
@@ -24,6 +32,12 @@ namespace FastGithub.Scanner.ScanMiddlewares
this.logger = logger;
}
+ ///
+ /// https扫描
+ ///
+ ///
+ ///
+ ///
public async Task InvokeAsync(GithubContext context, Func next)
{
try
diff --git a/FastGithub.Scanner/ScanMiddlewares/StatisticsMiddleware.cs b/FastGithub.Scanner/ScanMiddlewares/StatisticsMiddleware.cs
index 6febd4a..0f951ec 100644
--- a/FastGithub.Scanner/ScanMiddlewares/StatisticsMiddleware.cs
+++ b/FastGithub.Scanner/ScanMiddlewares/StatisticsMiddleware.cs
@@ -6,16 +6,29 @@ using System.Threading.Tasks;
namespace FastGithub.Scanner.ScanMiddlewares
{
+ ///
+ /// 扫描统计中间件
+ ///
[Service(ServiceLifetime.Singleton)]
sealed class StatisticsMiddleware : IMiddleware
{
private readonly ILogger logger;
+ ///
+ /// 扫描统计中间件
+ ///
+ ///
public StatisticsMiddleware(ILogger logger)
{
this.logger = logger;
}
+ ///
+ /// 记录扫描结果
+ ///
+ ///
+ ///
+ ///
public async Task InvokeAsync(GithubContext context, Func next)
{
var stopwatch = new Stopwatch();
diff --git a/FastGithub.Scanner/ScanMiddlewares/TcpScanMiddleware.cs b/FastGithub.Scanner/ScanMiddlewares/TcpScanMiddleware.cs
index 15d0bb1..d7a3698 100644
--- a/FastGithub.Scanner/ScanMiddlewares/TcpScanMiddleware.cs
+++ b/FastGithub.Scanner/ScanMiddlewares/TcpScanMiddleware.cs
@@ -8,6 +8,9 @@ using System.Threading.Tasks;
namespace FastGithub.Scanner.ScanMiddlewares
{
+ ///
+ /// tcp扫描中间件
+ ///
[Service(ServiceLifetime.Singleton)]
sealed class TcpScanMiddleware : IMiddleware
{
@@ -15,6 +18,11 @@ namespace FastGithub.Scanner.ScanMiddlewares
private readonly IOptionsMonitor options;
private readonly ILogger logger;
+ ///
+ /// tcp扫描中间件
+ ///
+ ///
+ ///
public TcpScanMiddleware(
IOptionsMonitor options,
ILogger logger)
@@ -23,6 +31,12 @@ namespace FastGithub.Scanner.ScanMiddlewares
this.logger = logger;
}
+ ///
+ /// tcp扫描
+ ///
+ ///
+ ///
+ ///
public async Task InvokeAsync(GithubContext context, Func next)
{
try