using System; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Web.Hosting; using Ninject; using NLog; using NzbDrone.Core.Datastore; using NzbDrone.Core.Instrumentation; using NzbDrone.Core.Providers; using NzbDrone.Core.Providers.ExternalNotification; using NzbDrone.Core.Providers.Indexer; using NzbDrone.Core.Providers.Jobs; using PetaPoco; namespace NzbDrone.Core { public static class CentralDispatch { private static StandardKernel _kernel; private static readonly Object KernelLock = new object(); private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); public static Version Version { get { return Assembly.GetExecutingAssembly().GetName().Version; } } public static String AppPath { get { if (!String.IsNullOrWhiteSpace(HostingEnvironment.ApplicationPhysicalPath)) { return HostingEnvironment.ApplicationPhysicalPath; } return Directory.GetCurrentDirectory(); } } public static StandardKernel NinjectKernel { get { if (_kernel == null) { InitializeApp(); } return _kernel; } } public static void InitializeApp() { BindKernel(); MigrationsHelper.Run(Connection.MainConnectionString, true); LogConfiguration.StartDbLogging(); _kernel.Get().SetupDefaultProfiles(); BindIndexers(); BindJobs(); BindExternalNotifications(); } private static void BindKernel() { lock (KernelLock) { Logger.Debug("Binding Ninject's Kernel"); _kernel = new StandardKernel(); _kernel.Bind().ToMethod(c => Connection.GetPetaPocoDb(Connection.MainConnectionString)).InRequestScope(); _kernel.Bind().ToMethod(c => Connection.GetPetaPocoDb(Connection.MainConnectionString, false)).WhenInjectedInto(); _kernel.Bind().ToMethod(c => Connection.GetPetaPocoDb(Connection.MainConnectionString, false)).WhenInjectedInto(); _kernel.Bind().ToMethod(c => Connection.GetPetaPocoDb(Connection.LogConnectionString, false)).WhenInjectedInto().InSingletonScope(); _kernel.Bind().ToMethod(c => Connection.GetPetaPocoDb(Connection.LogConnectionString)).WhenInjectedInto().InRequestScope(); } } private static void BindIndexers() { _kernel.Bind().To(); _kernel.Bind().To(); _kernel.Bind().To(); _kernel.Bind().To(); var indexers = _kernel.GetAll(); _kernel.Get().InitializeIndexers(indexers.ToList()); } private static void BindJobs() { _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To().InSingletonScope(); _kernel.Get().Initialize(); _kernel.Get().StartTimer(30); } private static void BindExternalNotifications() { _kernel.Bind().To().InSingletonScope(); var notifiers = _kernel.GetAll(); _kernel.Get().InitializeNotifiers(notifiers.ToList()); } /// /// Forces IISExpress process to exit with the host application /// public static void DedicateToHost() { try { var pid = Convert.ToInt32(Environment.GetEnvironmentVariable("NZBDRONE_PID")); Logger.Debug("Attaching to parent process ({0}) for automatic termination.", pid); var hostProcess = Process.GetProcessById(Convert.ToInt32(pid)); hostProcess.EnableRaisingEvents = true; hostProcess.Exited += (delegate { Logger.Info("Host has been terminated. Shutting down web server."); ShutDown(); }); Logger.Debug("Successfully Attached to host. Process [{0}]", hostProcess.ProcessName); } catch (Exception e) { Logger.Fatal(e); } } private static void ShutDown() { Logger.Info("Shutting down application."); Process.GetCurrentProcess().Kill(); } } }