import 'dart:io'; import 'kr_log_util.dart'; /// macOS 系统代理管理工具类 /// /// 使用 `networksetup` 命令管理 macOS 的 SOCKS5 代理设置 class KRMacosProxyUtil { /// 私有构造函数 KRMacosProxyUtil._(); /// 获取所有网络服务列表 static Future> _listNetworkServices() async { try { final r = await Process.run('networksetup', ['-listallnetworkservices']); if (r.exitCode != 0) { KRLogUtil.kr_e('列出网络服务失败: ${r.stderr}', tag: 'MacosProxy'); return []; } final lines = (r.stdout as String).split('\n').map((e) => e.trim()).toList(); // 过滤掉第一行说明文字和空行 return lines .where((l) => l.isNotEmpty && !l.toLowerCase().contains('an asterisk')) .skip(1) .toList(); } catch (e) { KRLogUtil.kr_e('列出网络服务异常: $e', tag: 'MacosProxy'); return []; } } /// 为所有网络服务启用 SOCKS5 代理 static Future enableSocks5({ required String host, required int port, }) async { if (!Platform.isMacOS) return; final services = await _listNetworkServices(); if (services.isEmpty) { KRLogUtil.kr_w('未找到可用的网络服务', tag: 'MacosProxy'); return; } for (final service in services) { try { // 1) 设置 SOCKS5 服务器地址和端口 final r1 = await Process.run('networksetup', [ '-setsocksfirewallproxy', service, host, port.toString(), ]); if (r1.exitCode != 0) { KRLogUtil.kr_w('服务 [$service] 设置 SOCKS5 代理失败: ${r1.stderr}', tag: 'MacosProxy'); continue; } // 2) 开启 SOCKS5 代理状态 final r2 = await Process.run('networksetup', [ '-setsocksfirewallproxystate', service, 'on', ]); if (r2.exitCode != 0) { KRLogUtil.kr_w('服务 [$service] 启用 SOCKS5 代理失败: ${r2.stderr}', tag: 'MacosProxy'); continue; } KRLogUtil.kr_i('✅ 服务 [$service] SOCKS5 代理已启用: $host:$port', tag: 'MacosProxy'); } catch (e) { KRLogUtil.kr_e('服务 [$service] 启用代理异常: $e', tag: 'MacosProxy'); } } } /// 为所有网络服务禁用 SOCKS5 代理 static Future disableSocks5() async { if (!Platform.isMacOS) return; final services = await _listNetworkServices(); if (services.isEmpty) return; for (final service in services) { try { final r = await Process.run('networksetup', [ '-setsocksfirewallproxystate', service, 'off', ]); if (r.exitCode == 0) { KRLogUtil.kr_i('✅ 服务 [$service] SOCKS5 代理已关闭', tag: 'MacosProxy'); } else { KRLogUtil.kr_w('服务 [$service] 关闭 SOCKS5 代理失败: ${r.stderr}', tag: 'MacosProxy'); } } catch (e) { KRLogUtil.kr_e('服务 [$service] 关闭代理异常: $e', tag: 'MacosProxy'); } } } /// 获取指定服务的 SOCKS5 状态 (主要用于调试) static Future getSocks5Status(String serviceName) async { try { final r = await Process.run('networksetup', ['-getsocksfirewallproxy', serviceName]); return r.stdout as String; } catch (e) { return '获取状态失败: $e'; } } }