TomlUtil.cs 3.1 KB

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