aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Mono
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Mono')
-rw-r--r--MediaBrowser.Server.Mono/Native/BaseMonoApp.cs6
-rw-r--r--MediaBrowser.Server.Mono/Native/NativeApp.cs20
-rw-r--r--MediaBrowser.Server.Mono/Program.cs249
3 files changed, 165 insertions, 110 deletions
diff --git a/MediaBrowser.Server.Mono/Native/BaseMonoApp.cs b/MediaBrowser.Server.Mono/Native/BaseMonoApp.cs
index aea6d7367..ba96ca737 100644
--- a/MediaBrowser.Server.Mono/Native/BaseMonoApp.cs
+++ b/MediaBrowser.Server.Mono/Native/BaseMonoApp.cs
@@ -21,16 +21,16 @@ namespace MediaBrowser.Server.Mono.Native
/// <summary>
/// Restarts this instance.
/// </summary>
- public void Restart()
+ public virtual void Restart()
{
-
+ throw new NotImplementedException();
}
/// <summary>
/// Determines whether this instance [can self restart].
/// </summary>
/// <returns><c>true</c> if this instance [can self restart]; otherwise, <c>false</c>.</returns>
- public bool CanSelfRestart
+ public virtual bool CanSelfRestart
{
get
{
diff --git a/MediaBrowser.Server.Mono/Native/NativeApp.cs b/MediaBrowser.Server.Mono/Native/NativeApp.cs
index d92b86157..8c954ffcc 100644
--- a/MediaBrowser.Server.Mono/Native/NativeApp.cs
+++ b/MediaBrowser.Server.Mono/Native/NativeApp.cs
@@ -13,5 +13,25 @@ namespace MediaBrowser.Server.Mono.Native
{
MainClass.Shutdown();
}
+
+ /// <summary>
+ /// Determines whether this instance [can self restart].
+ /// </summary>
+ /// <value><c>true</c> if this instance can self restart; otherwise, <c>false</c>.</value>
+ public override bool CanSelfRestart
+ {
+ get
+ {
+ return true;
+ }
+ }
+
+ /// <summary>
+ /// Restarts this instance.
+ /// </summary>
+ public override void Restart()
+ {
+ MainClass.Restart();
+ }
}
}
diff --git a/MediaBrowser.Server.Mono/Program.cs b/MediaBrowser.Server.Mono/Program.cs
index 10a6c6fb9..a9d510426 100644
--- a/MediaBrowser.Server.Mono/Program.cs
+++ b/MediaBrowser.Server.Mono/Program.cs
@@ -1,4 +1,3 @@
-using System.IO;
using MediaBrowser.Common.Implementations.IO;
using MediaBrowser.Common.Implementations.Logging;
using MediaBrowser.Model.Logging;
@@ -8,6 +7,8 @@ using MediaBrowser.Server.Startup.Common;
using Microsoft.Win32;
using System;
using System.Diagnostics;
+using System.IO;
+using System.Linq;
using System.Net;
using System.Net.Security;
using System.Reflection;
@@ -16,133 +17,167 @@ using System.Threading.Tasks;
namespace MediaBrowser.Server.Mono
{
- public class MainClass
- {
- private static ApplicationHost _appHost;
+ public class MainClass
+ {
+ private static ApplicationHost _appHost;
- private static ILogger _logger;
+ private static ILogger _logger;
- public static void Main (string[] args)
- {
+ public static void Main(string[] args)
+ {
var applicationPath = Assembly.GetEntryAssembly().Location;
-
- var options = new StartupOptions();
- // Allow this to be specified on the command line.
- var customProgramDataPath = options.GetOption("-programdata");
+ var options = new StartupOptions();
- var appPaths = CreateApplicationPaths(applicationPath, customProgramDataPath);
+ // Allow this to be specified on the command line.
+ var customProgramDataPath = options.GetOption("-programdata");
- var logManager = new NlogManager(appPaths.LogDirectoryPath, "server");
- logManager.ReloadLogger(LogSeverity.Info);
- logManager.AddConsoleOutput();
+ var appPaths = CreateApplicationPaths(applicationPath, customProgramDataPath);
- var logger = _logger = logManager.GetLogger("Main");
+ var logManager = new NlogManager(appPaths.LogDirectoryPath, "server");
+ logManager.ReloadLogger(LogSeverity.Info);
+ logManager.AddConsoleOutput();
+
+ var logger = _logger = logManager.GetLogger("Main");
ApplicationHost.LogEnvironmentInfo(logger, appPaths, true);
- AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
+ AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
+
+ try
+ {
+ RunApplication(appPaths, logManager, options);
+ }
+ finally
+ {
+ logger.Info("Shutting down");
- try
- {
- RunApplication(appPaths, logManager, options);
- }
- finally
- {
- logger.Info("Shutting down");
+ _appHost.Dispose();
+ }
+ }
- _appHost.Dispose();
- }
- }
+ private static ServerApplicationPaths CreateApplicationPaths(string applicationPath, string programDataPath)
+ {
+ if (string.IsNullOrEmpty(programDataPath))
+ {
+ programDataPath = ApplicationPathHelper.GetProgramDataPath(applicationPath);
+ }
- private static ServerApplicationPaths CreateApplicationPaths(string applicationPath, string programDataPath)
- {
- if (string.IsNullOrEmpty(programDataPath))
- {
- programDataPath = ApplicationPathHelper.GetProgramDataPath(applicationPath);
- }
-
- return new ServerApplicationPaths(programDataPath, applicationPath, Path.GetDirectoryName(applicationPath));
- }
+ return new ServerApplicationPaths(programDataPath, applicationPath, Path.GetDirectoryName(applicationPath));
+ }
- private static readonly TaskCompletionSource<bool> ApplicationTaskCompletionSource = new TaskCompletionSource<bool>();
+ private static readonly TaskCompletionSource<bool> ApplicationTaskCompletionSource = new TaskCompletionSource<bool>();
- private static void RunApplication(ServerApplicationPaths appPaths, ILogManager logManager, StartupOptions options)
- {
- SystemEvents.SessionEnding += SystemEvents_SessionEnding;
+ private static void RunApplication(ServerApplicationPaths appPaths, ILogManager logManager, StartupOptions options)
+ {
+ SystemEvents.SessionEnding += SystemEvents_SessionEnding;
- // Allow all https requests
- ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; });
+ // Allow all https requests
+ ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; });
- var fileSystem = new CommonFileSystem(logManager.GetLogger("FileSystem"), false, true);
+ var fileSystem = new CommonFileSystem(logManager.GetLogger("FileSystem"), false, true);
- var nativeApp = new NativeApp();
+ var nativeApp = new NativeApp();
_appHost = new ApplicationHost(appPaths, logManager, options, fileSystem, "MBServer.Mono", nativeApp);
-
- if (options.ContainsOption("-v")) {
- Console.WriteLine (_appHost.ApplicationVersion.ToString());
- return;
- }
-
- Console.WriteLine ("appHost.Init");
-
- var initProgress = new Progress<double>();
-
- var task = _appHost.Init(initProgress);
- Task.WaitAll (task);
-
- Console.WriteLine ("Running startup tasks");
-
- task = _appHost.RunStartupTasks();
- Task.WaitAll (task);
-
- task = ApplicationTaskCompletionSource.Task;
-
- Task.WaitAll (task);
- }
-
- /// <summary>
- /// Handles the SessionEnding event of the SystemEvents control.
- /// </summary>
- /// <param name="sender">The source of the event.</param>
- /// <param name="e">The <see cref="SessionEndingEventArgs"/> instance containing the event data.</param>
- static void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
- {
- if (e.Reason == SessionEndReasons.SystemShutdown)
- {
- Shutdown();
- }
- }
-
- /// <summary>
- /// Handles the UnhandledException event of the CurrentDomain control.
- /// </summary>
- /// <param name="sender">The source of the event.</param>
- /// <param name="e">The <see cref="UnhandledExceptionEventArgs"/> instance containing the event data.</param>
- static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
- {
- var exception = (Exception)e.ExceptionObject;
+
+ if (options.ContainsOption("-v"))
+ {
+ Console.WriteLine(_appHost.ApplicationVersion.ToString());
+ return;
+ }
+
+ Console.WriteLine("appHost.Init");
+
+ var initProgress = new Progress<double>();
+
+ var task = _appHost.Init(initProgress);
+ Task.WaitAll(task);
+
+ Console.WriteLine("Running startup tasks");
+
+ task = _appHost.RunStartupTasks();
+ Task.WaitAll(task);
+
+ task = ApplicationTaskCompletionSource.Task;
+
+ Task.WaitAll(task);
+ }
+
+ /// <summary>
+ /// Handles the SessionEnding event of the SystemEvents control.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="SessionEndingEventArgs"/> instance containing the event data.</param>
+ static void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
+ {
+ if (e.Reason == SessionEndReasons.SystemShutdown)
+ {
+ Shutdown();
+ }
+ }
+
+ /// <summary>
+ /// Handles the UnhandledException event of the CurrentDomain control.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="UnhandledExceptionEventArgs"/> instance containing the event data.</param>
+ static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
+ {
+ var exception = (Exception)e.ExceptionObject;
new UnhandledExceptionWriter(_appHost.ServerConfigurationManager.ApplicationPaths, _logger, _appHost.LogManager).Log(exception);
- if (!Debugger.IsAttached)
- {
- Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(exception));
- }
- }
-
- public static void Shutdown()
- {
- ApplicationTaskCompletionSource.SetResult (true);
- }
- }
-
- class NoCheckCertificatePolicy : ICertificatePolicy
- {
- public bool CheckValidationResult (ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem)
- {
- return true;
- }
- }
+ if (!Debugger.IsAttached)
+ {
+ Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(exception));
+ }
+ }
+
+ public static void Shutdown()
+ {
+ ApplicationTaskCompletionSource.SetResult(true);
+ }
+
+ public static void Restart()
+ {
+ _logger.Info("Disposing app host");
+ _appHost.Dispose();
+
+ _logger.Info("Starting new instance");
+
+ var args = Environment.GetCommandLineArgs()
+ .Skip(1)
+ .Select(NormalizeCommandLineArgument);
+
+ var commandLineArgsString = string.Join(" ", args.ToArray());
+ var module = Environment.GetCommandLineArgs().First();
+
+ _logger.Info("Executable: {0}", module);
+ _logger.Info("Arguments: {0}", commandLineArgsString);
+
+ Process.Start(module, commandLineArgsString);
+
+ _logger.Info("Calling Environment.Exit");
+ Environment.Exit(0);
+ }
+
+ private static string NormalizeCommandLineArgument(string arg)
+ {
+ if (arg.IndexOf(" ", StringComparison.OrdinalIgnoreCase) == -1)
+ {
+ return arg;
+ }
+
+ return "\"" + arg + "\"";
+ }
+ }
+
+ class NoCheckCertificatePolicy : ICertificatePolicy
+ {
+ public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem)
+ {
+ return true;
+ }
+ }
}