diff --git a/PlexRequests.Services/Jobs/StoreBackup.cs b/PlexRequests.Services/Jobs/StoreBackup.cs new file mode 100644 index 000000000..2d63987b0 --- /dev/null +++ b/PlexRequests.Services/Jobs/StoreBackup.cs @@ -0,0 +1,88 @@ +#region Copyright +// /************************************************************************ +// Copyright (c) 2016 Jamie Rees +// File: StoreBackup.cs +// Created By: Jamie Rees +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// ************************************************************************/ +#endregion +using System; +using System.IO; +using System.Linq; + +using NLog; + +using PlexRequests.Store; + +using Quartz; + +using Directory = System.IO.Directory; + +namespace PlexRequests.Services.Jobs +{ + public class StoreBackup : IJob + { + public StoreBackup(ISqliteConfiguration sql) + { + Sql = sql; + } + + private ISqliteConfiguration Sql { get; } + + private static Logger Log = LogManager.GetCurrentClassLogger(); + + public void Execute(IJobExecutionContext context) + { + TakeBackup(); + } + + private void TakeBackup() + { + Log.Trace("Starting DB Backup"); + var dbPath = Sql.CurrentPath; + var dir = Path.GetDirectoryName(dbPath); + if (dir == null) + { + Log.Warn("We couldn't find the DB path. We cannot backup."); + return; + } + var backupDir = Directory.CreateDirectory(Path.Combine(dir, "Backup")); + + + if (string.IsNullOrEmpty(dbPath)) + { + Log.Warn("Could not find the actual database. We cannot backup."); + return; + } + + try + { + File.Copy(dbPath, Path.Combine(backupDir.FullName, $"PlexRequests.sqlite_{DateTime.Now.ToString("yyyy-MM-dd hh.mm.ss")}.bak")); + } + catch (Exception e) + { + Log.Warn(e); + Log.Warn("Exception when trying to copy the backup."); + } + + } + } +} \ No newline at end of file diff --git a/PlexRequests.Services/PlexRequests.Services.csproj b/PlexRequests.Services/PlexRequests.Services.csproj index 49650d33e..1b088294a 100644 --- a/PlexRequests.Services/PlexRequests.Services.csproj +++ b/PlexRequests.Services/PlexRequests.Services.csproj @@ -84,6 +84,7 @@ + @@ -92,6 +93,7 @@ + diff --git a/PlexRequests.Store/DbConfiguration.cs b/PlexRequests.Store/DbConfiguration.cs index 7ddd60483..27e7f20f9 100644 --- a/PlexRequests.Store/DbConfiguration.cs +++ b/PlexRequests.Store/DbConfiguration.cs @@ -44,7 +44,7 @@ namespace PlexRequests.Store } private SqliteFactory Factory { get; } - private string CurrentPath =>Path.Combine(Path.GetDirectoryName(Application.ExecutablePath) ?? string.Empty, DbFile); + public string CurrentPath =>Path.Combine(Path.GetDirectoryName(Application.ExecutablePath) ?? string.Empty, DbFile); public virtual bool CheckDb() { @@ -59,7 +59,7 @@ namespace PlexRequests.Store return false; } - public string DbFile = "PlexRequests.sqlite"; + public const string DbFile = "PlexRequests.sqlite"; /// /// Gets the database connection. diff --git a/PlexRequests.Store/ISqliteConfiguration.cs b/PlexRequests.Store/ISqliteConfiguration.cs index 19c5b6756..528944e95 100644 --- a/PlexRequests.Store/ISqliteConfiguration.cs +++ b/PlexRequests.Store/ISqliteConfiguration.cs @@ -45,6 +45,9 @@ namespace PlexRequests.Store /// Creates the database. /// void CreateDatabase(); - } + + string CurrentPath { get; } + + } } diff --git a/PlexRequests.UI/Jobs/Scheduler.cs b/PlexRequests.UI/Jobs/Scheduler.cs index 5a91733e1..0ccae710b 100644 --- a/PlexRequests.UI/Jobs/Scheduler.cs +++ b/PlexRequests.UI/Jobs/Scheduler.cs @@ -56,11 +56,13 @@ namespace PlexRequests.UI.Jobs var sickrage = JobBuilder.Create().WithIdentity("SickRageCacher", "Cache").Build(); var sonarr = JobBuilder.Create().WithIdentity("SonarrCacher", "Cache").Build(); var cp = JobBuilder.Create().WithIdentity("CouchPotatoCacher", "Cache").Build(); + var store = JobBuilder.Create().WithIdentity("StoreBackup", "Backup").Build(); jobs.Add(plex); jobs.Add(sickrage); jobs.Add(sonarr); jobs.Add(cp); + jobs.Add(store); return jobs; } @@ -125,11 +127,19 @@ namespace PlexRequests.UI.Jobs .WithSimpleSchedule(x => x.WithIntervalInMinutes(10).RepeatForever()) .Build(); + var storeBackup = + TriggerBuilder.Create() + .WithIdentity("StoreBackup", "Backup") + .StartNow() + .WithSimpleSchedule(x => x.WithIntervalInHours(24).RepeatForever()) + .Build(); + triggers.Add(plexAvailabilityChecker); triggers.Add(srCacher); triggers.Add(sonarrCacher); triggers.Add(cpCacher); + triggers.Add(storeBackup); return triggers; }