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

View File

@ -1,6 +1,7 @@
using System;
using NetFwTypeLib;
using NLog;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Core.Configuration;
namespace NzbDrone.Host.AccessControl
@ -31,9 +32,6 @@ namespace NzbDrone.Host.AccessControl
return;
}
CloseFirewallPort();
//Open the new 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()
{
if (OsInfo.IsLinux) return false;
try
{
var netFwMgrType = Type.GetTypeFromProgID("HNetCfg.FwMgr", false);
@ -135,7 +105,5 @@ namespace NzbDrone.Host.AccessControl
return false;
}
}
}
}

View File

@ -9,6 +9,7 @@ namespace NzbDrone.Host.AccessControl
public interface IUrlAclAdapter
{
void RefreshRegistration();
string UrlAcl { get; }
}
public class UrlAclAdapter : IUrlAclAdapter
@ -24,18 +25,25 @@ namespace NzbDrone.Host.AccessControl
_logger = logger;
}
public string UrlAcl
{
get
{
return "http://*:" + _configFileProvider.Port + "/";
}
}
public void RefreshRegistration()
{
if (OsInfo.Version.Major < 6)
return;
RegisterUrl(_configFileProvider.Port);
RegisterUrl();
}
private void RegisterUrl(int portNumber)
private void RegisterUrl()
{
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);
}

View File

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

View File

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

View File

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

View File

@ -83,6 +83,10 @@
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Newtonsoft.Json.5.0.6\lib\net40\Newtonsoft.Json.dll</HintPath>
</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">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Owin.1.0\lib\net40\Owin.dll</HintPath>

View File

@ -1,5 +1,6 @@
using System;
using System.Windows.Forms;
using NLog;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Host;
using NzbDrone.SysTray;
@ -8,6 +9,8 @@ namespace NzbDrone
{
public static class WindowsApp
{
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
public static void Main(string[] args)
{
try
@ -21,6 +24,7 @@ namespace NzbDrone
}
catch (Exception e)
{
Logger.FatalException(e.Message, e);
var message = string.Format("{0}: {1}", e.GetType().Name, e.Message);
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.Hosting" version="1.1.0-beta2" 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" />
</packages>