114 lines
3.4 KiB
Dart
114 lines
3.4 KiB
Dart
import 'dart:io';
|
|
import 'kr_log_util.dart';
|
|
|
|
/// macOS 系统代理管理工具类
|
|
///
|
|
/// 使用 `networksetup` 命令管理 macOS 的 SOCKS5 代理设置
|
|
class KRMacosProxyUtil {
|
|
/// 私有构造函数
|
|
KRMacosProxyUtil._();
|
|
|
|
/// 获取所有网络服务列表
|
|
static Future<List<String>> _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<void> 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<void> 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<String> getSocks5Status(String serviceName) async {
|
|
try {
|
|
final r = await Process.run('networksetup', ['-getsocksfirewallproxy', serviceName]);
|
|
return r.stdout as String;
|
|
} catch (e) {
|
|
return '获取状态失败: $e';
|
|
}
|
|
}
|
|
}
|