From fd8c1e89fafa2ea7cbf078bc6e6789edd3072ce2 Mon Sep 17 00:00:00 2001 From: Captain ALM Date: Fri, 19 Mar 2021 09:13:32 +0000 Subject: [PATCH] Repair restart system. --- MelonVPNCore/ClientResponseState.cs | 6 ++- MelonVPNCore/DaemonSocketServer.cs | 61 +++++++++++++++++++++++------ MelonVPNCore/DataMessage.cs | 6 ++- MelonVPNCore/GUISocketServer.cs | 7 ++++ MelonVPNCore/Messages.cs | 8 ++++ 5 files changed, 73 insertions(+), 15 deletions(-) diff --git a/MelonVPNCore/ClientResponseState.cs b/MelonVPNCore/ClientResponseState.cs index 68298bd..85e4f58 100644 --- a/MelonVPNCore/ClientResponseState.cs +++ b/MelonVPNCore/ClientResponseState.cs @@ -8,6 +8,10 @@ ServerError, None, Blank, - Sent + Sent, + Restarting, + Starting, + RestartOn, + RestartOff } } diff --git a/MelonVPNCore/DaemonSocketServer.cs b/MelonVPNCore/DaemonSocketServer.cs index 7df78c6..698dc5c 100644 --- a/MelonVPNCore/DaemonSocketServer.cs +++ b/MelonVPNCore/DaemonSocketServer.cs @@ -11,6 +11,9 @@ namespace MelonVPNCore { private static Process currentVpnProcess = null; private static bool shouldBeRunning = false; + private static bool shouldRestart = true; + private static int startingTime = 3000; + private static int restartDelay = 250; public static void StartServer() { @@ -46,6 +49,16 @@ namespace MelonVPNCore lastClientUpdate = data; Client.SendCustomMessage(lastClientUpdate, true); } + else if (data == Messages.RestartOnMsg) + { + shouldRestart = true; + Client.SendDataMessage(DataMessage.RestartOn, true); + } + else if (data == Messages.RestartOffMsg) + { + shouldRestart = false; + Client.SendDataMessage(DataMessage.RestartOff, true); + } else if (data == Messages.StatusMsg) { Console.WriteLine("Status requested"); @@ -61,6 +74,7 @@ namespace MelonVPNCore Client.SendDataMessage(DataMessage.Offline, true); Client.SendCustomMessage(Messages.ClientListEmptyMsg, true); } + Client.SendDataMessage((shouldRestart) ? DataMessage.RestartOn : DataMessage.RestartOff); } else if (data == Messages.StartMsg) { @@ -71,17 +85,20 @@ namespace MelonVPNCore try { Console.WriteLine("Starting embedded process"); - StartEProcess(true); - Console.WriteLine("Sending online reply"); - Thread.Sleep(1500); - Client.SendDataMessage(DataMessage.Online, true); - currentVpnProcess.EnableRaisingEvents = true; + Console.WriteLine("Sending starting reply"); + Client.SendDataMessage(DataMessage.Starting, true); + if (StartEProcess(true)) + { + Console.WriteLine("Sending online reply"); + Client.SendDataMessage(DataMessage.Online, true); + } } catch (Exception e) { shouldBeRunning = false; Console.WriteLine("There was an error. But I fixed it."); Console.WriteLine("It looked like this: " + e); + currentVpnProcess.Dispose(); currentVpnProcess = null; Client.SendDataMessage(DataMessage.Error, true); Client.SendCustomMessage(Messages.ClientListEmptyMsg, true); @@ -161,13 +178,29 @@ namespace MelonVPNCore static void CurrentVpnProcess_Exited(object sender, EventArgs e) { + Client.SendDataMessage(DataMessage.Restarting, true); Console.WriteLine("Restarting embedded process"); + currentVpnProcess.Dispose(); currentVpnProcess = null; - Thread.Sleep(1500); - StartEProcess(false); + Thread.Sleep(restartDelay); + if (shouldRestart) + { + Console.WriteLine("Sending restarting reply"); + Client.SendDataMessage(DataMessage.Restarting, true); + if (StartEProcess(false)) + { + Console.WriteLine("Sending online reply"); + Client.SendDataMessage(DataMessage.Online, true); + } + } + else + { + Client.SendDataMessage(DataMessage.Offline, true); + Client.SendCustomMessage(Messages.ClientListEmptyMsg, true); + } } - static void StartEProcess(bool reraisee) + static bool StartEProcess(bool reraisee) { if (shouldBeRunning) { @@ -175,21 +208,23 @@ namespace MelonVPNCore { currentVpnProcess = new Process { - StartInfo = new ProcessStartInfo("simple-vpn", "client /etc/melon-vpn/client.cfg") + StartInfo = new ProcessStartInfo("simple-vpn", "client /etc/melon-vpn/client.cfg"), + EnableRaisingEvents = true }; - currentVpnProcess.Start(); - currentVpnProcess.EnableRaisingEvents = false; currentVpnProcess.Exited += CurrentVpnProcess_Exited; - Thread.Sleep(1500); - currentVpnProcess.EnableRaisingEvents = true; + currentVpnProcess.Start(); + Thread.Sleep(startingTime); + return !currentVpnProcess.HasExited; } catch (Exception e) { + //Not really fixed is it? Console.WriteLine("There was an error. But I fixed it."); Console.WriteLine("It looked like this: " + e); if (reraisee) { throw e; } } } + return false; } } } diff --git a/MelonVPNCore/DataMessage.cs b/MelonVPNCore/DataMessage.cs index 8637678..02cb1b5 100644 --- a/MelonVPNCore/DataMessage.cs +++ b/MelonVPNCore/DataMessage.cs @@ -8,6 +8,10 @@ Start, Stop, Blank, - Error + Error, + Starting, + Restarting, + RestartOn, + RestartOff } } diff --git a/MelonVPNCore/GUISocketServer.cs b/MelonVPNCore/GUISocketServer.cs index 6621902..6d4817d 100644 --- a/MelonVPNCore/GUISocketServer.cs +++ b/MelonVPNCore/GUISocketServer.cs @@ -9,6 +9,7 @@ namespace MelonVPNCore { public static event EventHandler Receive; public static event EventHandler ClientListUpdate; + public static event EventHandler RestartModeSync; public static void StartServer() { @@ -41,6 +42,11 @@ namespace MelonVPNCore if (data == Messages.OnlineMsg) ret = ClientResponseState.Online; if (data == Messages.OfflineMsg) ret = ClientResponseState.Offline; if (data == Messages.ErrorMsg) ret = ClientResponseState.ServerError; + if (data == Messages.StartingMsg) ret = ClientResponseState.Starting; + if (data == Messages.RestartingMsg) ret = ClientResponseState.Restarting; + bool rsm = false; + if (data == Messages.RestartOnMsg) rsm = true; + if (data == Messages.RestartOffMsg) rsm = false; Console.WriteLine(data); if (data.StartsWith(Messages.ClientListStartMsg, StringComparison.CurrentCulture)) { @@ -55,6 +61,7 @@ namespace MelonVPNCore handler.Close(); Receive?.Invoke(null, ret); + RestartModeSync?.Invoke(null, rsm); } } catch (Exception e) diff --git a/MelonVPNCore/Messages.cs b/MelonVPNCore/Messages.cs index 57896cf..d5fa80f 100644 --- a/MelonVPNCore/Messages.cs +++ b/MelonVPNCore/Messages.cs @@ -12,6 +12,10 @@ public static string ErrorMsg = "ERROR::" + Code + EOF; public static string ClientListStartMsg = "CLIENTLIST::" + Code + "::"; public static string ClientListEmptyMsg = ClientListStartMsg + "[]" + EOF; + public static string StartingMsg = "STARTING::" + Code + EOF; + public static string RestartingMsg = "RESTARTING::" + Code + EOF; + public static string RestartOnMsg = "RESTART::ON::" + Code + EOF; + public static string RestartOffMsg = "RESTART::OFF::" + Code + EOF; public static string GetMessage(DataMessage a) { @@ -21,6 +25,10 @@ if (a == DataMessage.Start) return StartMsg; if (a == DataMessage.Stop) return StopMsg; if (a == DataMessage.Error) return ErrorMsg; + if (a == DataMessage.Starting) return StartingMsg; + if (a == DataMessage.Restarting) return RestartingMsg; + if (a == DataMessage.RestartOn) return RestartOnMsg; + if (a == DataMessage.RestartOff) return RestartOffMsg; if (a == DataMessage.Blank) return EOF; return EOF; }