TomlUtil.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. /// 设置日志等级
  33. /// </summary>
  34. /// <param name="tomlPath"></param>
  35. /// <param name="logLevel"></param>
  36. /// <param name="cancellationToken"></param>
  37. /// <returns></returns>
  38. public static Task SetlogLevelAsync(string tomlPath, int logLevel, CancellationToken cancellationToken)
  39. {
  40. return SetAsync(tomlPath, "log_level", new TomlInteger { Value = logLevel });
  41. }
  42. /// <summary>
  43. /// 设置ecs
  44. /// </summary>
  45. /// <param name="tomlPath"></param>
  46. /// <param name="cancellationToken"></param>
  47. /// <returns></returns>
  48. public static async Task<bool> SetEdnsClientSubnetAsync(string tomlPath, CancellationToken cancellationToken = default)
  49. {
  50. try
  51. {
  52. var address = await GetPublicIPAddressAsync(cancellationToken);
  53. if (address != null)
  54. {
  55. var value = new TomlArray { $"{address}/32" };
  56. await SetAsync(tomlPath, "edns_client_subnet", value, cancellationToken);
  57. }
  58. return true;
  59. }
  60. catch (Exception)
  61. {
  62. return false;
  63. }
  64. }
  65. /// <summary>
  66. /// 获取公网ip
  67. /// </summary>
  68. /// <param name="cancellationToken"></param>
  69. /// <returns></returns>
  70. private static async Task<IPAddress?> GetPublicIPAddressAsync(CancellationToken cancellationToken)
  71. {
  72. using var httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(3d) };
  73. var response = await httpClient.GetStringAsync("https://pv.sohu.com/cityjson?ie=utf-8", cancellationToken);
  74. var match = Regex.Match(response, @"\d+\.\d+\.\d+\.\d+");
  75. IPAddress.TryParse(match.Value, out var address);
  76. return address;
  77. }
  78. /// <summary>
  79. /// 设置指定键的值
  80. /// </summary>
  81. /// <param name="tomlPath"></param>
  82. /// <param name="key"></param>
  83. /// <param name="value"></param>
  84. public static async Task SetAsync(string tomlPath, string key, TomlNode value, CancellationToken cancellationToken = default)
  85. {
  86. var toml = await File.ReadAllTextAsync(tomlPath, cancellationToken);
  87. var reader = new StringReader(toml);
  88. var tomlTable = TOML.Parse(reader);
  89. tomlTable[key] = value;
  90. var builder = new StringBuilder();
  91. var writer = new StringWriter(builder);
  92. tomlTable.WriteTo(writer);
  93. toml = builder.ToString();
  94. await File.WriteAllTextAsync(tomlPath, toml, cancellationToken);
  95. }
  96. }
  97. }