TomlUtil.cs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using FastGithub.Configuration;
  2. using System;
  3. using System.IO;
  4. using System.Net;
  5. using System.Net.Http;
  6. using System.Text;
  7. using System.Text.RegularExpressions;
  8. using System.Threading;
  9. using System.Threading.Tasks;
  10. using Tommy;
  11. namespace FastGithub.DomainResolve
  12. {
  13. /// <summary>
  14. /// doml配置工具
  15. /// </summary>
  16. static class TomlUtil
  17. {
  18. /// <summary>
  19. /// 设置监听地址
  20. /// </summary>
  21. /// <param name="tomlPath"></param>
  22. /// <param name="endpoint"></param>
  23. /// <returns></returns>
  24. public static Task SetListensAsync(string tomlPath, IPEndPoint endpoint, CancellationToken cancellationToken = default)
  25. {
  26. var value = new TomlArray
  27. {
  28. endpoint.ToString()
  29. };
  30. return SetAsync(tomlPath, "listen_addresses", value, cancellationToken);
  31. }
  32. /// <summary>
  33. /// 设置ecs
  34. /// </summary>
  35. /// <param name="tomlPath"></param>
  36. /// <param name="cancellationToken"></param>
  37. /// <returns></returns>
  38. public static async Task<bool> SetEdnsClientSubnetAsync(string tomlPath, CancellationToken cancellationToken = default)
  39. {
  40. try
  41. {
  42. var address = await GetPublicIPAddressAsync(cancellationToken);
  43. var value = new TomlArray
  44. {
  45. $"{address}/32"
  46. };
  47. await SetAsync(tomlPath, "edns_client_subnet", value, cancellationToken);
  48. return true;
  49. }
  50. catch (Exception)
  51. {
  52. return false;
  53. }
  54. }
  55. /// <summary>
  56. /// 获取公网ip
  57. /// </summary>
  58. /// <param name="cancellationToken"></param>
  59. /// <returns></returns>
  60. private static async Task<IPAddress> GetPublicIPAddressAsync(CancellationToken cancellationToken)
  61. {
  62. using var httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(3d) };
  63. var response = await httpClient.GetStringAsync("https://pv.sohu.com/cityjson?ie=utf-8", cancellationToken);
  64. var match = Regex.Match(response, @"\d+\.\d+\.\d+\.\d+");
  65. return match.Success && IPAddress.TryParse(match.Value, out var address)
  66. ? address
  67. : throw new FastGithubException("无法获取外网ip");
  68. }
  69. /// <summary>
  70. /// 设置指定键的值
  71. /// </summary>
  72. /// <param name="tomlPath"></param>
  73. /// <param name="key"></param>
  74. /// <param name="value"></param>
  75. public static async Task SetAsync(string tomlPath, string key, TomlNode value, CancellationToken cancellationToken = default)
  76. {
  77. var toml = await File.ReadAllTextAsync(tomlPath, cancellationToken);
  78. var reader = new StringReader(toml);
  79. var tomlTable = TOML.Parse(reader);
  80. tomlTable[key] = value;
  81. var builder = new StringBuilder();
  82. var writer = new StringWriter(builder);
  83. tomlTable.WriteTo(writer);
  84. toml = builder.ToString();
  85. await File.WriteAllTextAsync(tomlPath, toml, cancellationToken);
  86. }
  87. }
  88. }