Close Proxy and exit when Guardian die
This commit is contained in:
parent
5a6ad386fc
commit
79be93f425
1 changed files with 33 additions and 7 deletions
40
Program.cs
40
Program.cs
|
@ -12,30 +12,54 @@ namespace FireflySR.Tool.Proxy
|
||||||
private const string GuardianPath = "FireflySR.Tool.Proxy.Guardian.exe";
|
private const string GuardianPath = "FireflySR.Tool.Proxy.Guardian.exe";
|
||||||
|
|
||||||
private static ProxyService s_proxyService = null!;
|
private static ProxyService s_proxyService = null!;
|
||||||
|
private static bool s_clearupd = false;
|
||||||
|
|
||||||
private static void Main(string[] args)
|
private static void Main(string[] args)
|
||||||
{
|
{
|
||||||
Console.Title = Title;
|
Console.Title = Title;
|
||||||
Console.WriteLine($"Firefly.Tool.Proxy - Credits for original FreeSR Proxy");
|
Console.WriteLine($"Firefly.Tool.Proxy - Credits for original FreeSR Proxy");
|
||||||
StartGuardian();
|
_ = Task.Run(WatchGuardianAsync);
|
||||||
CheckProxy();
|
CheckProxy();
|
||||||
InitConfig();
|
InitConfig();
|
||||||
|
|
||||||
var conf = JsonSerializer.Deserialize(File.ReadAllText(ConfigPath), ProxyConfigContext.Default.ProxyConfig) ?? throw new FileLoadException("Please correctly configure config.json.");
|
var conf = JsonSerializer.Deserialize(File.ReadAllText(ConfigPath), ProxyConfigContext.Default.ProxyConfig) ?? throw new FileLoadException("Please correctly configure config.json.");
|
||||||
s_proxyService = new ProxyService(conf.DestinationHost, conf.DestinationPort, conf);
|
s_proxyService = new ProxyService(conf.DestinationHost, conf.DestinationPort, conf);
|
||||||
|
Console.WriteLine($"Proxy now running");
|
||||||
AppDomain.CurrentDomain.ProcessExit += OnProcessExit;
|
AppDomain.CurrentDomain.ProcessExit += OnProcessExit;
|
||||||
Console.CancelKeyPress += OnProcessExit;
|
Console.CancelKeyPress += OnProcessExit;
|
||||||
|
|
||||||
Thread.Sleep(-1);
|
Thread.Sleep(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void StartGuardian()
|
private static async Task WatchGuardianAsync()
|
||||||
{
|
{
|
||||||
if (!OperatingSystem.IsWindows()) return;
|
var proc = StartGuardian();
|
||||||
|
if (proc == null)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Guardian start failed. Your proxy settings may not be able to recover after closing.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notice that on some PTY, closing it may lead
|
||||||
|
// to Guardian be killed, not the Proxy itself.
|
||||||
|
// Therefore, Proxy should also watch Guardian
|
||||||
|
// and exit when Guardian dies.
|
||||||
|
while (!proc.HasExited)
|
||||||
|
{
|
||||||
|
await Task.Delay(1000);
|
||||||
|
}
|
||||||
|
Console.WriteLine("! Guardian exit");
|
||||||
|
OnProcessExit(null, null);
|
||||||
|
Environment.Exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Process? StartGuardian()
|
||||||
|
{
|
||||||
|
if (!OperatingSystem.IsWindows()) return null;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var proc = Process.Start(new ProcessStartInfo(GuardianPath, $"{Environment.ProcessId}")
|
return Process.Start(new ProcessStartInfo(GuardianPath, $"{Environment.ProcessId}")
|
||||||
{
|
{
|
||||||
UseShellExecute = false,
|
UseShellExecute = false,
|
||||||
});
|
});
|
||||||
|
@ -44,7 +68,7 @@ namespace FireflySR.Tool.Proxy
|
||||||
{
|
{
|
||||||
Console.WriteLine(ex);
|
Console.WriteLine(ex);
|
||||||
Console.WriteLine();
|
Console.WriteLine();
|
||||||
Console.WriteLine("Guardian start failed. Your proxy settings may not be able to recover after closing.");
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,9 +80,11 @@ namespace FireflySR.Tool.Proxy
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OnProcessExit(object? sender, EventArgs args)
|
private static void OnProcessExit(object? sender, EventArgs? args)
|
||||||
{
|
{
|
||||||
s_proxyService.Shutdown();
|
if (s_clearupd) return;
|
||||||
|
s_proxyService?.Shutdown();
|
||||||
|
s_clearupd = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void CheckProxy()
|
public static void CheckProxy()
|
||||||
|
|
Loading…
Reference in a new issue