From ec34606aed4a59b5f4b551475f695353d94de082 Mon Sep 17 00:00:00 2001 From: "kenneth@hexad.dk" Date: Wed, 27 Feb 2013 14:23:17 +0000 Subject: [PATCH] Updated robustness of server startup as hosted instance git-svn-id: https://duplicati.googlecode.com/svn/trunk@1532 59da171f-624f-0410-aa54-27559c288bec --- .../HostedInstanceKeeper.cs | 4 + Duplicati/Server/Program.cs | 98 ++++++++++++++----- 2 files changed, 75 insertions(+), 27 deletions(-) diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/HostedInstanceKeeper.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/HostedInstanceKeeper.cs index 0ce8c3b32..869b7e4c7 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/HostedInstanceKeeper.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/HostedInstanceKeeper.cs @@ -25,6 +25,9 @@ namespace Duplicati.GUI.TrayIcon else throw new Exception("Hosted server startup timed out"); } + + if (m_runnerException != null) + throw m_runnerException; } private void ThreadRunner(object a) @@ -34,6 +37,7 @@ namespace Duplicati.GUI.TrayIcon Duplicati.Server.Program.Main((string[])a); } catch (Exception ex) { m_runnerException = ex; + Duplicati.Server.Program.ServerStartedEvent.Set(); } } diff --git a/Duplicati/Server/Program.cs b/Duplicati/Server/Program.cs index b29a30c4b..2e85d10a8 100644 --- a/Duplicati/Server/Program.cs +++ b/Duplicati/Server/Program.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -127,6 +127,9 @@ namespace Duplicati.Server ); } + //If this executable is invoked directly, write to console, otherwise throw exceptions + bool writeConsole = System.Reflection.Assembly.GetEntryAssembly() == System.Reflection.Assembly.GetExecutingAssembly(); + //If we are on windows we encrypt the database by default //We do not encrypt on Linux as most distros use a SQLite library without encryption support, //Linux users can use an encrypted home folder, or install a SQLite library with encryption support @@ -165,12 +168,20 @@ namespace Duplicati.Server //If the commandline issues --help, just stop here if (commandlineOptions.ContainsKey("help")) { - Console.WriteLine(Strings.Program.HelpDisplayDialog); + if (writeConsole) + { + Console.WriteLine(Strings.Program.HelpDisplayDialog); - foreach (Library.Interface.ICommandLineArgument arg in SupportedCommands) - Console.WriteLine(Strings.Program.HelpDisplayFormat, arg.Name, arg.LongDescription); + foreach (Library.Interface.ICommandLineArgument arg in SupportedCommands) + Console.WriteLine(Strings.Program.HelpDisplayFormat, arg.Name, arg.LongDescription); + + return; + } + else + { + throw new Exception("Server invoked with --help"); + } - return; } #if DEBUG @@ -227,22 +238,43 @@ namespace Duplicati.Server } catch (Exception ex) { - Console.WriteLine(Strings.Program.StartupFailure, ex.ToString()); - return; + if (writeConsole) + { + Console.WriteLine(Strings.Program.StartupFailure, ex.ToString()); + return; + } + else + { + throw new Exception(Strings.Program.StartupFailure, ex); + } } if (!instance.IsFirstInstance) { - Console.WriteLine(Strings.Program.AnotherInstanceDetected); - return; + if (writeConsole) + { + Console.WriteLine(Strings.Program.AnotherInstanceDetected); + return; + } + else + { + throw new Exception(Strings.Program.AnotherInstanceDetected); + } } Version sqliteVersion = new Version((string)SQLiteLoader.SQLiteConnectionType.GetProperty("SQLiteVersion").GetValue(null, null)); if (sqliteVersion < new Version(3, 6, 3)) { - //The official Mono SQLite provider is also broken with less than 3.6.3 - Console.WriteLine(Strings.Program.WrongSQLiteVersion, sqliteVersion, "3.6.3"); - return; + if (writeConsole) + { + //The official Mono SQLite provider is also broken with less than 3.6.3 + Console.WriteLine(Strings.Program.WrongSQLiteVersion, sqliteVersion, "3.6.3"); + return; + } + else + { + throw new Exception(string.Format(Strings.Program.WrongSQLiteVersion, sqliteVersion, "3.6.3")); + } } //Create the connection instance @@ -273,8 +305,15 @@ namespace Duplicati.Server if (ex is System.Reflection.TargetInvocationException && ex.InnerException != null) ex = ex.InnerException; - Console.WriteLine(Strings.Program.DatabaseOpenError, ex.Message); - return; + if (writeConsole) + { + Console.WriteLine(Strings.Program.DatabaseOpenError, ex.Message); + return; + } + else + { + throw new Exception(string.Format(Strings.Program.DatabaseOpenError, ex.Message), ex); + } } DataConnection = new DataFetcherWithRelations(new SQLiteDataProvider(con)); @@ -310,24 +349,29 @@ namespace Duplicati.Server catch (Exception ex) { System.Diagnostics.Trace.WriteLine(string.Format(Strings.Program.SeriousError, ex.ToString())); - Console.WriteLine(Strings.Program.SeriousError, ex.ToString()); + if (writeConsole) + Console.WriteLine(Strings.Program.SeriousError, ex.ToString()); + else + throw new Exception(string.Format(Strings.Program.SeriousError, ex.ToString()), ex); } + finally + { + StatusEventNotifyer.SignalNewEvent(); + ProgressEventNotifyer.SignalNewEvent(); - StatusEventNotifyer.SignalNewEvent(); - ProgressEventNotifyer.SignalNewEvent(); - - if (Scheduler != null) - Scheduler.Terminate(true); - if (WorkThread != null) - WorkThread.Terminate(true); - if (instance != null) - instance.Dispose(); + if (Scheduler != null) + Scheduler.Terminate(true); + if (WorkThread != null) + WorkThread.Terminate(true); + if (instance != null) + instance.Dispose(); #if DEBUG - //Flush the file - using (Duplicati.Library.Logging.Log.CurrentLog as Duplicati.Library.Logging.StreamLog) - Duplicati.Library.Logging.Log.CurrentLog = null; + //Flush the file + using (Duplicati.Library.Logging.Log.CurrentLog as Duplicati.Library.Logging.StreamLog) + Duplicati.Library.Logging.Log.CurrentLog = null; #endif + } } private static void Runner_ProgressEvent(Serialization.DuplicatiOperation operation, Serialization.RunnerState state, string message, string submessage, int progress, int subprogress)