diff --git a/examples/sing-box-vpn.json b/examples/sing-box-vpn.json index 0da0e9f..3d963fa 100644 --- a/examples/sing-box-vpn.json +++ b/examples/sing-box-vpn.json @@ -55,6 +55,15 @@ "ff00::/8" ], "outbound": "block" + }, + { + "process_name": [ + "nekoray_core", + "nekoray_core.exe", + "nekobox_core", + "nekobox_core.exe" + ], + "outbound": "direct" } %PROCESS_NAME_RULE% %CIDR_RULE% diff --git a/main/NekoRay_Utils.cpp b/main/NekoRay_Utils.cpp index 9d74437..05ec689 100644 --- a/main/NekoRay_Utils.cpp +++ b/main/NekoRay_Utils.cpp @@ -107,3 +107,14 @@ void runOnUiThread(const std::function &callback, QObject *parent) { void runOnNewThread(const std::function &callback) { createQThread(callback)->start(); } + +void setTimeout(const std::function &callback, QObject *obj, int timeout) { + auto t = new QTimer; + QObject::connect(t, &QTimer::timeout, obj, [=] { + callback(); + t->deleteLater(); + }); + t->setSingleShot(true); + t->setInterval(timeout); + t->start(); +} diff --git a/main/NekoRay_Utils.hpp b/main/NekoRay_Utils.hpp index 30b56d9..c81fe65 100644 --- a/main/NekoRay_Utils.hpp +++ b/main/NekoRay_Utils.hpp @@ -198,3 +198,5 @@ inline void connectOnce(EMITTER *emitter, SIGNAL signal, RECEIVER *receiver, Rec *connection = QObject::connect(emitter, signal, receiver, onTriggered, connectionType); } + +void setTimeout(const std::function &callback, QObject *obj, int timeout = 0); diff --git a/sys/ExternalProcess.cpp b/sys/ExternalProcess.cpp index c413d08..7a41ef8 100644 --- a/sys/ExternalProcess.cpp +++ b/sys/ExternalProcess.cpp @@ -90,19 +90,22 @@ namespace NekoRay::sys { if (!dataStore->core_prepare_exit && state == QProcess::NotRunning) { if (failed_to_start) return; // no retry + restart_id = NekoRay::dataStore->started_id; + dialog_message("ExternalProcess", "Crashed"); showLog("[Error] core exited, restarting.\n"); // Restart - auto t = new QTimer; - connect(t, &QTimer::timeout, this, [=] { + setTimeout([=] { Kill(); ExternalProcess::started = false; Start(); - t->deleteLater(); - }); - t->setSingleShot(true); - t->setInterval(1000); - t->start(); + }, this, 1000); + } else if (state == QProcess::Running && restart_id >= 0) { + // Restart profile + setTimeout([=] { + dialog_message("ExternalProcess", "CoreRestarted," + Int2String(restart_id)); + restart_id = -1; + }, this, 1000); } }); } diff --git a/sys/ExternalProcess.hpp b/sys/ExternalProcess.hpp index 1304cd3..ca0403c 100644 --- a/sys/ExternalProcess.hpp +++ b/sys/ExternalProcess.hpp @@ -38,6 +38,7 @@ namespace NekoRay::sys { private: bool show_stderr = false; bool failed_to_start = false; + int restart_id = -1; }; // start & kill change this list diff --git a/ui/mainwindow.cpp b/ui/mainwindow.cpp index 29d4545..37bc648 100644 --- a/ui/mainwindow.cpp +++ b/ui/mainwindow.cpp @@ -481,6 +481,8 @@ void MainWindow::dialog_message_impl(const QString &sender, const QString &info) } else if (sender == "ExternalProcess") { if (info == "Crashed") { neko_stop(); + } else if (info.startsWith("CoreRestarted")) { + neko_start(info.split(",")[1].toInt()); } } }