Skip to content

Commit b469a5a

Browse files
authored
v 1.3
Add new feature - Delete old backups. User can select for how many days backups will be stored. Setting name: "TimeInDaysToHoldBackups" in appsettings.json file. Officially fix windows version for making backups for postgresql. The problem was not creating backup on complex password. Now application is storing auth in .pgpass or pgpass.conf files (depends on platform). Also clears this file after job t not store these data anymore.
1 parent 2799a0f commit b469a5a

File tree

7 files changed

+87
-25
lines changed

7 files changed

+87
-25
lines changed

DbBackupService/Core/Entities/Databases/MySqlDatabase.cs

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,11 @@ public async Task PerformBackup()
2525

2626
try
2727
{
28-
if (string.IsNullOrWhiteSpace(_databaseConfig.DbName))
29-
throw new ArgumentNullException(nameof(_databaseConfig.DbName));
28+
var backupPaths = PrepareBackupDirectories.CheckDbNameAndPrepareBackupPaths(_databaseConfig, _appConfig);
29+
var combinedBackupPathBackupFile = await PrepareBackupDirectories.PrepareNeededDirectoryAndClean(backupPaths, _appConfig, _logger);
3030

3131
var connectionString = PrepareDatabaseBackupStrings.PrepareConnectionString(_databaseConfig);
32-
var backupPaths = PrepareDatabaseBackupStrings.PrepareBackupPaths(_databaseConfig, _appConfig);
33-
34-
if (!Directory.Exists(backupPaths.DatabaseBackupPath))
35-
Directory.CreateDirectory(backupPaths.DatabaseBackupPath);
36-
37-
var combinedBackupPathBackupFile = Path.Combine(backupPaths.DatabaseBackupPath, backupPaths.BackupFileName);
38-
39-
if (File.Exists(combinedBackupPathBackupFile))
40-
File.Delete(combinedBackupPathBackupFile);
41-
32+
4233
await using var connection = new MySqlConnection(connectionString);
4334
await using var cmd = new MySqlCommand();
4435
using var backup = new MySqlBackup(cmd);

DbBackupService/Core/Entities/Databases/PostgreSqlDatabase.cs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,8 @@ public async Task PerformBackup()
2525

2626
try
2727
{
28-
if (string.IsNullOrWhiteSpace(_databaseConfig.DbName))
29-
throw new ArgumentNullException(nameof(_databaseConfig.DbName));
30-
31-
var backupPaths = PrepareDatabaseBackupStrings.PrepareBackupPaths(_databaseConfig, _appConfig);
32-
33-
if (!Directory.Exists(backupPaths.DatabaseBackupPath))
34-
Directory.CreateDirectory(backupPaths.DatabaseBackupPath);
35-
36-
var combinedBackupPathBackupFile = Path.Combine(backupPaths.DatabaseBackupPath, backupPaths.BackupFileName);
37-
38-
if (File.Exists(combinedBackupPathBackupFile))
39-
File.Delete(combinedBackupPathBackupFile);
28+
var backupPaths = PrepareBackupDirectories.CheckDbNameAndPrepareBackupPaths(_databaseConfig, _appConfig);
29+
var combinedBackupPathBackupFile = await PrepareBackupDirectories.PrepareNeededDirectoryAndClean(backupPaths, _appConfig, _logger);
4030

4131
var server = _databaseConfig.DbServerAndPort!.Split(':');
4232

DbBackupService/Core/Entities/Models/ApplicationConfigurationModel.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ public class ApplicationConfigurationModel
55
public string? LogsFileName { get; set; } = string.Empty;
66
public string? BackupSaveDirectory { get; set; } = string.Empty;
77
public bool IncludeDateOfCreateLogFile { get; set; } = false;
8+
public int TimeInDaysToHoldBackups { get; set; } = 2;
89
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using System.Globalization;
2+
using System.Text.RegularExpressions;
3+
using NLog;
4+
5+
namespace Core.StaticClassess;
6+
7+
public static class DeleteOldBackup
8+
{
9+
public static Task Delete(string directoryPath, int daysThreshold, Logger logger)
10+
{
11+
try
12+
{
13+
var zipFiles = Directory.GetFiles(directoryPath, "*.zip");
14+
15+
var currentDate = DateTime.Now;
16+
17+
foreach (var zipFile in zipFiles)
18+
{
19+
var fileName = Path.GetFileNameWithoutExtension(zipFile);
20+
var match = Regex.Match(fileName, @"\d{2}\.\d{2}\.\d{2}_\d{2}\.\d{2}");
21+
22+
if (!match.Success) continue;
23+
if (!DateTime.TryParseExact(match.Value, "dd.MM.yy_HH.mm", null, DateTimeStyles.None,
24+
out var backupDateTime)) continue;
25+
var difference = currentDate - backupDateTime;
26+
27+
if (!(difference.TotalDays > daysThreshold)) continue;
28+
29+
File.Delete(zipFile);
30+
logger.Info($"Deleted old backup: {Path.GetFileName(zipFile)}");
31+
}
32+
33+
return Task.CompletedTask;
34+
}
35+
catch (Exception e)
36+
{
37+
logger.Warn(e, "Error thrown while deleting old backups");
38+
return Task.CompletedTask;
39+
}
40+
}
41+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using Core.Entities.Models;
2+
using NLog;
3+
4+
namespace Core.StaticClassess;
5+
6+
public static class PrepareBackupDirectories
7+
{
8+
public static (string DatabaseBackupPath, string BackupFileName) CheckDbNameAndPrepareBackupPaths(DatabaseConfigModel databaseConfig, ApplicationConfigurationModel appConfig)
9+
{
10+
if (string.IsNullOrWhiteSpace(databaseConfig.DbName))
11+
throw new ArgumentNullException(nameof(databaseConfig.DbName));
12+
13+
var backupPaths = PrepareDatabaseBackupStrings.PrepareBackupPaths(databaseConfig, appConfig);
14+
return backupPaths;
15+
}
16+
17+
public static async Task<string> PrepareNeededDirectoryAndClean((string DatabaseBackupPath, string BackupFileName) backupPaths, ApplicationConfigurationModel appConfig, Logger logger)
18+
{
19+
if (!Directory.Exists(backupPaths.DatabaseBackupPath))
20+
Directory.CreateDirectory(backupPaths.DatabaseBackupPath);
21+
22+
logger.Info("Deleting old backups...");
23+
await DeleteOldBackup.Delete(backupPaths.DatabaseBackupPath, appConfig.TimeInDaysToHoldBackups, logger);
24+
25+
var combinedBackupPathBackupFile = Path.Combine(backupPaths.DatabaseBackupPath, backupPaths.BackupFileName);
26+
27+
if (File.Exists(combinedBackupPathBackupFile))
28+
File.Delete(combinedBackupPathBackupFile);
29+
30+
return combinedBackupPathBackupFile;
31+
}
32+
}

DbBackupService/Presentation/Presentation.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@
3030
<None Update="Src\Media\appicon.ico">
3131
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
3232
</None>
33+
<None Update="Src\ConfigurationFiles\appsettings.json">
34+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
35+
</None>
36+
<None Update="Src\ConfigurationFiles\databasesConfigurations.json">
37+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
38+
</None>
3339
</ItemGroup>
3440

3541
</Project>

DbBackupService/Presentation/Src/ConfigurationFiles/appsettings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
"AppConfiguration": {
33
"LogsFileName": "Logs.txt",
44
"BackupSaveDirectory": "C:\\Backups",
5-
"IncludeDateOfCreateLogFile": true
5+
"IncludeDateOfCreateLogFile": true,
6+
"TimeInDaysToHoldBackups": 2
67
},
78
"EmailProviderConfiguration": {
89
"ProviderSettings": {

0 commit comments

Comments
 (0)