using FastGithub.Configuration; using System; using System.IO; using System.Runtime.Versioning; using System.Text; using System.Threading; using System.Threading.Tasks; namespace FastGithub.Dns { /// /// host文件冲解决者 /// [SupportedOSPlatform("windows")] sealed class HostsConflictSolver : IConflictSolver { private readonly FastGithubConfig fastGithubConfig; /// /// host文件冲解决者 /// /// public HostsConflictSolver( FastGithubConfig fastGithubConfig) { this.fastGithubConfig = fastGithubConfig; } /// /// 解决冲突 /// /// /// public async Task SolveAsync(CancellationToken cancellationToken) { var hostsPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "drivers/etc/hosts"); if (File.Exists(hostsPath) == false) { return; } var hostsBuilder = new StringBuilder(); var lines = await File.ReadAllLinesAsync(hostsPath, cancellationToken); foreach (var line in lines) { if (this.IsConflictingLine(line)) { hostsBuilder.AppendLine($"# {line}"); } else { hostsBuilder.AppendLine(line); } } File.SetAttributes(hostsPath, FileAttributes.Normal); await File.WriteAllTextAsync(hostsPath, hostsBuilder.ToString(), cancellationToken); } /// /// 恢复冲突 /// /// /// public Task RestoreAsync(CancellationToken cancellationToken) { return Task.CompletedTask; } /// /// 是否为冲突的行 /// /// /// private bool IsConflictingLine(string line) { if (line.TrimStart().StartsWith("#")) { return false; } var items = line.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); if (items.Length < 2) { return false; } var domain = items[1]; return this.fastGithubConfig.IsMatch(domain); } } }