using FastGithub.Configuration; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.NetworkInformation; using System.Threading.Tasks; namespace FastGithub.Dns { /// /// host文件配置验证器 /// sealed class HostsFileValidator { private readonly FastGithubConfig fastGithubConfig; private readonly ILogger logger; /// /// host文件配置验证器 /// /// /// public HostsFileValidator( FastGithubConfig fastGithubConfig, ILogger logger) { this.fastGithubConfig = fastGithubConfig; this.logger = logger; } /// /// 验证host文件的域名解析配置 /// /// public async Task ValidateAsync() { var hostsPath = @"/etc/hosts"; if (OperatingSystem.IsWindows()) { hostsPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), $"drivers/{hostsPath}"); } if (File.Exists(hostsPath) == false) { return; } var lines = await File.ReadAllLinesAsync(hostsPath); var records = lines.Where(item => item.TrimStart().StartsWith("#") == false); var localAddresses = GetLocalMachineIPAddress().ToArray(); foreach (var record in records) { var items = record.Split(' ', StringSplitOptions.RemoveEmptyEntries); if (items.Length < 2) { continue; } if (IPAddress.TryParse(items[0], out var address) == false) { continue; } if (localAddresses.Contains(address)) { continue; } var domain = items[1]; if (this.fastGithubConfig.IsMatch(domain)) { this.logger.LogError($"由于你的hosts文件设置了[{domain}->{address}],{nameof(FastGithub)}无法加速此域名"); } } } /// /// 获取本机所有ip /// /// private static IEnumerable GetLocalMachineIPAddress() { yield return IPAddress.Loopback; yield return IPAddress.IPv6Loopback; foreach (var @interface in NetworkInterface.GetAllNetworkInterfaces()) { foreach (var addressInfo in @interface.GetIPProperties().UnicastAddresses) { yield return addressInfo.Address; } } } } }