system_dns.dart 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import 'dart:io';
  2. import 'package:naiyouwl/app/utils/logger.dart';
  3. class SystemDnsPlatform {
  4. Future<void> set(List<String> dns) async {
  5. throw UnimplementedError();
  6. }
  7. Future<List<String>> get() async {
  8. throw UnimplementedError();
  9. }
  10. }
  11. class MacSystemDns extends SystemDnsPlatform {
  12. static MacSystemDns instance = MacSystemDns();
  13. Future<List<String>> getNetworks() async {
  14. final result = await Process.run('networksetup', ['-listallnetworkservices']);
  15. return result.stdout.toString().trim().split('\n').sublist(1);
  16. }
  17. @override
  18. Future<void> set(List<String> dns) async {
  19. final networks = await getNetworks();
  20. final List<String> commands = [];
  21. for (var network in networks) {
  22. if (dns.isEmpty) {
  23. commands.add('networksetup -setdnsservers "$network" "empty"');
  24. } else {
  25. commands.add('networksetup -setdnsservers "$network" "${dns.join('" "')}"');
  26. }
  27. }
  28. log.debug('MacSystemDns.set:', commands);
  29. await Process.run('bash', ['-c', commands.join(' && ')]);
  30. }
  31. @override
  32. Future<List<String>> get() async {
  33. final out = (await Process.run('scutil', ['--dns'])).stdout.toString().trim().split('\n\n').last;
  34. final res = RegExp(r'nameserver\[\d\]\s*:\s*(.+)').allMatches(out);
  35. return res.map((e) => e.group(1)).whereType<String>().toList();
  36. }
  37. }