using System; using System.IO; using System.Linq; using System.Xml.Linq; using System.Xml.XPath; using NLog; using NLog.Config; using Ninject; namespace NzbDrone.Providers { public class ConfigProvider { private readonly EnviromentProvider _enviromentProvider; private static readonly Logger Logger = LogManager.GetLogger("Host.ConfigProvider"); [Inject] public ConfigProvider(EnviromentProvider enviromentProvider) { _enviromentProvider = enviromentProvider; } public ConfigProvider() { } public virtual int PortNumber { get { return GetValueInt("Port"); } } public virtual bool LaunchBrowser { get { return GetValueBoolean("LaunchBrowser"); } } public virtual string IISDirectory { get { return Path.Combine(_enviromentProvider.ApplicationPath, "IISExpress"); } } public virtual string IISExePath { get { return Path.Combine(IISDirectory, "iisexpress.exe"); } } public virtual string IISConfigPath { get { return Path.Combine(IISDirectory, "AppServer", "applicationhost.config"); } } public virtual string AppDataDirectory { get { return Path.Combine(_enviromentProvider.ApplicationPath, "NzbDrone.Web", "App_Data"); } } public virtual string ConfigFile { get { return Path.Combine(AppDataDirectory, "Config.xml"); } } public virtual string NlogConfigPath { get { return Path.Combine(_enviromentProvider.ApplicationPath, "NzbDrone.Web\\log.config"); } } public virtual void ConfigureNlog() { LogManager.Configuration = new XmlLoggingConfiguration(NlogConfigPath, false); } public virtual void UpdateIISConfig(string configPath) { Logger.Info(@"Server configuration file: {0}", configPath); Logger.Info(@"Configuring server to: [http://localhost:{0}]", PortNumber); var configXml = XDocument.Load(configPath); var bindings = configXml.XPathSelectElement("configuration/system.applicationHost/sites").Elements("site").Where( d => d.Attribute("name").Value.ToLowerInvariant() == "nzbdrone").First().Element("bindings"); bindings.Descendants().Remove(); bindings.Add( new XElement("binding", new XAttribute("protocol", "http"), new XAttribute("bindingInformation", String.Format("*:{0}:localhost", PortNumber)) )); bindings.Add( new XElement("binding", new XAttribute("protocol", "http"), new XAttribute("bindingInformation", String.Format("*:{0}:", PortNumber)) )); configXml.Save(configPath); } public virtual void CreateDefaultConfigFile() { //Create the config file here Directory.CreateDirectory(AppDataDirectory); if (!File.Exists(ConfigFile)) { WriteDefaultConfig(); } } private void WriteDefaultConfig() { var xDoc = new XDocument(new XDeclaration("1.0", "utf-8", "yes")); xDoc.Add(new XElement("Config", new XElement("Port", 8989), new XElement("LaunchBrowser", true) ) ); xDoc.Save(ConfigFile); } private string GetValue(string key, string parent = null) { var xDoc = XDocument.Load(ConfigFile); var config = xDoc.Descendants("Config").Single(); var parentContainer = config; if (parent != null) parentContainer = config.Descendants(parent).Single(); string value = parentContainer.Descendants(key).Single().Value; return value; } private int GetValueInt(string key, string parent = null) { return Convert.ToInt32(GetValue(key, parent)); } private bool GetValueBoolean(string key, string parent = null) { return Convert.ToBoolean(GetValue(key, parent)); } } }