public HomeController(ILogger <HomeController> logger, IConfigRepository configRepository, IDatabaseBackupRepository databaseBackupRepository,
                       IBackupFilePurger backupFilePurger, IBackupAuditRepository backupAuditRepository)
 {
     _logger                   = logger;
     _configRepository         = configRepository;
     _databaseBackupRepository = databaseBackupRepository;
     _backupFilePurger         = backupFilePurger;
     _backupAuditRepository    = backupAuditRepository;
 }
Beispiel #2
0
        private async Task UploadLastBackupAsync(IDatabaseBackupRepository databaseBackupRepository, DatabaseBackup dbBackup, string backupPath, IDropboxUploadClient dropboxUploadClient)
        {
            var backupFile = new FileInfo(DatabaseBackupJob.GetBackupFilename(dbBackup, backupPath, dbBackup.LastBackupTime.GetValueOrDefault()));

            if (!backupFile.Exists)
            {
                _logger.LogWarning($"Database backup file [{backupFile.FullName}] does not exist, cannot perform upload");
                return;
            }

            _logger.LogInformation($"Uploading latest database backup [{dbBackup.DatabasePath}]: {backupFile}");
            await dropboxUploadClient.UploadFileAsync(backupFile, $"{Path.GetFileName(dbBackup.DatabasePath)}.{dbBackup.DatabaseBackupId}");

            _logger.LogInformation($"Successfully uploaded latest database backup: {dbBackup.DatabasePath}");

            dbBackup.LastUploadToDropboxTime = DateTime.UtcNow;
            await databaseBackupRepository.UpdateAsync(dbBackup);
        }
        private async Task BackupDbAsync(IDatabaseBackupRepository databaseBackupRepository, DatabaseBackup dbBackup, string backupPath,
                                         IBackupAuditRepository backupAuditRepository)
        {
            if (!File.Exists(dbBackup.DatabasePath))
            {
                _logger.LogWarning($"Database file [{dbBackup.DatabasePath}] does not exist, cannot perform backup");
                await backupAuditRepository.AuditEventAsync(dbBackup, "Backup failed: database file does not exist");

                return;
            }

            var backupTime     = DateTime.UtcNow;
            var backupFilename = GetBackupFilename(dbBackup, backupPath, backupTime);

            if (File.Exists(backupFilename))
            {
                _logger.LogError($"Backup file named [{backupFilename}] already exists, cannot perform backup");
                await backupAuditRepository.AuditEventAsync(dbBackup, "Backup failed: file already exists");

                return;
            }

            if (!Directory.Exists(backupPath))
            {
                Directory.CreateDirectory(backupPath);
            }

            using var dbToBackupConn = new SQLiteConnection($"Data Source={dbBackup.DatabasePath};FailIfMissing=True;");
            await dbToBackupConn.OpenAsync();

            using var dbCommand   = dbToBackupConn.CreateCommand();
            dbCommand.CommandType = CommandType.Text;
            dbCommand.CommandText = $"vacuum into @vacuumInto";
            var dbParam = dbCommand.CreateParameter();

            dbParam.ParameterName = "@vacuumInto";
            dbParam.Value         = backupFilename;
            dbCommand.Parameters.Add(dbParam);
            await dbCommand.ExecuteNonQueryAsync();

            _logger.LogInformation($"Successfully backed up database: {dbBackup.DatabasePath}");
            dbBackup.LastBackupTime = backupTime;
            await databaseBackupRepository.UpdateAsync(dbBackup);
        }