using FastGithub.Configuration;
using Microsoft.Extensions.Logging;
using System;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
namespace FastGithub.Dns
{
///
/// host文件冲突验证器
///
sealed class HostsConflictValidator : IConflictValidator
{
private readonly FastGithubConfig fastGithubConfig;
private readonly ILogger logger;
///
/// host文件冲突验证器
///
///
///
public HostsConflictValidator(
FastGithubConfig fastGithubConfig,
ILogger logger)
{
this.fastGithubConfig = fastGithubConfig;
this.logger = logger;
}
///
/// 验证冲突
///
///
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 localAddresses = LocalMachine.GetAllIPv4Addresses().ToArray();
var lines = await File.ReadAllLinesAsync(hostsPath);
foreach (var line in lines)
{
if (HostsRecord.TryParse(line, out var record) == false)
{
continue;
}
if (localAddresses.Contains(record.Address) == true)
{
continue;
}
if (this.fastGithubConfig.IsMatch(record.Domain))
{
this.logger.LogError($"由于你的hosts文件设置了{record},{nameof(FastGithub)}无法加速此域名");
}
}
}
///
/// hosts文件记录
///
private class HostsRecord
{
///
/// 获取域名
///
public string Domain { get; }
///
/// 获取地址
///
public IPAddress Address { get; }
private HostsRecord(string domain, IPAddress address)
{
this.Domain = domain;
this.Address = address;
}
public override string ToString()
{
return $"[{this.Domain}->{this.Address}]";
}
public static bool TryParse(string record, [MaybeNullWhen(false)] out HostsRecord value)
{
value = null;
if (record.TrimStart().StartsWith("#"))
{
return false;
}
var items = record.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
if (items.Length < 2)
{
return false;
}
if (IPAddress.TryParse(items[0], out var address) == false)
{
return false;
}
value = new HostsRecord(items[1], address);
return true;
}
}
}
}