public override void ExecuteCommand() { var today = DateTime.UtcNow.Date; // List available backups var toKeep = new HashSet <string>(); var client = CreateBlobClient(); var container = client.GetContainerReference("database-backups"); var backups = container .ListBlobs(useFlatBlobListing: true, blobListingDetails: BlobListingDetails.Metadata) .Cast <CloudBlockBlob>() .Where(b => OfflineDatabaseBackup.IsOfflineBackup(b)) .Select(b => new OfflineDatabaseBackup(b)) .ToList(); // Group by days var days = backups.GroupBy(b => b.Timestamp.Date).OrderByDescending(g => g.Key); // Keep the last backup of each day for the past 7 days where we have backups foreach (var backup in days.Take(7).Select(g => g.OrderByDescending(b => b.Timestamp).First())) { if (backup.Timestamp < today.AddDays(-7)) { Log.Warn("Backup '{0}' is in the last 7 days of backups but is older than 7 days!", backup.Blob.Name); } toKeep.Add(backup.Blob.Name); } // Group previous backups in to months var months = backups .GroupBy(b => new { b.Timestamp.Month, b.Timestamp.Year }) .Where(g => g.Key.Month != today.Month || g.Key.Year != today.Year); // Keep the last chronological backup for each month foreach (var backup in months.Select(g => g.OrderByDescending(b => b.Timestamp).First())) { toKeep.Add(backup.Blob.Name); } // Remove anything older than a year foreach (var backup in backups.Where(b => b.Timestamp < today.AddYears(-1) && toKeep.Contains(b.Blob.Name))) { toKeep.Remove(backup.Blob.Name); } foreach (var backup in backups) { if (!toKeep.Contains(backup.Blob.Name)) { DeleteBackup(backup.Blob); } } Log.Info("Finished cleaning backups!"); }
public override void ExecuteCommand() { // List available backups var client = CreateBlobClient(); var container = client.GetContainerReference("database-backups"); var backups = container .ListBlobs(useFlatBlobListing: true) .Cast <CloudBlockBlob>() .Where(b => OfflineDatabaseBackup.IsOfflineBackup(b)) .Select(b => new OfflineDatabaseBackup(b)) .ToList(); Log.Info("Available Backups:"); foreach (var backup in backups) { Log.Info("* {0} ({1} Local, {2} UTC)", backup.Blob.Name, backup.Timestamp.ToLocalTime().ToFriendlyDateTimeString(), backup.Timestamp.ToUniversalTime().ToFriendlyDateTimeString()); } }