2010-10-15 07:10:44 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using NLog;
|
2011-10-07 06:36:04 +00:00
|
|
|
|
using Ninject;
|
2011-10-23 05:26:43 +00:00
|
|
|
|
using NzbDrone.Common;
|
|
|
|
|
using NzbDrone.Common.Model;
|
2010-10-15 07:10:44 +00:00
|
|
|
|
|
2011-10-07 01:30:44 +00:00
|
|
|
|
namespace NzbDrone.Providers
|
2010-10-15 07:10:44 +00:00
|
|
|
|
{
|
2011-10-07 06:36:04 +00:00
|
|
|
|
public class IISProvider
|
2010-10-15 07:10:44 +00:00
|
|
|
|
{
|
2011-10-07 06:43:35 +00:00
|
|
|
|
private static readonly Logger IISLogger = LogManager.GetLogger("Host.IISExpress");
|
|
|
|
|
private static readonly Logger Logger = LogManager.GetLogger("Host.IISProvider");
|
2011-11-13 07:27:16 +00:00
|
|
|
|
private readonly ConfigFileProvider _configFileProvider;
|
2011-10-07 06:57:43 +00:00
|
|
|
|
private readonly ProcessProvider _processProvider;
|
2011-10-08 04:51:35 +00:00
|
|
|
|
private readonly EnviromentProvider _enviromentProvider;
|
2011-10-07 01:30:44 +00:00
|
|
|
|
|
2011-04-24 03:02:20 +00:00
|
|
|
|
|
2011-10-07 06:36:04 +00:00
|
|
|
|
[Inject]
|
2011-11-13 07:27:16 +00:00
|
|
|
|
public IISProvider(ConfigFileProvider configFileProvider, ProcessProvider processProvider, EnviromentProvider enviromentProvider)
|
2011-10-07 06:36:04 +00:00
|
|
|
|
{
|
2011-11-13 07:27:16 +00:00
|
|
|
|
_configFileProvider = configFileProvider;
|
2011-10-07 06:36:04 +00:00
|
|
|
|
_processProvider = processProvider;
|
2011-10-08 04:51:35 +00:00
|
|
|
|
_enviromentProvider = enviromentProvider;
|
2011-10-07 06:36:04 +00:00
|
|
|
|
}
|
2010-10-15 07:10:44 +00:00
|
|
|
|
|
2011-10-07 06:36:04 +00:00
|
|
|
|
public IISProvider()
|
2011-10-07 01:30:44 +00:00
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2011-10-07 06:36:04 +00:00
|
|
|
|
public string AppUrl
|
2010-10-15 07:10:44 +00:00
|
|
|
|
{
|
2011-11-13 07:27:16 +00:00
|
|
|
|
get { return string.Format("http://localhost:{0}/", _configFileProvider.Port); }
|
2010-10-15 07:10:44 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-10-07 06:36:04 +00:00
|
|
|
|
public int IISProcessId { get; private set; }
|
2011-10-07 03:37:41 +00:00
|
|
|
|
|
2011-10-07 06:36:04 +00:00
|
|
|
|
public bool ServerStarted { get; private set; }
|
2011-10-07 03:37:41 +00:00
|
|
|
|
|
2011-10-07 06:36:04 +00:00
|
|
|
|
public void StartServer()
|
2010-10-15 07:10:44 +00:00
|
|
|
|
{
|
|
|
|
|
Logger.Info("Preparing IISExpress Server...");
|
|
|
|
|
|
2011-10-07 06:36:04 +00:00
|
|
|
|
var startInfo = new ProcessStartInfo();
|
2010-10-15 07:10:44 +00:00
|
|
|
|
|
2011-11-13 07:27:16 +00:00
|
|
|
|
startInfo.FileName = _enviromentProvider.GetIISExe();
|
2011-11-13 21:06:04 +00:00
|
|
|
|
startInfo.Arguments = String.Format("/config:\"{0}\" /trace:i", _enviromentProvider.GetIISConfigPath());
|
2011-10-08 04:51:35 +00:00
|
|
|
|
startInfo.WorkingDirectory = _enviromentProvider.ApplicationPath;
|
2010-10-17 17:22:48 +00:00
|
|
|
|
|
2011-10-07 06:36:04 +00:00
|
|
|
|
startInfo.UseShellExecute = false;
|
|
|
|
|
startInfo.RedirectStandardOutput = true;
|
|
|
|
|
startInfo.RedirectStandardError = true;
|
|
|
|
|
startInfo.CreateNoWindow = true;
|
2010-10-17 17:22:48 +00:00
|
|
|
|
|
2010-10-15 07:10:44 +00:00
|
|
|
|
//Set Variables for the config file.
|
2011-10-08 04:51:35 +00:00
|
|
|
|
startInfo.EnvironmentVariables.Add("NZBDRONE_PATH", _enviromentProvider.ApplicationPath);
|
2011-10-07 06:36:04 +00:00
|
|
|
|
startInfo.EnvironmentVariables.Add("NZBDRONE_PID", Process.GetCurrentProcess().Id.ToString());
|
2010-10-21 01:49:23 +00:00
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
2011-11-13 07:27:16 +00:00
|
|
|
|
_configFileProvider.UpdateIISConfig(_enviromentProvider.GetIISConfigPath());
|
2010-10-21 01:49:23 +00:00
|
|
|
|
}
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
{
|
2011-04-20 07:44:13 +00:00
|
|
|
|
Logger.ErrorException("An error has occurred while trying to update the config file.", e);
|
2010-10-21 01:49:23 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-10-07 06:36:04 +00:00
|
|
|
|
var iisProcess = _processProvider.Start(startInfo);
|
|
|
|
|
IISProcessId = iisProcess.Id;
|
2010-10-15 07:10:44 +00:00
|
|
|
|
|
2011-10-07 06:36:04 +00:00
|
|
|
|
iisProcess.OutputDataReceived += (OnOutputDataReceived);
|
|
|
|
|
iisProcess.ErrorDataReceived += (OnErrorDataReceived);
|
2011-07-17 20:01:37 +00:00
|
|
|
|
|
2011-10-07 06:36:04 +00:00
|
|
|
|
iisProcess.BeginErrorReadLine();
|
|
|
|
|
iisProcess.BeginOutputReadLine();
|
2010-10-15 07:10:44 +00:00
|
|
|
|
|
2011-10-07 06:36:04 +00:00
|
|
|
|
ServerStarted = true;
|
2010-10-15 07:10:44 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-04-25 03:51:18 +00:00
|
|
|
|
private static void OnErrorDataReceived(object sender, DataReceivedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if (e == null || String.IsNullOrWhiteSpace(e.Data))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
IISLogger.Error(e.Data);
|
|
|
|
|
}
|
|
|
|
|
|
2011-10-07 06:36:04 +00:00
|
|
|
|
public void StopServer()
|
2011-04-22 02:23:31 +00:00
|
|
|
|
{
|
2011-10-07 06:36:04 +00:00
|
|
|
|
_processProvider.Kill(IISProcessId);
|
2011-04-22 06:46:26 +00:00
|
|
|
|
|
|
|
|
|
Logger.Info("Finding orphaned IIS Processes.");
|
2011-10-07 06:36:04 +00:00
|
|
|
|
foreach (var process in _processProvider.GetProcessByName("IISExpress"))
|
2011-04-22 06:46:26 +00:00
|
|
|
|
{
|
2011-10-07 06:36:04 +00:00
|
|
|
|
Logger.Info("[{0}]IIS Process found. Path:{1}", process.Id, process.StartPath);
|
2011-11-13 07:27:16 +00:00
|
|
|
|
if (NormalizePath(process.StartPath) == NormalizePath(_enviromentProvider.GetIISExe()))
|
2011-04-22 06:46:26 +00:00
|
|
|
|
{
|
|
|
|
|
Logger.Info("[{0}]Process is considered orphaned.", process.Id);
|
2011-10-07 06:36:04 +00:00
|
|
|
|
_processProvider.Kill(process.Id);
|
2011-04-22 06:46:26 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Logger.Info("[{0}]Process has a different start-up path. skipping.", process.Id);
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-04-22 02:23:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-10-07 06:36:04 +00:00
|
|
|
|
public void RestartServer()
|
2011-04-22 06:46:26 +00:00
|
|
|
|
{
|
2011-10-07 06:36:04 +00:00
|
|
|
|
ServerStarted = false;
|
2011-04-22 06:46:26 +00:00
|
|
|
|
Logger.Warn("Attempting to restart server.");
|
|
|
|
|
StopServer();
|
|
|
|
|
StartServer();
|
|
|
|
|
}
|
|
|
|
|
|
2011-10-07 01:30:44 +00:00
|
|
|
|
private void OnOutputDataReceived(object s, DataReceivedEventArgs e)
|
2010-10-17 17:22:48 +00:00
|
|
|
|
{
|
2011-04-24 03:02:20 +00:00
|
|
|
|
if (e == null || String.IsNullOrWhiteSpace(e.Data) || e.Data.StartsWith("Request started:") ||
|
2011-11-12 06:27:31 +00:00
|
|
|
|
e.Data.StartsWith("Request ended:") || e.Data == ("IncrementMessages called") || e.Data == "iisexpress")
|
2010-10-17 17:22:48 +00:00
|
|
|
|
return;
|
|
|
|
|
|
2011-10-24 05:54:09 +00:00
|
|
|
|
//if (e.Data.Contains(" NzbDrone."))
|
2011-06-13 03:45:22 +00:00
|
|
|
|
{
|
2011-10-15 00:59:24 +00:00
|
|
|
|
Console.WriteLine(e.Data);
|
2011-06-13 03:45:22 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2010-10-17 17:22:48 +00:00
|
|
|
|
IISLogger.Trace(e.Data);
|
|
|
|
|
}
|
|
|
|
|
|
2011-10-07 06:36:04 +00:00
|
|
|
|
private string NormalizePath(string path)
|
2010-10-15 07:10:44 +00:00
|
|
|
|
{
|
2011-04-25 03:51:18 +00:00
|
|
|
|
if (String.IsNullOrWhiteSpace(path))
|
|
|
|
|
throw new ArgumentException("Path can not be null or empty");
|
|
|
|
|
|
|
|
|
|
var info = new FileInfo(path);
|
|
|
|
|
|
|
|
|
|
if (info.FullName.StartsWith(@"\\")) //UNC
|
|
|
|
|
{
|
|
|
|
|
return info.FullName.TrimEnd('/', '\\', ' ');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return info.FullName.Trim('/', '\\', ' ').ToLower();
|
2010-10-15 07:10:44 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2011-04-10 02:44:01 +00:00
|
|
|
|
}
|