2010-10-15 07:10:44 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using Microsoft.Web.Administration;
|
|
|
|
|
using NLog;
|
|
|
|
|
|
|
|
|
|
namespace NzbDrone
|
|
|
|
|
{
|
|
|
|
|
class IISController
|
|
|
|
|
{
|
|
|
|
|
public static Process IISProcess { get; private set; }
|
|
|
|
|
private static readonly Logger IISLogger = LogManager.GetLogger("IISExpress");
|
|
|
|
|
private static readonly Logger Logger = LogManager.GetLogger("IISController");
|
|
|
|
|
private static readonly string IISFolder = Path.Combine(Config.ProjectRoot, @"IISExpress\");
|
|
|
|
|
private static readonly string IISExe = Path.Combine(IISFolder, @"iisexpress.exe");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
internal static string AppUrl
|
|
|
|
|
{
|
|
|
|
|
get { return string.Format("http://localhost:{0}/", Config.Port); }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal static Process StartIIS()
|
|
|
|
|
{
|
|
|
|
|
Logger.Info("Preparing IISExpress Server...");
|
|
|
|
|
IISProcess = new Process();
|
|
|
|
|
|
|
|
|
|
IISProcess.StartInfo.FileName = IISExe;
|
2010-10-17 17:22:48 +00:00
|
|
|
|
IISProcess.StartInfo.Arguments = "/config:IISExpress\\Appserver\\applicationhost.config /trace:i";
|
2010-10-15 07:10:44 +00:00
|
|
|
|
IISProcess.StartInfo.WorkingDirectory = Config.ProjectRoot;
|
|
|
|
|
|
|
|
|
|
IISProcess.StartInfo.UseShellExecute = false;
|
|
|
|
|
IISProcess.StartInfo.RedirectStandardOutput = true;
|
|
|
|
|
IISProcess.StartInfo.RedirectStandardError = true;
|
|
|
|
|
IISProcess.StartInfo.CreateNoWindow = true;
|
|
|
|
|
|
2010-10-17 17:22:48 +00:00
|
|
|
|
|
|
|
|
|
IISProcess.OutputDataReceived += (OnDataReceived);
|
|
|
|
|
|
2010-10-15 07:10:44 +00:00
|
|
|
|
IISProcess.ErrorDataReceived += ((s, e) => IISLogger.Fatal(e.Data));
|
|
|
|
|
|
2010-10-17 17:22:48 +00:00
|
|
|
|
|
|
|
|
|
|
2010-10-15 07:10:44 +00:00
|
|
|
|
//Set Variables for the config file.
|
|
|
|
|
Environment.SetEnvironmentVariable("NZBDRONE_PATH", Config.ProjectRoot);
|
|
|
|
|
UpdateIISConfig();
|
|
|
|
|
|
|
|
|
|
Logger.Info("Starting process. [{0}]", IISProcess.StartInfo.FileName);
|
|
|
|
|
IISProcess.Start();
|
|
|
|
|
|
|
|
|
|
IISProcess.BeginErrorReadLine();
|
|
|
|
|
IISProcess.BeginOutputReadLine();
|
|
|
|
|
return IISProcess;
|
|
|
|
|
}
|
|
|
|
|
|
2010-10-17 17:22:48 +00:00
|
|
|
|
private static void OnDataReceived(object s, DataReceivedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if (e == null || e.Data == null || e.Data.StartsWith("Request started:") || e.Data.StartsWith("Request ended:") || e.Data == ("IncrementMessages called"))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
IISLogger.Trace(e.Data);
|
|
|
|
|
}
|
|
|
|
|
|
2010-10-15 07:10:44 +00:00
|
|
|
|
internal static void StopIIS()
|
|
|
|
|
{
|
|
|
|
|
KillProcess(IISProcess);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal static void KillOrphaned()
|
|
|
|
|
{
|
|
|
|
|
Logger.Info("Finding orphaned IIS Processes.");
|
|
|
|
|
foreach (var process in Process.GetProcessesByName("IISExpress"))
|
|
|
|
|
{
|
|
|
|
|
string processPath = process.MainModule.FileName;
|
|
|
|
|
Logger.Info("[{0}]IIS Process found. Path:{1}", process.Id, processPath);
|
|
|
|
|
if (CleanPath(processPath) == CleanPath(IISExe))
|
|
|
|
|
{
|
|
|
|
|
Logger.Info("[{0}]Process is considered orphaned.", process.Id);
|
|
|
|
|
KillProcess(process);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Logger.Info("[{0}]Process has a different start-up path. skipping.", process.Id);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void KillProcess(Process process)
|
|
|
|
|
{
|
|
|
|
|
if (process == null) return;
|
|
|
|
|
|
|
|
|
|
Logger.Info("[{0}]Killing process", process.Id);
|
|
|
|
|
process.Kill();
|
|
|
|
|
Logger.Info("[{0}]Waiting for exit", process.Id);
|
|
|
|
|
process.WaitForExit();
|
|
|
|
|
Logger.Info("[{0}]Process terminated successfully", process.Id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void UpdateIISConfig()
|
|
|
|
|
{
|
|
|
|
|
Logger.Info(@"Configuring server to: [http://localhost:{0}]", Config.Port);
|
|
|
|
|
var serverManager = new ServerManager(Path.Combine(IISFolder, @"AppServer\applicationhost.config"));
|
|
|
|
|
serverManager.Sites["NZBDrone"].Bindings[0].BindingInformation = string.Format("*:{0}:", Config.Port);
|
|
|
|
|
serverManager.CommitChanges();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static string CleanPath(string path)
|
|
|
|
|
{
|
|
|
|
|
return path.ToLower().Replace("\\", "").Replace("//", "//");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|