diff --git a/NzbDrone.Core.Test/ProviderTests/DiskProviderTests/ExtractArchiveFixture.cs b/NzbDrone.Core.Test/ProviderTests/DiskProviderTests/ExtractArchiveFixture.cs index 60256ab1d..0cb4071e6 100644 --- a/NzbDrone.Core.Test/ProviderTests/DiskProviderTests/ExtractArchiveFixture.cs +++ b/NzbDrone.Core.Test/ProviderTests/DiskProviderTests/ExtractArchiveFixture.cs @@ -12,11 +12,8 @@ namespace NzbDrone.Core.Test.ProviderTests.DiskProviderTests [Test] public void Should_extract_to_correct_folder() { - var archiveProvider = new ArchiveProvider(); - var destination = Path.Combine(TempFolder, "destination"); - archiveProvider.ExtractArchive(GetTestFilePath("TestArchive.zip"), destination); - + Mocker.Resolve().ExtractArchive(GetTestFilePath("TestArchive.zip"), destination); var destinationFolder = new DirectoryInfo(destination); diff --git a/NzbDrone.Core/Providers/Core/ArchiveProvider.cs b/NzbDrone.Core/Providers/Core/ArchiveProvider.cs index aa2de9abf..18d87729b 100644 --- a/NzbDrone.Core/Providers/Core/ArchiveProvider.cs +++ b/NzbDrone.Core/Providers/Core/ArchiveProvider.cs @@ -1,13 +1,28 @@ -using System.Linq; +using System; +using System.IO; +using System.Linq; using Ionic.Zip; using NLog; +using Ninject; +using NzbDrone.Common; namespace NzbDrone.Core.Providers.Core { public class ArchiveProvider { + private readonly EnviromentProvider _enviromentProvider; private static readonly Logger logger = LogManager.GetCurrentClassLogger(); + [Inject] + public ArchiveProvider(EnviromentProvider enviromentProvider) + { + _enviromentProvider = enviromentProvider; + } + + public ArchiveProvider() + { + + } public virtual void ExtractArchive(string compressedFile, string destination) { @@ -21,5 +36,28 @@ namespace NzbDrone.Core.Providers.Core logger.Trace("Extraction complete."); } + public virtual FileInfo CreateBackupZip() + { + try + { + var dbFile = PathExtentions.GetNzbDronoeDbFile(_enviromentProvider); + var configFile = PathExtentions.GetConfigPath(_enviromentProvider); + var zipFile = Path.Combine(PathExtentions.GetAppDataPath(_enviromentProvider), "NzbDrone_Backup.zip"); + + using (var zip = new ZipFile()) + { + zip.AddFile(dbFile, String.Empty); + zip.AddFile(configFile, String.Empty); + zip.Save(zipFile); + } + + return new FileInfo(zipFile); + } + catch(Exception ex) + { + logger.WarnException("Failed to create backup zip", ex); + return null; + } + } } } \ No newline at end of file diff --git a/NzbDrone.Web/Controllers/SystemController.cs b/NzbDrone.Web/Controllers/SystemController.cs index f5d0c43df..f58d72938 100644 --- a/NzbDrone.Web/Controllers/SystemController.cs +++ b/NzbDrone.Web/Controllers/SystemController.cs @@ -19,13 +19,17 @@ namespace NzbDrone.Web.Controllers private readonly IndexerProvider _indexerProvider; private readonly ConfigProvider _configProvider; private readonly DiskProvider _diskProvider; + private readonly ArchiveProvider _archiveProvider; - public SystemController(JobProvider jobProvider, IndexerProvider indexerProvider, ConfigProvider configProvider, DiskProvider diskProvider) + public SystemController(JobProvider jobProvider, IndexerProvider indexerProvider, + ConfigProvider configProvider, DiskProvider diskProvider, + ArchiveProvider archiveProvider) { _jobProvider = jobProvider; _indexerProvider = indexerProvider; _configProvider = configProvider; _diskProvider = diskProvider; + _archiveProvider = archiveProvider; } public ActionResult Jobs() @@ -48,13 +52,11 @@ namespace NzbDrone.Web.Controllers return View(_indexerProvider.All()); } - public ActionResult Config() { return View(_configProvider.All()); } - [GridAction] public ActionResult _SelectAjaxEditing() { @@ -144,5 +146,11 @@ namespace NzbDrone.Web.Controllers return JsonNotificationResult.Info("Job Queued"); } + + public ActionResult Backup() + { + var file = _archiveProvider.CreateBackupZip(); + return File(file.FullName, "application/binary", file.Name); + } } }