using System; using System.IO; using System.Linq; using NLog; using NLog.Config; using NLog.Targets; using NzbDrone.Common; using NzbDrone.Update.Providers; namespace NzbDrone.Update { public class Program { private readonly UpdateProvider _updateProvider; private readonly ProcessProvider _processProvider; private static readonly Logger logger = LogManager.GetCurrentClassLogger(); public Program(UpdateProvider updateProvider, ProcessProvider processProvider) { _updateProvider = updateProvider; _processProvider = processProvider; } public static void Main(string[] args) { try { Console.WriteLine("Starting NzbDrone Update Client"); InitLoggers(); logger.Info("Initializing update application"); var enviromentProvider = new EnviromentProvider(); var processProvider = new ProcessProvider(); var serviceProvider = new ServiceProvider(); var diskProvider = new DiskProvider(); var iisProvider = new IISProvider(); var updateProvider = new UpdateProvider(diskProvider, serviceProvider, processProvider, enviromentProvider, iisProvider); new Program(updateProvider, processProvider).Start(args); } catch (Exception e) { logger.FatalException("An error has occurred while applying update package.", e); } TransferUpdateLogs(); } private static void TransferUpdateLogs() { try { var enviromentProvider = new EnviromentProvider(); var diskProvider = new DiskProvider(); logger.Info("Copying log tiles to application directory."); diskProvider.CopyDirectory(enviromentProvider.GetSandboxLogFolder(), enviromentProvider.GetUpdateLogFolder()); } catch (Exception e) { logger.FatalException("Can't copy upgrade log files to target folder", e); } } private static void InitLoggers() { LogConfiguration.RegisterConsoleLogger(LogLevel.Trace); LogConfiguration.RegisterUdpLogger(); LogConfiguration.RegisterExceptioneer(); var lastUpgradeLog = new FileTarget(); lastUpgradeLog.AutoFlush = true; lastUpgradeLog.ConcurrentWrites = false; lastUpgradeLog.FileName = Path.Combine(PathExtentions.UPDATE_LOG_FOLDER_NAME, DateTime.Now.ToString("yyyy.MM.dd-H-mm") + ".txt"); lastUpgradeLog.KeepFileOpen = false; lastUpgradeLog.Layout = "${longdate} - ${logger}: ${message} ${exception}"; LogManager.Configuration.AddTarget(lastUpgradeLog.GetType().Name, lastUpgradeLog); LogManager.Configuration.LoggingRules.Add(new LoggingRule("*", LogLevel.Trace, lastUpgradeLog)); LogConfiguration.Reload(); } public void Start(string[] args) { VerfityArguments(args); int processId = ParseProcessId(args); FileInfo exeFileInfo = new FileInfo(_processProvider.GetProcessById(processId).StartPath); string appPath = exeFileInfo.Directory.FullName; logger.Info("Starting update process"); _updateProvider.Start(appPath); } private int ParseProcessId(string[] args) { int id = 0; if (!Int32.TryParse(args[0], out id) || id <= 0) { throw new ArgumentOutOfRangeException("Invalid process id: " + args[0]); } return id; } private void VerfityArguments(string[] args) { if (args == null || args.Length != 2) throw new ArgumentException("Wrong number of parameters were passed in."); } } }