Host process cleanup.

This commit is contained in:
Keivan Beigi 2013-08-30 15:55:01 -07:00
parent dd835d5503
commit 7a19b6a2b3
9 changed files with 46 additions and 65 deletions

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Threading; using System.Threading;
using NLog;
using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Host; using NzbDrone.Host;
@ -7,6 +8,8 @@ namespace NzbDrone.Console
{ {
public static class ConsoleApp public static class ConsoleApp
{ {
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
public static void Main(string[] args) public static void Main(string[] args)
{ {
try try
@ -18,7 +21,7 @@ namespace NzbDrone.Console
} }
catch (Exception e) catch (Exception e)
{ {
System.Console.WriteLine(e.ToString()); Logger.FatalException(e.Message, e);
System.Console.ReadLine(); System.Console.ReadLine();
} }

View File

@ -1,6 +1,7 @@
using System; using System;
using NetFwTypeLib; using NetFwTypeLib;
using NLog; using NLog;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
namespace NzbDrone.Host.AccessControl namespace NzbDrone.Host.AccessControl
@ -31,9 +32,6 @@ namespace NzbDrone.Host.AccessControl
return; return;
} }
CloseFirewallPort();
//Open the new port
OpenFirewallPort(_configFileProvider.Port); OpenFirewallPort(_configFileProvider.Port);
} }
} }
@ -91,38 +89,10 @@ namespace NzbDrone.Host.AccessControl
} }
} }
private void CloseFirewallPort()
{
try
{
var netFwMgrType = Type.GetTypeFromProgID("HNetCfg.FwMgr", false);
var mgr = (INetFwMgr)Activator.CreateInstance(netFwMgrType);
var ports = mgr.LocalPolicy.CurrentProfile.GloballyOpenPorts;
var portNumber = 8989;
foreach (INetFwOpenPort p in ports)
{
if (p.Name == "NzbDrone")
{
portNumber = p.Port;
break;
}
}
if (portNumber != _configFileProvider.Port)
{
ports.Remove(portNumber, NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP);
}
}
catch (Exception ex)
{
_logger.WarnException("Failed to close port in firewall for NzbDrone", ex);
}
}
private bool IsFirewallEnabled() private bool IsFirewallEnabled()
{ {
if (OsInfo.IsLinux) return false;
try try
{ {
var netFwMgrType = Type.GetTypeFromProgID("HNetCfg.FwMgr", false); var netFwMgrType = Type.GetTypeFromProgID("HNetCfg.FwMgr", false);
@ -135,7 +105,5 @@ namespace NzbDrone.Host.AccessControl
return false; return false;
} }
} }
} }
} }

View File

@ -9,6 +9,7 @@ namespace NzbDrone.Host.AccessControl
public interface IUrlAclAdapter public interface IUrlAclAdapter
{ {
void RefreshRegistration(); void RefreshRegistration();
string UrlAcl { get; }
} }
public class UrlAclAdapter : IUrlAclAdapter public class UrlAclAdapter : IUrlAclAdapter
@ -24,18 +25,25 @@ namespace NzbDrone.Host.AccessControl
_logger = logger; _logger = logger;
} }
public string UrlAcl
{
get
{
return "http://*:" + _configFileProvider.Port + "/";
}
}
public void RefreshRegistration() public void RefreshRegistration()
{ {
if (OsInfo.Version.Major < 6) if (OsInfo.Version.Major < 6)
return; return;
RegisterUrl(_configFileProvider.Port); RegisterUrl();
} }
private void RegisterUrl()
private void RegisterUrl(int portNumber)
{ {
var arguments = String.Format("http add urlacl http://*:{0}/ sddl=D:(A;;GX;;;S-1-1-0)", portNumber); var arguments = String.Format("http add urlacl {0} sddl=D:(A;;GX;;;S-1-1-0)", UrlAcl);
RunNetsh(arguments); RunNetsh(arguments);
} }

View File

