aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Mono/Program.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Mono/Program.cs')
-rw-r--r--MediaBrowser.Server.Mono/Program.cs249
1 files changed, 142 insertions, 107 deletions
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;
+ }
+ }
}