dns.dart 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. //fake-ip / redir-host
  2. enum EnhancedMode {
  3. fakeIp,
  4. redirHost;
  5. String get name {
  6. switch (this) {
  7. case EnhancedMode.fakeIp:
  8. return 'fake-ip';
  9. case EnhancedMode.redirHost:
  10. return 'redir-host';
  11. default:
  12. return '';
  13. }
  14. }
  15. String get value {
  16. switch (this) {
  17. case EnhancedMode.fakeIp:
  18. return 'fake-ip';
  19. case EnhancedMode.redirHost:
  20. return 'redir-host';
  21. default:
  22. return '';
  23. }
  24. }
  25. }
  26. class DNSConfig {
  27. final bool enable;
  28. final String listen;
  29. final bool ipv6;
  30. final String enhancedMode;
  31. final List<String> defaultNameserver;
  32. final List<String> nameserver;
  33. final List<String> proxyServerNameserver;
  34. final Map<String,dynamic> nameserverPolicy;
  35. final String? fakeIpRange;
  36. final List<String>? fakeIpFilter;
  37. final List<String>? fallback;
  38. final FallbackFilter? fallbackFilter;
  39. DNSConfig({
  40. required this.enable,
  41. required this.listen,
  42. required this.ipv6,
  43. required this.enhancedMode,
  44. required this.defaultNameserver,
  45. required this.nameserver,
  46. required this.proxyServerNameserver,
  47. required this.nameserverPolicy,
  48. this.fakeIpRange,
  49. this.fakeIpFilter,
  50. this.fallbackFilter,
  51. this.fallback
  52. });
  53. factory DNSConfig.fromMap(Map<String, dynamic> map) {
  54. return DNSConfig(
  55. enable: map['enable'],
  56. listen: map['listen'],
  57. ipv6: map['ipv6'],
  58. enhancedMode: map['enhanced-mode'],
  59. defaultNameserver: List<String>.from(map['default-nameserver']),
  60. nameserver: List<String>.from(map['nameserver']),
  61. proxyServerNameserver: List<String>.from(map['proxy-server-nameserver']),
  62. nameserverPolicy: Map.from(map['nameserver-policy']).map((key, value) => MapEntry(key, value)),
  63. fakeIpRange: map['fake-ip-range'],
  64. fakeIpFilter: map.containsKey('fake-ip-filter') ? List<String>.from(map['fake-ip-filter']) : null,
  65. fallback: map.containsKey('fallback') ? List<String>.from(map['fallback']) : null,
  66. fallbackFilter: map.containsKey('fallback-filter') ? FallbackFilter() : null,
  67. );
  68. }
  69. Map<String, dynamic> toJson() {
  70. return {
  71. 'enable': enable,
  72. 'listen': listen,
  73. 'ipv6': ipv6,
  74. 'enhanced-mode': enhancedMode,
  75. 'default-nameserver': defaultNameserver,
  76. 'nameserver': nameserver,
  77. 'proxy-server-nameserver': proxyServerNameserver,
  78. 'nameserver-policy': nameserverPolicy.map((key, value) => MapEntry(key, value)),
  79. if (fakeIpRange != null) 'fake-ip-range': fakeIpRange,
  80. if (fakeIpFilter != null) 'fake-ip-filter': fakeIpFilter,
  81. if (fallback != null) 'fallback': fallback,
  82. if (fallbackFilter != null) 'fallback-filter': fallbackFilter,
  83. };
  84. }
  85. String toYaml() {
  86. var yaml = '''
  87. dns:
  88. enable: $enable
  89. listen: $listen
  90. ipv6: $ipv6
  91. enhanced-mode: $enhancedMode''';
  92. if (fakeIpRange != null) {
  93. yaml += '\n fake-ip-range: $fakeIpRange';
  94. }
  95. if (fakeIpFilter != null && fakeIpFilter!.isNotEmpty) {
  96. yaml += '\n fake-ip-filter:';
  97. for (var filter in fakeIpFilter!) {
  98. yaml += '\n - $filter';
  99. }
  100. }
  101. final fallback = this.fallback;
  102. if(fallback != null){
  103. yaml += '\n fallback:\n - ${fallback.map((ns) => ns).join('\n - ')}';
  104. }
  105. yaml += '\n default-nameserver:\n - ${defaultNameserver.map((ns) => ns).join('\n - ')}';
  106. yaml += '\n nameserver:\n - ${_formatYamlList(nameserver)}';
  107. yaml += '\n proxy-server-nameserver:\n - ${proxyServerNameserver.map((ns) => ns).join('\n - ')}';
  108. if (fallbackFilter != null) {
  109. yaml += '\n${fallbackFilter!.toYaml()}';
  110. }
  111. yaml += '\n nameserver-policy:\n${_mapToYaml(nameserverPolicy)}';
  112. return yaml;
  113. }
  114. String _formatYamlList(List<String> list) {
  115. return list.map((item) => item.contains('#') ? "'$item'" : item).join('\n - ');
  116. }
  117. String _mapToYaml(Map<String, dynamic> map) {
  118. var yamlString = '';
  119. map.forEach((key, value) {
  120. if (value is String) {
  121. yamlString += " '$key': '$value'\n";
  122. } else if (value is List<String>) {
  123. var formattedValues = value.map((v) => "'$v'").join(', ');
  124. yamlString += " '$key': [$formattedValues]\n";
  125. }
  126. });
  127. return yamlString;
  128. }
  129. }
  130. class FallbackFilter {
  131. final bool? geoip;
  132. final String? geoipCode;
  133. final List<String>? geosite;
  134. final List<String>? ipcidr;
  135. final List<String>? domain;
  136. FallbackFilter({
  137. this.geoip,
  138. this.geoipCode,
  139. this.geosite,
  140. this.ipcidr,
  141. this.domain,
  142. });
  143. String toYaml() {
  144. var yaml = 'fallback-filter:\n';
  145. if (geoip != null) yaml += ' geoip: $geoip\n';
  146. if (geoipCode != null) yaml += " geoip-code: '$geoipCode'\n";
  147. if (geosite != null && geosite!.isNotEmpty) {
  148. yaml += ' geosite:\n - ${geosite!.join('\n - ')}\n';
  149. }
  150. if (ipcidr != null && ipcidr!.isNotEmpty) {
  151. yaml += ' ipcidr:\n - ${ipcidr!.join('\n - ')}\n';
  152. }
  153. if (domain != null && domain!.isNotEmpty) {
  154. yaml += ' domain:\n - ${domain!.map((d) => "'$d'").join('\n - ')}\n';
  155. }
  156. return yaml;
  157. }
  158. }