Explorar o código

Merge pull request #2164 from hatharry/dev

Service restart and update
Luke %!s(int64=8) %!d(string=hai) anos
pai
achega
41ea831a38
Modificáronse 1 ficheiros con 68 adicións e 3 borrados
  1. 68 3
      MediaBrowser.ServerApplication/MainStartup.cs

+ 68 - 3
MediaBrowser.ServerApplication/MainStartup.cs

@@ -33,6 +33,7 @@ namespace MediaBrowser.ServerApplication
         private static ILogger _logger;
 
         private static bool _isRunningAsService = false;
+        private static bool _canRestartService = false;
         private static bool _appHostDisposed;
 
         [DllImport("kernel32.dll", SetLastError = true)]
@@ -68,6 +69,11 @@ namespace MediaBrowser.ServerApplication
             var options = new StartupOptions();
             _isRunningAsService = options.ContainsOption("-service");
 
+            if (_isRunningAsService)
+            {
+                _canRestartService = CanRestartWindowsService();
+            }
+
             var currentProcess = Process.GetCurrentProcess();
 
             var applicationPath = currentProcess.MainModule.FileName;
@@ -261,7 +267,14 @@ namespace MediaBrowser.ServerApplication
         {
             get
             {
-                return !_isRunningAsService;
+                if (_isRunningAsService)
+                {
+                    return _canRestartService;
+                }
+                else
+                {
+                    return true;
+                }
             }
         }
 
@@ -273,7 +286,14 @@ namespace MediaBrowser.ServerApplication
         {
             get
             {
-                return !_isRunningAsService;
+                if (_isRunningAsService)
+                {
+                    return _canRestartService;
+                }
+                else
+                {
+                    return true;
+                }
             }
         }
 
@@ -614,7 +634,11 @@ namespace MediaBrowser.ServerApplication
         {
             DisposeAppHost();
 
-            if (!_isRunningAsService)
+            if (_isRunningAsService)
+            {
+                RestartWindowsService();
+            }
+            else
             {
                 //_logger.Info("Hiding server notify icon");
                 //_serverNotifyIcon.Visible = false;
@@ -669,6 +693,47 @@ namespace MediaBrowser.ServerApplication
             }
         }
 
+        private static void RestartWindowsService()
+        {
+            _logger.Info("Restarting background service");
+
+            var startInfo = new ProcessStartInfo
+            {
+                FileName = "cmd.exe",
+                CreateNoWindow = true,
+                WindowStyle = ProcessWindowStyle.Hidden,
+                Verb = "runas",
+                ErrorDialog = false,
+                Arguments = String.Format("/c sc stop {0} & sc start {0}", BackgroundService.GetExistingServiceName())
+            };
+            Process.Start(startInfo);
+        }
+
+        private static bool CanRestartWindowsService()
+        {
+            var startInfo = new ProcessStartInfo
+            {
+                FileName = "cmd.exe",
+                CreateNoWindow = true,
+                WindowStyle = ProcessWindowStyle.Hidden,
+                Verb = "runas",
+                ErrorDialog = false,
+                Arguments = String.Format("/c sc query {0}", BackgroundService.GetExistingServiceName())
+            };
+            using (var process = Process.Start(startInfo))
+            {
+                process.WaitForExit();
+                if (process.ExitCode == 0)
+                {
+                    return true;
+                }
+                else
+                {
+                    return false;
+                }
+            }
+        }
+
         private static async Task InstallVcredist2013IfNeeded(ApplicationHost appHost, ILogger logger)
         {
             // Reference