@ -4,7 +4,6 @@ using NLog;
using NzbDrone.Common; using NzbDrone.Common;
using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Host.AccessControl;
using NzbDrone.Host.Owin; using NzbDrone.Host.Owin;
namespace NzbDrone.Host namespace NzbDrone.Host
@ -23,13 +22,10 @@ namespace NzbDrone.Host
private readonly IProcessProvider _processProvider; private readonly IProcessProvider _processProvider;
private readonly PriorityMonitor _priorityMonitor; private readonly PriorityMonitor _priorityMonitor;
private readonly IStartupArguments _startupArguments; private readonly IStartupArguments _startupArguments;
private readonly IFirewallAdapter _firewallAdapter;
private readonly IUrlAclAdapter _urlAclAdapter;
private readonly Logger _logger; private readonly Logger _logger;
public NzbDroneServiceFactory(IConfigFileProvider configFileProvider, IHostController hostController, IRuntimeInfo runtimeInfo, public NzbDroneServiceFactory(IConfigFileProvider configFileProvider, IHostController hostController, IRuntimeInfo runtimeInfo,
IProcessProvider processProvider, PriorityMonitor priorityMonitor, IStartupArguments startupArguments, IProcessProvider processProvider, PriorityMonitor priorityMonitor, IStartupArguments startupArguments, Logger logger)
IFirewallAdapter firewallAdapter, IUrlAclAdapter urlAclAdapter, Logger logger)
{ {
_configFileProvider = configFileProvider; _configFileProvider = configFileProvider;
_hostController = hostController; _hostController = hostController;
@ -37,8 +33,6 @@ namespace NzbDrone.Host
_processProvider = processProvider; _processProvider = processProvider;
_priorityMonitor = priorityMonitor; _priorityMonitor = priorityMonitor;
_startupArguments = startupArguments; _startupArguments = startupArguments;
_firewallAdapter = firewallAdapter;
_urlAclAdapter = urlAclAdapter;
_logger = logger; _logger = logger;
} }
@ -49,11 +43,6 @@ namespace NzbDrone.Host
public void Start() public void Start()
{ {
if (OsInfo.IsWindows && _runtimeInfo.IsAdmin)
{
_urlAclAdapter.RefreshRegistration();
_firewallAdapter.MakeAccessible();
}
_hostController.StartServer(); _hostController.StartServer();
if (!_startupArguments.Flags.Contains(StartupArguments.NO_BROWSER) && if (!_startupArguments.Flags.Contains(StartupArguments.NO_BROWSER) &&

View File

@ -4,7 +4,6 @@
{ {
string AppUrl { get; } string AppUrl { get; }
void StartServer(); void StartServer();
void RestartServer();
void StopServer(); void StopServer();
} }
} }

View File

@ -3,8 +3,10 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using Microsoft.Owin.Hosting; using Microsoft.Owin.Hosting;
using NLog; using NLog;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Security; using NzbDrone.Common.Security;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Host.AccessControl;
using NzbDrone.Host.Owin.MiddleWare; using NzbDrone.Host.Owin.MiddleWare;
using Owin; using Owin;
@ -14,13 +16,20 @@ namespace NzbDrone.Host.Owin
{ {
private readonly IConfigFileProvider _configFileProvider; private readonly IConfigFileProvider _configFileProvider;
private readonly IEnumerable<IOwinMiddleWare> _owinMiddleWares; private readonly IEnumerable<IOwinMiddleWare> _owinMiddleWares;
private readonly IRuntimeInfo _runtimeInfo;
private readonly IUrlAclAdapter _urlAclAdapter;
private readonly IFirewallAdapter _firewallAdapter;
private readonly Logger _logger; private readonly Logger _logger;
private IDisposable _host; private IDisposable _host;
public OwinHostController(IConfigFileProvider configFileProvider, IEnumerable<IOwinMiddleWare> owinMiddleWares, Logger logger) public OwinHostController(IConfigFileProvider configFileProvider, IEnumerable<IOwinMiddleWare> owinMiddleWares,
IRuntimeInfo runtimeInfo, IUrlAclAdapter urlAclAdapter, IFirewallAdapter firewallAdapter, Logger logger)
{ {
_configFileProvider = configFileProvider; _configFileProvider = configFileProvider;
_owinMiddleWares = owinMiddleWares; _owinMiddleWares = owinMiddleWares;
_runtimeInfo = runtimeInfo;
_urlAclAdapter = urlAclAdapter;
_firewallAdapter = firewallAdapter;
_logger = logger; _logger = logger;
} }
@ -28,14 +37,18 @@ namespace NzbDrone.Host.Owin
{ {
IgnoreCertErrorPolicy.Register(); IgnoreCertErrorPolicy.Register();
var url = "http://*:" + _configFileProvider.Port; if (OsInfo.IsWindows && _runtimeInfo.IsAdmin)
{
_urlAclAdapter.RefreshRegistration();
_firewallAdapter.MakeAccessible();
}
var options = new StartOptions(url) var options = new StartOptions(_urlAclAdapter.UrlAcl)
{ {
ServerFactory = "Microsoft.Owin.Host.HttpListener" ServerFactory = "Microsoft.Owin.Host.HttpListener"
}; };
_logger.Info("starting server on {0}", url); _logger.Info("starting server on {0}", _urlAclAdapter.UrlAcl);
_host = WebApp.Start(OwinServiceProviderFactory.Create(), options, BuildApp); _host = WebApp.Start(OwinServiceProviderFactory.Create(), options, BuildApp);
} }
@ -56,14 +69,6 @@ namespace NzbDrone.Host.Owin
get { return string.Format("http://localhost:{0}", _configFileProvider.Port); } get { return string.Format("http://localhost:{0}", _configFileProvider.Port); }
} }
public void RestartServer()
{
_logger.Warn("Attempting to restart server.");
StopServer();
StartServer();
}
public void StopServer() public void StopServer()
{ {
if (_host == null) return; if (_host == null) return;

View File

@ -83,6 +83,10 @@
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Newtonsoft.Json.5.0.6\lib\net40\Newtonsoft.Json.dll</HintPath> <HintPath>..\packages\Newtonsoft.Json.5.0.6\lib\net40\Newtonsoft.Json.dll</HintPath>
</Reference> </Reference>
<Reference Include="NLog, Version=2.0.1.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\NLog.2.0.1.2\lib\net40\NLog.dll</HintPath>
</Reference>
<Reference Include="Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5, processorArchitecture=MSIL"> <Reference Include="Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Owin.1.0\lib\net40\Owin.dll</HintPath> <HintPath>..\packages\Owin.1.0\lib\net40\Owin.dll</HintPath>

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Windows.Forms; using System.Windows.Forms;
using NLog;
using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Host; using NzbDrone.Host;
using NzbDrone.SysTray; using NzbDrone.SysTray;
@ -8,6 +9,8 @@ namespace NzbDrone
{ {
public static class WindowsApp public static class WindowsApp
{ {
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
public static void Main(string[] args) public static void Main(string[] args)
{ {
try try
@ -21,6 +24,7 @@ namespace NzbDrone
} }
catch (Exception e) catch (Exception e)
{ {
Logger.FatalException(e.Message, e);
var message = string.Format("{0}: {1}", e.GetType().Name, e.Message); var message = string.Format("{0}: {1}", e.GetType().Name, e.Message);
MessageBox.Show(text: message, buttons: MessageBoxButtons.OK, icon: MessageBoxIcon.Error, caption: "Epic Fail!"); MessageBox.Show(text: message, buttons: MessageBoxButtons.OK, icon: MessageBoxIcon.Error, caption: "Epic Fail!");
} }

View File

@ -5,5 +5,6 @@
<package id="Microsoft.Owin" version="1.1.0-beta2" targetFramework="net40" /> <package id="Microsoft.Owin" version="1.1.0-beta2" targetFramework="net40" />
<package id="Microsoft.Owin.Hosting" version="1.1.0-beta2" targetFramework="net40" /> <package id="Microsoft.Owin.Hosting" version="1.1.0-beta2" targetFramework="net40" />
<package id="Newtonsoft.Json" version="5.0.6" targetFramework="net40" /> <package id="Newtonsoft.Json" version="5.0.6" targetFramework="net40" />
<package id="NLog" version="2.0.1.2" targetFramework="net40" />
<package id="Owin" version="1.0" targetFramework="net40" /> <package id="Owin" version="1.0" targetFramework="net40" />
</packages> </packages>