alroyso 1 year ago
parent
commit
78ad615af2

+ 4 - 2
lib/app/const/const.dart

@@ -11,7 +11,7 @@ class ClashName {
   }
 
   static String get arch {
-    return const String.fromEnvironment('OS_ARCH', defaultValue: 'amd64'); //amd64
+    return const String.fromEnvironment('OS_ARCH', defaultValue: 'arm64'); //amd64
   }
 
   static String get ext {
@@ -53,7 +53,9 @@ class Files {
   static File get assetsClashService {
     return File(path.join(Paths.assetsBin.path, 'ccore-service-${ClashName.platform}-${ClashName.arch}${ClashName.ext}'));
   }
-
+  static File get assetsCCore {
+    return File(path.join(Paths.assetsBin.path, 'ccore-${ClashName.platform}-${ClashName.arch}${ClashName.ext}'));
+  }
   static File get assetsCountryMmdb {
     return File(path.join(Paths.assetsDep.path, 'Country.mmdb'));
   }

+ 5 - 5
lib/app/controller/GlobalController.dart

@@ -63,10 +63,10 @@ class GlobalController extends GetxController {
     await controllers.config.initConfig();
     await controllers.service.initConfig();
 
-    //await  controllers.service.isService();
+     await  controllers.service.isService();
     // init service
-    await controllers.service.startService();
-    if (controllers.service.serviceStatus.value != RunningState.running) return;
+    // await controllers.service.startService();
+    // if (controllers.service.serviceStatus.value != RunningState.running) return;
     // await controllers.service.serviceModeSwitch(true);
     // init clash core
 
@@ -216,9 +216,9 @@ class GlobalController extends GetxController {
     //wait controllers.config.setSystemProxy(open);
     if(open)
     {
-      openProxy();
+     await openProxy();
     } else {
-      closeProxy();
+     await  closeProxy();
     }
     systemProxySwitchIng.value = false;
   }

+ 45 - 29
lib/app/controller/service.dart

@@ -2,6 +2,7 @@ import 'dart:io';
 import 'dart:async';
 import 'dart:convert';
 
+
 import 'package:dio/dio.dart';
 import 'package:get/get.dart';
 import 'package:naiyouwl/app/bean/ClashServiceInfo.dart';
@@ -82,6 +83,7 @@ class ServiceController extends GetxController {
     try {
       final data = await fetchInfo();
       if(data.mode == 'service-mode'){
+        serviceMode.value = true;
         controllers.global.updateMsg("服务模式");
         await serviceModeSwitch(false);
       }
@@ -247,7 +249,18 @@ class ServiceController extends GetxController {
           controllers.global.updateMsg("启动内核");
         }
         coreStatus.value = RunningState.starting;
-        await fetchStart(controllers.config.config.value.selected);
+        // final res = await _dio.post<String>('/start', data: {
+        //   "args": ['-d', Paths.config.path, '-f', path.join(Paths.config.path, name)]
+        // });
+        final res = await runCCore(Files.assetsCCore.path, ['-d', Paths.config.path, '-f', path.join(Paths.config.path, controllers.config.config.value.selected)]);
+        if (res.exitCode != 0) {
+          controllers.global.updateMsg("启动内核失败");
+          coreStatus.value = RunningState.error;
+          throw res.stderr;
+
+        }
+        coreStatus.value = RunningState.running;
+        //await fetchStart(controllers.config.config.value.selected);
         log.debug("api${controllers.config.clashCoreApiAddress.value}");
         controllers.core.setApi(controllers.config.clashCoreApiAddress.value, controllers.config.clashCoreApiSecret.value);
         while (true) {
@@ -268,13 +281,13 @@ class ServiceController extends GetxController {
           }
         }
         await controllers.core.updateConfig();
-        if (Platform.isMacOS &&
-            controllers.service.serviceMode.value &&
-            controllers.config.clashCoreTunEnable.value &&
-            controllers.config.clashCoreDns.isNotEmpty) {
-          await MacSystemDns.instance.set([controllers.config.clashCoreDns.value]);
-        }
-        if (controllers.config.config.value.setSystemProxy) await SystemProxy.instance.set(controllers.core.proxyConfig);
+        // if (Platform.isMacOS &&
+        //     controllers.service.serviceMode.value &&
+        //     controllers.config.clashCoreTunEnable.value &&
+        //     controllers.config.clashCoreDns.isNotEmpty) {
+        //   await MacSystemDns.instance.set([controllers.config.clashCoreDns.value]);
+        // }
+        // if (controllers.config.config.value.setSystemProxy) await SystemProxy.instance.set(controllers.core.proxyConfig);
         coreStatus.value = RunningState.running;
         controllers.global.updateMsg("内核状态:${coreStatus.value == RunningState.running} ");
         controllers.global.updateDate();
@@ -289,14 +302,15 @@ class ServiceController extends GetxController {
 
     Future<void> stopClashCore() async {
       coreStatus.value = RunningState.stopping;
-      if (Platform.isMacOS &&
-          controllers.service.serviceMode.value &&
-          controllers.config.clashCoreTunEnable.value &&
-          controllers.config.clashCoreDns.isNotEmpty) {
-        await MacSystemDns.instance.set([]);
-      }
-      if (controllers.config.config.value.setSystemProxy) await SystemProxy.instance.set(SystemProxyConfig());
-      await fetchStop();
+      // if (Platform.isMacOS &&
+      //     controllers.service.serviceMode.value &&
+      //     controllers.config.clashCoreTunEnable.value &&
+      //     controllers.config.clashCoreDns.isNotEmpty) {
+      //   await MacSystemDns.instance.set([]);
+      // }
+      //if (controllers.config.config.value.setSystemProxy) await SystemProxy.instance.set(SystemProxyConfig());
+      await stopClash();
+      //await fetchStop();
       coreStatus.value = RunningState.stoped;
     }
     Future<void> initClashCoreConfig() async {
@@ -304,9 +318,11 @@ class ServiceController extends GetxController {
        //await stopClashCore();
        await startClashCore();
        if (coreStatus.value == RunningState.error) {
+         controllers.global.updateMsg("启动内核失败...");
          //BotToast.showText(text: '重启失败');
        } else {
          await controllers.core.updateVersion();
+         controllers.global.updateMsg("启动内核成功...");
          //BotToast.showText(text: '重启成功');
        }
     }
@@ -319,20 +335,20 @@ class ServiceController extends GetxController {
   }
     Future<void> reloadClashCore() async {
       controllers.config.config.value.selected = 'proxy.yaml';
-      // if( coreStatus.value == RunningState.running){
-      //   await controllers.core.fetchReloadConfig({"path":  path.join(Paths.config.path, controllers.config.config.value.selected),"payload":""});
-      // }
-      //BotToast.showText(text: '正在重启 Core ……');
-      controllers.global.updateMsg("停止内核...");
-      await stopClashCore();
-      await controllers.config.readClashCoreApi();
-      await startClashCore();
-      if (coreStatus.value == RunningState.error) {
-        controllers.global.updateMsg("启动内核失败...");
-      } else {
-        await controllers.core.updateVersion();
-        controllers.global.updateMsg("启动内核成功...");
+      if( coreStatus.value == RunningState.running){
+        await controllers.core.fetchReloadConfig({"path":  path.join(Paths.config.path, controllers.config.config.value.selected),"payload":""});
       }
+      //BotToast.showText(text: '正在重启 Core ……');
+      // controllers.global.updateMsg("停止内核...");
+      // await stopClashCore();
+      // await controllers.config.readClashCoreApi();
+      // await startClashCore();
+      // if (coreStatus.value == RunningState.error) {
+      //   controllers.global.updateMsg("启动内核失败...");
+      // } else {
+      //   await controllers.core.updateVersion();
+      //   controllers.global.updateMsg("启动内核成功...");
+      // }
     }
 
   Future<int> getFreePort() async {

+ 32 - 0
lib/app/utils/shell.dart

@@ -35,6 +35,38 @@ Future<bool> isRunningAsAdmin() async {
   return false;
 }
 
+Future<ProcessResult> runCCore(String executable, List<String> arguments) async {
+  String executablePath = shellArgument(executable).replaceAll(' ', r'\\ ');
+  //executablePath = executablePath.substring(1, executablePath.length - 1);
+  if (Platform.isMacOS) {
+    return await Process.run(
+      'osascript',
+      [
+        '-e',
+        shellArguments(['do', 'shell', 'script', '$executablePath ${shellArguments(arguments)}', 'with', 'administrator', 'privileges']),
+      ],
+    );
+  } else if (Platform.isWindows) {
+    return await Process.run(
+      path.join(Paths.assetsBin.path, executablePath),
+      [executable, ...arguments],
+    );
+  } else {
+    // https://blog.csdn.net/weixin_49867936/article/details/109612918
+    // https://askubuntu.com/questions/287845/how-to-configure-pkexec
+    return await Process.run("pkexec", [executable, ...arguments]);
+  }
+
+}
+
+
+Future<ProcessResult> runCCoreAsAdmin(String executable, List<String> arguments) async {
+  String executablePath = shellArgument(executable).replaceAll(' ', r'\\ ');
+  return await Process.run(
+    path.join(Paths.assetsBin.path, "run-as-admin.bat"),
+    [executable, ...arguments],
+  );
+}
 Future<ProcessResult> runAsAdmin(String executable, List<String> arguments) async {
   String executablePath = shellArgument(executable).replaceAll(' ', r'\\ ');
   //executablePath = executablePath.substring(1, executablePath.length - 1);