diff --git a/NzbDrone.Api.Test/MappingTests/ResourceMappingFixture.cs b/NzbDrone.Api.Test/MappingTests/ResourceMappingFixture.cs index 6e2185e16..2a25532ff 100644 --- a/NzbDrone.Api.Test/MappingTests/ResourceMappingFixture.cs +++ b/NzbDrone.Api.Test/MappingTests/ResourceMappingFixture.cs @@ -7,11 +7,13 @@ using NzbDrone.Api.Indexers; using NzbDrone.Api.Mapping; using NzbDrone.Api.RootFolders; using NzbDrone.Api.Series; +using NzbDrone.Api.Update; using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.Indexers; using NzbDrone.Core.Organizer; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.RootFolders; +using NzbDrone.Core.Update; using NzbDrone.Test.Common; namespace NzbDrone.Api.Test.MappingTests @@ -28,6 +30,7 @@ namespace NzbDrone.Api.Test.MappingTests [TestCase(typeof(ParsedEpisodeInfo), typeof(ReleaseResource))] [TestCase(typeof(DownloadDecision), typeof(ReleaseResource))] [TestCase(typeof(Core.History.History), typeof(HistoryResource))] + [TestCase(typeof(UpdatePackage), typeof(UpdateResource))] public void matching_fields(Type modelType, Type resourceType) { MappingValidation.ValidateMapping(modelType, resourceType); diff --git a/NzbDrone.Api/AutomapperBootstraper.cs b/NzbDrone.Api/AutomapperBootstraper.cs index 7af24e420..a949de131 100644 --- a/NzbDrone.Api/AutomapperBootstraper.cs +++ b/NzbDrone.Api/AutomapperBootstraper.cs @@ -4,8 +4,7 @@ using NzbDrone.Api.Calendar; using NzbDrone.Api.Episodes; using NzbDrone.Api.History; using NzbDrone.Api.Missing; -using NzbDrone.Api.QualityProfiles; -using NzbDrone.Api.QualityType; +using NzbDrone.Api.Qualities; using NzbDrone.Api.Resolvers; using NzbDrone.Api.Series; using NzbDrone.Core.Datastore; @@ -20,11 +19,11 @@ namespace NzbDrone.Api public static void InitializeAutomapper() { //QualityProfiles - Mapper.CreateMap() + Mapper.CreateMap() .ForMember(dest => dest.Qualities, opt => opt.ResolveUsing().FromMember(src => src.Allowed)); - Mapper.CreateMap() + Mapper.CreateMap() .ForMember(dest => dest.Allowed, opt => opt.ResolveUsing().FromMember(src => src.Qualities)); diff --git a/NzbDrone.Api/NzbDrone.Api.csproj b/NzbDrone.Api/NzbDrone.Api.csproj index d4c9ddee1..ddac818a3 100644 --- a/NzbDrone.Api/NzbDrone.Api.csproj +++ b/NzbDrone.Api/NzbDrone.Api.csproj @@ -135,10 +135,10 @@ - - - - + + + + @@ -149,6 +149,7 @@ + diff --git a/NzbDrone.Api/QualityProfiles/QualityProfileModel.cs b/NzbDrone.Api/Qualities/QualityProfileResource.cs similarity index 80% rename from NzbDrone.Api/QualityProfiles/QualityProfileModel.cs rename to NzbDrone.Api/Qualities/QualityProfileResource.cs index dd3b8cc2f..cc3582ded 100644 --- a/NzbDrone.Api/QualityProfiles/QualityProfileModel.cs +++ b/NzbDrone.Api/Qualities/QualityProfileResource.cs @@ -1,11 +1,9 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -namespace NzbDrone.Api.QualityProfiles +namespace NzbDrone.Api.Qualities { - public class QualityProfileModel + public class QualityProfileResource { public Int32 Id { get; set; } public String Name { get; set; } diff --git a/NzbDrone.Api/QualityProfiles/QualityProfilesModule.cs b/NzbDrone.Api/Qualities/QualityProfilesModule.cs similarity index 73% rename from NzbDrone.Api/QualityProfiles/QualityProfilesModule.cs rename to NzbDrone.Api/Qualities/QualityProfilesModule.cs index 979d4d223..03b0dfcee 100644 --- a/NzbDrone.Api/QualityProfiles/QualityProfilesModule.cs +++ b/NzbDrone.Api/Qualities/QualityProfilesModule.cs @@ -4,7 +4,7 @@ using Nancy; using NzbDrone.Api.Extensions; using NzbDrone.Core.Qualities; -namespace NzbDrone.Api.QualityProfiles +namespace NzbDrone.Api.Qualities { public class QualityProfilesModule : NzbDroneApiModule { @@ -23,19 +23,19 @@ namespace NzbDrone.Api.QualityProfiles private Response OnGet() { var profiles = _qualityProvider.All(); - return Mapper.Map, List>(profiles).AsResponse(); + return Mapper.Map, List>(profiles).AsResponse(); } private Response OnGet(int id) { var profile = _qualityProvider.Get(id); - return Mapper.Map(profile).AsResponse(); + return Mapper.Map(profile).AsResponse(); } private Response OnPost() { - var request = Request.Body.FromJson(); - var profile = Mapper.Map(request); + var request = Request.Body.FromJson(); + var profile = Mapper.Map(request); request.Id = _qualityProvider.Add(profile).Id; return request.AsResponse(); @@ -44,8 +44,8 @@ namespace NzbDrone.Api.QualityProfiles //Update private Response OnPut() { - var request = Request.Body.FromJson(); - var profile = Mapper.Map(request); + var request = Request.Body.FromJson(); + var profile = Mapper.Map(request); _qualityProvider.Update(profile); return request.AsResponse(); diff --git a/NzbDrone.Api/QualityType/QualitySizeModule.cs b/NzbDrone.Api/Qualities/QualitySizeModule.cs similarity index 97% rename from NzbDrone.Api/QualityType/QualitySizeModule.cs rename to NzbDrone.Api/Qualities/QualitySizeModule.cs index 0f2165bff..36d67e6a6 100644 --- a/NzbDrone.Api/QualityType/QualitySizeModule.cs +++ b/NzbDrone.Api/Qualities/QualitySizeModule.cs @@ -5,7 +5,7 @@ using Nancy; using NzbDrone.Api.Extensions; using NzbDrone.Core.Qualities; -namespace NzbDrone.Api.QualityType +namespace NzbDrone.Api.Qualities { public class QualitySizeModule : NzbDroneApiModule { diff --git a/NzbDrone.Api/QualityType/QualitySizeResource.cs b/NzbDrone.Api/Qualities/QualitySizeResource.cs similarity index 86% rename from NzbDrone.Api/QualityType/QualitySizeResource.cs rename to NzbDrone.Api/Qualities/QualitySizeResource.cs index 1cc12efb6..9fe410687 100644 --- a/NzbDrone.Api/QualityType/QualitySizeResource.cs +++ b/NzbDrone.Api/Qualities/QualitySizeResource.cs @@ -1,7 +1,7 @@ using System; using NzbDrone.Api.REST; -namespace NzbDrone.Api.QualityType +namespace NzbDrone.Api.Qualities { public class QualitySizeResource : RestResource { diff --git a/NzbDrone.Api/Resolvers/AllowedToQualitiesResolver.cs b/NzbDrone.Api/Resolvers/AllowedToQualitiesResolver.cs index f082e7388..e708ca534 100644 --- a/NzbDrone.Api/Resolvers/AllowedToQualitiesResolver.cs +++ b/NzbDrone.Api/Resolvers/AllowedToQualitiesResolver.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; using AutoMapper; -using NzbDrone.Api.QualityProfiles; +using NzbDrone.Api.Qualities; using NzbDrone.Core.Qualities; namespace NzbDrone.Api.Resolvers diff --git a/NzbDrone.Api/Resolvers/NullableDatetimeToString.cs b/NzbDrone.Api/Resolvers/NullableDatetimeToString.cs index d83ef4fbb..ae9e3f483 100644 --- a/NzbDrone.Api/Resolvers/NullableDatetimeToString.cs +++ b/NzbDrone.Api/Resolvers/NullableDatetimeToString.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using AutoMapper; -using NzbDrone.Api.QualityProfiles; namespace NzbDrone.Api.Resolvers { diff --git a/NzbDrone.Api/Resolvers/QualitiesToAllowedResolver.cs b/NzbDrone.Api/Resolvers/QualitiesToAllowedResolver.cs index ca8fc399a..d3e258d2a 100644 --- a/NzbDrone.Api/Resolvers/QualitiesToAllowedResolver.cs +++ b/NzbDrone.Api/Resolvers/QualitiesToAllowedResolver.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using AutoMapper; -using NzbDrone.Api.QualityProfiles; +using NzbDrone.Api.Qualities; using NzbDrone.Core.Qualities; namespace NzbDrone.Api.Resolvers diff --git a/NzbDrone.Api/Resolvers/QualityTypesToIntResolver.cs b/NzbDrone.Api/Resolvers/QualityTypesToIntResolver.cs index e030b410f..d9ef2da77 100644 --- a/NzbDrone.Api/Resolvers/QualityTypesToIntResolver.cs +++ b/NzbDrone.Api/Resolvers/QualityTypesToIntResolver.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using AutoMapper; using NzbDrone.Core.Qualities; diff --git a/NzbDrone.Api/Update/UpdateModule.cs b/NzbDrone.Api/Update/UpdateModule.cs new file mode 100644 index 000000000..aab842eea --- /dev/null +++ b/NzbDrone.Api/Update/UpdateModule.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using NzbDrone.Api.REST; +using NzbDrone.Core.Update; +using NzbDrone.Api.Mapping; + +namespace NzbDrone.Api.Update +{ + public class UpdateModule : NzbDroneRestModule + { + private readonly IUpdateService _updateService; + + public UpdateModule(IUpdateService updateService) + { + _updateService = updateService; + GetResourceAll = GetAvailableUpdate; + } + + private List GetAvailableUpdate() + { + var update = _updateService.AvailableUpdate(); + var response = new List(); + + if (update != null) + { + response.Add(update.InjectTo()); + } + + return response; + } + } + + public class UpdateResource : RestResource + { + public Version Version { get; set; } + public String FileName { get; set; } + public String Url { get; set; } + } +} \ No newline at end of file diff --git a/NzbDrone.Common.Test/PathExtensionFixture.cs b/NzbDrone.Common.Test/PathExtensionFixture.cs index 46e018688..1acb557ce 100644 --- a/NzbDrone.Common.Test/PathExtensionFixture.cs +++ b/NzbDrone.Common.Test/PathExtensionFixture.cs @@ -107,12 +107,6 @@ namespace NzbDrone.Common.Test GetEnvironmentProvider().GetUpdateClientExePath().Should().BeEquivalentTo(@"C:\Temp\Nzbdrone_update\NzbDrone.Update.exe"); } - [Test] - public void GetSandboxLogFolder() - { - GetEnvironmentProvider().GetSandboxLogFolder().Should().BeEquivalentTo(@"C:\Temp\Nzbdrone_update\UpdateLogs\"); - } - [Test] public void GetUpdateLogFolder() { diff --git a/NzbDrone.Common/Instrumentation/ApplicationLogLayoutRenderer.cs b/NzbDrone.Common/Instrumentation/ApplicationLogLayoutRenderer.cs new file mode 100644 index 000000000..14004139c --- /dev/null +++ b/NzbDrone.Common/Instrumentation/ApplicationLogLayoutRenderer.cs @@ -0,0 +1,26 @@ +using System.IO; +using System.Text; +using NLog; +using NLog.Config; +using NLog.LayoutRenderers; + +namespace NzbDrone.Common.Instrumentation +{ + [ThreadAgnostic] + [LayoutRenderer("appLog")] + public class ApplicationLogLayoutRenderer : LayoutRenderer + { + private readonly string _appData; + + public ApplicationLogLayoutRenderer() + { + _appData = Path.Combine(new EnvironmentProvider().GetLogFolder(), "nzbdrone.txt"); + + } + + protected override void Append(StringBuilder builder, LogEventInfo logEvent) + { + builder.Append(_appData); + } + } +} \ No newline at end of file diff --git a/NzbDrone.Common/Instrumentation/DirSeparatorLayoutRenderer.cs b/NzbDrone.Common/Instrumentation/DirSeparatorLayoutRenderer.cs new file mode 100644 index 000000000..bb5658326 --- /dev/null +++ b/NzbDrone.Common/Instrumentation/DirSeparatorLayoutRenderer.cs @@ -0,0 +1,19 @@ +using System.IO; +using System.Text; +using NLog; +using NLog.Config; +using NLog.LayoutRenderers; + +namespace NzbDrone.Common.Instrumentation +{ + [ThreadAgnostic] + [LayoutRenderer("dirSeparator")] + public class DirSeparatorLayoutRenderer : LayoutRenderer + { + + protected override void Append(StringBuilder builder, LogEventInfo logEvent) + { + builder.Append(Path.DirectorySeparatorChar); + } + } +} \ No newline at end of file diff --git a/NzbDrone.Common/Instrumentation/UpdateLogLayoutRenderer.cs b/NzbDrone.Common/Instrumentation/UpdateLogLayoutRenderer.cs new file mode 100644 index 000000000..887afc7c9 --- /dev/null +++ b/NzbDrone.Common/Instrumentation/UpdateLogLayoutRenderer.cs @@ -0,0 +1,27 @@ +using System; +using System.IO; +using System.Text; +using NLog; +using NLog.Config; +using NLog.LayoutRenderers; + +namespace NzbDrone.Common.Instrumentation +{ + [ThreadAgnostic] + [LayoutRenderer("updateLog")] + public class UpdateLogLayoutRenderer : LayoutRenderer + { + private readonly string _appData; + + public UpdateLogLayoutRenderer() + { + _appData = Path.Combine(new EnvironmentProvider().GetUpdateLogFolder(), DateTime.Now.ToString("yy.MM.d-HH.mm")); + + } + + protected override void Append(StringBuilder builder, LogEventInfo logEvent) + { + builder.Append(_appData); + } + } +} \ No newline at end of file diff --git a/NzbDrone.Common/Instrumentation/VersionLayoutRenderer.cs b/NzbDrone.Common/Instrumentation/VersionLayoutRenderer.cs index a9236acd9..188be4d50 100644 --- a/NzbDrone.Common/Instrumentation/VersionLayoutRenderer.cs +++ b/NzbDrone.Common/Instrumentation/VersionLayoutRenderer.cs @@ -11,11 +11,11 @@ namespace NzbDrone.Common.Instrumentation [LayoutRenderer("version")] public class VersionLayoutRenderer : LayoutRenderer { - private static readonly string version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); + private static readonly string Version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); protected override void Append(StringBuilder builder, LogEventInfo logEvent) { - builder.Append(version); + builder.Append(Version); } } } diff --git a/NzbDrone.Common/NzbDrone.Common.csproj b/NzbDrone.Common/NzbDrone.Common.csproj index 1096de719..fcad0d4a1 100644 --- a/NzbDrone.Common/NzbDrone.Common.csproj +++ b/NzbDrone.Common/NzbDrone.Common.csproj @@ -107,6 +107,9 @@ + + + diff --git a/NzbDrone.Common/PathExtensions.cs b/NzbDrone.Common/PathExtensions.cs index b1feeab51..b9eb70a53 100644 --- a/NzbDrone.Common/PathExtensions.cs +++ b/NzbDrone.Common/PathExtensions.cs @@ -5,7 +5,6 @@ namespace NzbDrone.Common { public static class PathExtensions { - private static readonly string APP_DATA = "App_Data" + Path.DirectorySeparatorChar; private static readonly string APP_CONFIG_FILE = "config.xml"; private static readonly string NZBDRONE_DB = "nzbdrone.db"; private static readonly string BACKUP_ZIP_FILE = "NzbDrone_Backup.zip"; @@ -57,12 +56,17 @@ namespace NzbDrone.Common public static string GetAppDataPath(this IEnvironmentProvider environmentProvider) { - return Path.Combine(environmentProvider.WorkingDirectory, APP_DATA); + return environmentProvider.WorkingDirectory; + } + + public static string GetLogFolder(this IEnvironmentProvider environmentProvider) + { + return Path.Combine(environmentProvider.GetAppDataPath(), "logs"); } public static string GetConfigPath(this IEnvironmentProvider environmentProvider) { - return Path.Combine(environmentProvider.WorkingDirectory, APP_CONFIG_FILE); + return Path.Combine(environmentProvider.GetAppDataPath(), APP_CONFIG_FILE); } public static string GetMediaCoverPath(this IEnvironmentProvider environmentProvider) @@ -72,7 +76,7 @@ namespace NzbDrone.Common public static string GetUpdateLogFolder(this IEnvironmentProvider environmentProvider) { - return Path.Combine(environmentProvider.WorkingDirectory, UPDATE_LOG_FOLDER_NAME); + return Path.Combine(environmentProvider.GetAppDataPath(), UPDATE_LOG_FOLDER_NAME); } public static string GetUpdateSandboxFolder(this IEnvironmentProvider environmentProvider) @@ -100,11 +104,6 @@ namespace NzbDrone.Common return Path.Combine(environmentProvider.GetUpdateSandboxFolder(), UPDATE_CLIENT_EXE); } - public static string GetSandboxLogFolder(this IEnvironmentProvider environmentProvider) - { - return Path.Combine(environmentProvider.GetUpdateSandboxFolder(), UPDATE_LOG_FOLDER_NAME); - } - public static string GetConfigBackupFile(this IEnvironmentProvider environmentProvider) { return Path.Combine(environmentProvider.GetAppDataPath(), BACKUP_ZIP_FILE); diff --git a/NzbDrone.Common/Reflection/ReflectionExtensions.cs b/NzbDrone.Common/Reflection/ReflectionExtensions.cs index a19408662..98ff9ff12 100644 --- a/NzbDrone.Common/Reflection/ReflectionExtensions.cs +++ b/NzbDrone.Common/Reflection/ReflectionExtensions.cs @@ -32,6 +32,7 @@ namespace NzbDrone.Common.Reflection || type.IsEnum || type == typeof(string) || type == typeof(DateTime) + || type == typeof(Version) || type == typeof(Decimal); } diff --git a/NzbDrone.Core.Test/UpdateTests/GetUpdateLogFixture.cs b/NzbDrone.Core.Test/UpdateTests/GetUpdateLogFixture.cs index 375279c40..5a1bec76b 100644 --- a/NzbDrone.Core.Test/UpdateTests/GetUpdateLogFixture.cs +++ b/NzbDrone.Core.Test/UpdateTests/GetUpdateLogFixture.cs @@ -4,6 +4,7 @@ using FluentAssertions; using NUnit.Framework; using NzbDrone.Common; using NzbDrone.Core.Test.Framework; +using NzbDrone.Core.Update; namespace NzbDrone.Core.Test.UpdateTests { diff --git a/NzbDrone.Core/Configuration/ConfigService.cs b/NzbDrone.Core/Configuration/ConfigService.cs index 5e1a5249a..8cbae1a1a 100644 --- a/NzbDrone.Core/Configuration/ConfigService.cs +++ b/NzbDrone.Core/Configuration/ConfigService.cs @@ -167,7 +167,7 @@ namespace NzbDrone.Core.Configuration public string UpdateUrl { - get { return GetValue("UpdateUrl", "http://update.nzbdrone.com/_release/"); } + get { return GetValue("UpdateUrl", "http://update.nzbdrone.com/vnext/"); } set { SetValue("UpdateUrl", value); } } diff --git a/NzbDrone.Core/Jobs/Scheduler.cs b/NzbDrone.Core/Jobs/Scheduler.cs index 7399eac3c..9a90a1edf 100644 --- a/NzbDrone.Core/Jobs/Scheduler.cs +++ b/NzbDrone.Core/Jobs/Scheduler.cs @@ -45,10 +45,7 @@ namespace NzbDrone.Core.Jobs { try { - var commandType = Type.GetType(task.TypeName); - var command = (ICommand)Activator.CreateInstance(commandType); - - _messageAggregator.PublishCommand(command); + _messageAggregator.PublishCommand(task.TypeName); } catch (Exception e) { diff --git a/NzbDrone.Core/Jobs/TaskManager.cs b/NzbDrone.Core/Jobs/TaskManager.cs index 428dce76d..6033b7420 100644 --- a/NzbDrone.Core/Jobs/TaskManager.cs +++ b/NzbDrone.Core/Jobs/TaskManager.cs @@ -7,6 +7,7 @@ using NzbDrone.Core.Indexers; using NzbDrone.Core.Lifecycle; using NzbDrone.Core.MediaFiles.Commands; using NzbDrone.Core.Providers; +using NzbDrone.Core.Update.Commands; namespace NzbDrone.Core.Jobs { @@ -39,7 +40,8 @@ namespace NzbDrone.Core.Jobs new ScheduledTask{ Interval = 25, TypeName = typeof(RssSyncCommand).FullName}, new ScheduledTask{ Interval = 12*60, TypeName = typeof(UpdateXemMappings).FullName}, new ScheduledTask{ Interval = 6*60, TypeName = typeof(DiskScanCommand).FullName}, - new ScheduledTask{ Interval = 1, TypeName = typeof(DownloadedEpisodesScanCommand).FullName} + new ScheduledTask{ Interval = 1, TypeName = typeof(DownloadedEpisodesScanCommand).FullName}, + new ScheduledTask{ Interval = 15, TypeName = typeof(ApplicationUpdateCommand).FullName} }; var currentTasks = _scheduledTaskRepository.All(); diff --git a/NzbDrone.Core/Update/UpdateService.cs b/NzbDrone.Core/Update/UpdateService.cs index 1700da773..a0a716b4e 100644 --- a/NzbDrone.Core/Update/UpdateService.cs +++ b/NzbDrone.Core/Update/UpdateService.cs @@ -7,106 +7,125 @@ using System.Linq; using NLog; using NzbDrone.Common; using NzbDrone.Common.Messaging; -using NzbDrone.Core.Update; using NzbDrone.Core.Update.Commands; namespace NzbDrone.Core.Update { - public interface IUpdateService + public interface IUpdateService : IExecute { Dictionary GetUpdateLogFiles(); + UpdatePackage AvailableUpdate(); } -} -public class UpdateService : IUpdateService, IExecute -{ - private readonly IUpdatePackageProvider _updatePackageProvider; - private readonly IEnvironmentProvider _environmentProvider; - - private readonly IDiskProvider _diskProvider; - private readonly IHttpProvider _httpProvider; - private readonly IConfigFileProvider _configFileProvider; - private readonly ArchiveProvider _archiveProvider; - private readonly IProcessProvider _processProvider; - private readonly Logger _logger; - - - public UpdateService(IUpdatePackageProvider updatePackageProvider, IEnvironmentProvider environmentProvider, IDiskProvider diskProvider, - IHttpProvider httpProvider, IConfigFileProvider configFileProvider, ArchiveProvider archiveProvider, IProcessProvider processProvider, Logger logger) + public class UpdateService : IUpdateService { - _updatePackageProvider = updatePackageProvider; - _environmentProvider = environmentProvider; - _diskProvider = diskProvider; - _httpProvider = httpProvider; - _configFileProvider = configFileProvider; - _archiveProvider = archiveProvider; - _processProvider = processProvider; - _logger = logger; - } + private readonly IUpdatePackageProvider _updatePackageProvider; + private readonly IEnvironmentProvider _environmentProvider; + private readonly IDiskProvider _diskProvider; + private readonly IHttpProvider _httpProvider; + private readonly IConfigFileProvider _configFileProvider; + private readonly ArchiveProvider _archiveProvider; + private readonly IProcessProvider _processProvider; + private readonly Logger _logger; - private void InstallUpdate(UpdatePackage updatePackage) - { - var packageDestination = Path.Combine(_environmentProvider.GetUpdateSandboxFolder(), updatePackage.FileName); - if (_diskProvider.FolderExists(_environmentProvider.GetUpdateSandboxFolder())) + public UpdateService(IUpdatePackageProvider updatePackageProvider, IEnvironmentProvider environmentProvider, + IDiskProvider diskProvider, + IHttpProvider httpProvider, IConfigFileProvider configFileProvider, + ArchiveProvider archiveProvider, IProcessProvider processProvider, Logger logger) { - _logger.Info("Deleting old update files"); - _diskProvider.DeleteFolder(_environmentProvider.GetUpdateSandboxFolder(), true); + _updatePackageProvider = updatePackageProvider; + _environmentProvider = environmentProvider; + _diskProvider = diskProvider; + _httpProvider = httpProvider; + _configFileProvider = configFileProvider; + _archiveProvider = archiveProvider; + _processProvider = processProvider; + _logger = logger; } - _logger.Info("Downloading update package from [{0}] to [{1}]", updatePackage.Url, packageDestination); - _httpProvider.DownloadFile(updatePackage.Url, packageDestination); - _logger.Info("Download completed for update package from [{0}]", updatePackage.FileName); - _logger.Info("Extracting Update package"); - _archiveProvider.ExtractArchive(packageDestination, _environmentProvider.GetUpdateSandboxFolder()); - _logger.Info("Update package extracted successfully"); + private void InstallUpdate(UpdatePackage updatePackage) + { + var updateSandboxFolder = _environmentProvider.GetUpdateSandboxFolder(); + + var packageDestination = Path.Combine(updateSandboxFolder, updatePackage.FileName); - _logger.Info("Preparing client"); - _diskProvider.MoveDirectory(_environmentProvider.GetUpdateClientFolder(), _environmentProvider.GetUpdateSandboxFolder()); + if (_diskProvider.FolderExists(updateSandboxFolder)) + { + _logger.Info("Deleting old update files"); + _diskProvider.DeleteFolder(updateSandboxFolder, true); + } + _logger.Info("Downloading update package from [{0}] to [{1}]", updatePackage.Url, packageDestination); + _httpProvider.DownloadFile(updatePackage.Url, packageDestination); + _logger.Info("Download completed for update package from [{0}]", updatePackage.FileName); - _logger.Info("Starting update client"); - var startInfo = new ProcessStartInfo - { - FileName = _environmentProvider.GetUpdateClientExePath(), - Arguments = string.Format("{0} {1}", _processProvider.GetCurrentProcess().Id, _configFileProvider.Guid) - }; + _logger.Info("Extracting Update package"); + _archiveProvider.ExtractArchive(packageDestination, updateSandboxFolder); + _logger.Info("Update package extracted successfully"); - var process = _processProvider.Start(startInfo); + _logger.Info("Preparing client"); + _diskProvider.MoveDirectory(_environmentProvider.GetUpdateClientFolder(), + updateSandboxFolder); - _processProvider.WaitForExit(process); - } - public Dictionary GetUpdateLogFiles() - { - var list = new Dictionary(); + _logger.Info("Starting update client"); + var startInfo = new ProcessStartInfo + { + FileName = _environmentProvider.GetUpdateClientExePath(), + Arguments = string.Format("{0} {1}", _processProvider.GetCurrentProcess().Id, _configFileProvider.Guid) + }; + + var process = _processProvider.Start(startInfo); - if (_diskProvider.FolderExists(_environmentProvider.GetUpdateLogFolder())) + _processProvider.WaitForExit(process); + } + + public Dictionary GetUpdateLogFiles() { - var provider = CultureInfo.InvariantCulture; - var files = _diskProvider.GetFiles(_environmentProvider.GetUpdateLogFolder(), SearchOption.TopDirectoryOnly).ToList(); + var list = new Dictionary(); - foreach (var file in files.Select(c => new FileInfo(c)).OrderByDescending(c => c.Name)) + if (_diskProvider.FolderExists(_environmentProvider.GetUpdateLogFolder())) { - list.Add(DateTime.ParseExact(file.Name.Replace(file.Extension, string.Empty), "yyyy.MM.dd-H-mm", provider), file.FullName); + var provider = CultureInfo.InvariantCulture; + var files = + _diskProvider.GetFiles(_environmentProvider.GetUpdateLogFolder(), SearchOption.TopDirectoryOnly) + .ToList(); + + foreach (var file in files.Select(c => new FileInfo(c)).OrderByDescending(c => c.Name)) + { + list.Add( + DateTime.ParseExact(file.Name.Replace(file.Extension, string.Empty), "yyyy.MM.dd-H-mm", provider), + file.FullName); + } } + + return list; } - return list; - } + public UpdatePackage AvailableUpdate() + { + var latestAvailable = _updatePackageProvider.GetLatestUpdate(); - public void Execute(ApplicationUpdateCommand message) - { - var latestAvailable = _updatePackageProvider.GetLatestUpdate(); + if (latestAvailable == null || latestAvailable.Version <= _environmentProvider.Version) + { + _logger.Debug("No update available."); + return null; + } - if (latestAvailable == null || latestAvailable.Version <= _environmentProvider.Version) - { - _logger.Debug("No update available."); - return; + return latestAvailable; } - InstallUpdate(latestAvailable); + public void Execute(ApplicationUpdateCommand message) + { + var latestAvailable = AvailableUpdate(); + + if (latestAvailable != null) + { + InstallUpdate(latestAvailable); + } + } } } \ No newline at end of file diff --git a/NzbDrone.Update/NLog.config b/NzbDrone.Update/NLog.config index 86e4b11e1..8398980c9 100644 --- a/NzbDrone.Update/NLog.config +++ b/NzbDrone.Update/NLog.config @@ -1,11 +1,14 @@ + + + - + diff --git a/NzbDrone.Update/Program.cs b/NzbDrone.Update/Program.cs index 704378435..b25f55d34 100644 --- a/NzbDrone.Update/Program.cs +++ b/NzbDrone.Update/Program.cs @@ -37,28 +37,10 @@ namespace NzbDrone.Update logger.FatalException("An error has occurred while applying update package.", e); } - TransferUpdateLogs(); } - private static void TransferUpdateLogs() - { - try - { - var environmentProvider = _container.Resolve(); - var diskProvider = _container.Resolve(); - logger.Info("Copying log files to application directory."); - diskProvider.CopyDirectory(environmentProvider.GetSandboxLogFolder(), environmentProvider.GetUpdateLogFolder()); - } - catch (Exception e) - { - logger.FatalException("Can't copy upgrade log files to target folder", e); - } - } - - public void Start(string[] args) { - VerfityArguments(args); int processId = ParseProcessId(args); var exeFileInfo = new FileInfo(_processProvider.GetProcessById(processId).StartPath); @@ -79,13 +61,5 @@ namespace NzbDrone.Update logger.Debug("NzbDrone processId:{0}", id); return id; } - - private void VerfityArguments(string[] args) - { - if (args == null || args.Length != 2) - throw new ArgumentException("Wrong number of parameters were passed in."); - - logger.Debug("Arguments verified. [{0}] , [{1}]", args[0], args[1]); - } } } diff --git a/NzbDrone.Update/UpdateContainerBuilder.cs b/NzbDrone.Update/UpdateContainerBuilder.cs index 604f4ac38..a33956658 100644 --- a/NzbDrone.Update/UpdateContainerBuilder.cs +++ b/NzbDrone.Update/UpdateContainerBuilder.cs @@ -5,7 +5,7 @@ namespace NzbDrone.Update { public class UpdateContainerBuilder : ContainerBuilderBase { - public UpdateContainerBuilder() + private UpdateContainerBuilder() : base("NzbDrone.Update", "NzbDrone.Common") { diff --git a/NzbDrone/AppMain.cs b/NzbDrone/AppMain.cs index 19a94281c..9f2a6b43b 100644 --- a/NzbDrone/AppMain.cs +++ b/NzbDrone/AppMain.cs @@ -2,6 +2,8 @@ using System.Diagnostics; using System.Reflection; using NLog; +using NzbDrone.Core.Update; +using NzbDrone.Core.Update.Commands; namespace NzbDrone { @@ -42,6 +44,14 @@ namespace NzbDrone } var container = MainAppContainerBuilder.BuildContainer(); + try + { + container.Resolve().Execute(new ApplicationUpdateCommand()); + } + catch (Exception e) + { + logger.ErrorException("Application update failed.", e); + } container.Resolve().Route(args); } diff --git a/NzbDrone/NLog.config b/NzbDrone/NLog.config index 6ed2d7f88..8a1501719 100644 --- a/NzbDrone/NLog.config +++ b/NzbDrone/NLog.config @@ -4,9 +4,8 @@ autoReload="true" internalLogLevel="Info" throwExceptions="true" - internalLogToConsole="false" - internalLogToConsoleError="true" - internalLogFile="nlog.txt"> + internalLogToConsole="true" + internalLogToConsoleError="true"> @@ -19,14 +18,14 @@ ${exception:format=ToString} - + layout="${date:format=yy-M-d HH\:mm\:ss.f}|${level}|${logger}|${message}${onexception:inner=${newline}${newline}${exception:format=ToString}${newline}}"/> - + \ No newline at end of file diff --git a/build.ps1 b/build.ps1 index db9545cef..20c28b9a0 100644 --- a/build.ps1 +++ b/build.ps1 @@ -77,15 +77,9 @@ Function Nunit() Function RunGrunt() { $gruntPath = [environment]::getfolderpath("applicationdata") + '\npm\node_modules\grunt-cli\bin\grunt' - - if(!(Test-Path $gruntPath)) - { - Invoke-Expression 'npm install grunt-cli -g' - } - - Invoke-Expression 'npm install' + Invoke-Expression 'npm install' - Invoke-Expression ('node ' + $gruntPath + ' package') + Invoke-Expression ('node ' + $gruntPath + ' package') } Build