From 6a9d37ad9eee45b726abd0ea9337ecaf29e0c155 Mon Sep 17 00:00:00 2001 From: Kenneth Skovhede Date: Tue, 27 Aug 2024 11:33:52 +0200 Subject: [PATCH] Fixed responding to stop signals. This fixes #5478 --- Duplicati/Server/Program.cs | 26 +++++++++++++------ Duplicati/WebserverCore/DuplicatiWebserver.cs | 4 ++- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/Duplicati/Server/Program.cs b/Duplicati/Server/Program.cs index 4ac166fc8..7fb844c43 100644 --- a/Duplicati/Server/Program.cs +++ b/Duplicati/Server/Program.cs @@ -246,6 +246,7 @@ namespace Duplicati.Server ConfigureLogging(commandlineOptions); var crashed = false; + var terminated = false; try { DataConnection = GetDatabaseConnection(commandlineOptions); @@ -269,13 +270,6 @@ namespace Duplicati.Server DuplicatiWebserver = StartWebServer(commandlineOptions, DataConnection).ConfigureAwait(false).GetAwaiter().GetResult(); - if (FIXMEGlobal.Origin == "Server" && DataConnection.ApplicationSettings.AutogeneratedPassphrase) - { - var signinToken = DuplicatiWebserver.Provider.GetRequiredService().CreateSigninToken("server-cli"); - Console.WriteLine($"Server is now running on port {DuplicatiWebserver.Port}"); - Console.WriteLine($"Initial signin url: http://localhost:{DuplicatiWebserver.Port}/signin.html?token={signinToken}"); - } - UpdatePoller.Init(); SetPurgeTempFilesTimer(commandlineOptions); @@ -293,7 +287,23 @@ namespace Duplicati.Server DataConnection.ReWriteAllFieldsIfEncryptionChanged(); + DuplicatiWebserver.TerminationTask.ContinueWith((t) => + { + if (t.Exception != null) + System.Diagnostics.Trace.WriteLine("Webserver terminated with exception: " + t.Exception); + + terminated = true; + ApplicationExitEvent.Set(); + }); ServerStartedEvent.Set(); + + Console.WriteLine($"Server is now running on port {DuplicatiWebserver.Port}"); + if (FIXMEGlobal.Origin == "Server" && DataConnection.ApplicationSettings.AutogeneratedPassphrase) + { + var signinToken = DuplicatiWebserver.Provider.GetRequiredService().CreateSigninToken("server-cli"); + Console.WriteLine($"Initial signin url: http://localhost:{DuplicatiWebserver.Port}/signin.html?token={signinToken}"); + } + ApplicationExitEvent.WaitOne(); } catch (SingleInstance.MultipleInstanceException mex) @@ -342,7 +352,7 @@ namespace Duplicati.Server { // If the server is already crashed, that is the main error // If the server crashes during teardown, we log that as an error - if (!crashed) + if (!(crashed || terminated)) { System.Diagnostics.Trace.WriteLine(Strings.Program.TearDownError(ex.ToString())); if (writeToConsole) diff --git a/Duplicati/WebserverCore/DuplicatiWebserver.cs b/Duplicati/WebserverCore/DuplicatiWebserver.cs index db48dbe99..df40453bd 100644 --- a/Duplicati/WebserverCore/DuplicatiWebserver.cs +++ b/Duplicati/WebserverCore/DuplicatiWebserver.cs @@ -24,6 +24,8 @@ public partial class DuplicatiWebserver public int Port { get; private set; } + public Task TerminationTask { get; private set; } = Task.CompletedTask; + /// /// The settings used for stating the server /// @@ -200,7 +202,7 @@ public partial class DuplicatiWebserver App.AddEndpoints() .UseNotifications("/notifications"); - return App.RunAsync(); + return TerminationTask = App.RunAsync(); } public async Task Stop()