private string BuildZipArguments(BackupJob backupJob, string listFile) { const string archiveType = "7z"; var arguments = new StringBuilder(100); arguments.Append(backupJob.IsFullBackup ? "a" : "u"); arguments.AppendFormat(" \"{0}\"", backupJob.FullBackupFile.FullName); arguments.AppendFormat(" -t{0}", archiveType); arguments.AppendFormat(" -mx={0}", backupSettings.CompressionLevel); arguments.AppendFormat(" -mhe={0}", backupSettings.EncryptHeaders ? "on" : "off"); //Is the archive encrypted? var archivePassword = SecurityHelpers.DecodeSecret(backupSettings.ArchivePassword); if (!string.IsNullOrEmpty(archivePassword)) { arguments.AppendFormat(" -p{0}", archivePassword); } if (!backupJob.IsFullBackup) { arguments.Append(" -ms=off"); arguments.Append(" -u- -up0q3r2x2y2z0w2"); arguments.AppendFormat("!\"{0}\"", backupJob.IncrementalFile.FullName); } arguments.AppendFormat(" @{0}", listFile); return(arguments.ToString()); }
private void DetermineBackupMode(BackupJob backupJob, bool forceFull) { if (forceFull) { log.Info("Performing FULL backup (requested)."); backupJob.FullBackupFile = new FileInfo(Path.Combine(backupSettings.LocalBackupFolder, string.Format("F-{0}-{1}.7z", backupJob.BackupName, DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")))); backupJob.IncrementalFile = null; return; } //Set the 7z container files for the Full/Inc. Figure out which backup to perform. var matchingFiles = Directory.GetFiles(backupSettings.LocalBackupFolder, string.Format("F-{0}*.7z", backupJob.BackupName)); //No full backups if (matchingFiles.Length != 1) { log.Info("No full backup file found. Performing FULL backup."); backupJob.FullBackupFile = new FileInfo(Path.Combine(backupSettings.LocalBackupFolder, string.Format("F-{0}-{1}.7z", backupJob.BackupName, DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")))); backupJob.IncrementalFile = null; return; } //There is one full backup, figure if it needs to be redone backupJob.FullBackupFile = new FileInfo(matchingFiles[0]); var fullBackupAgeDays = (DateTime.UtcNow - backupJob.FullBackupFile.CreationTimeUtc).TotalDays; if (fullBackupAgeDays > backupJob.MaxFullBackupAgeDays) { log.Info("Full backup is {0} days old. Performing FULL backup.", fullBackupAgeDays.ToString("0.00")); backupJob.FullBackupFile = new FileInfo(Path.Combine(backupSettings.LocalBackupFolder, string.Format("F-{0}-{1}.7z", backupJob.BackupName, DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")))); backupJob.IncrementalFile = null; } else { //Test the full backup file to make sure it isn't corrupt bool isFullBackupOK = TestFullBackupFile(backupJob); if (isFullBackupOK) { log.Info("Full backup is {0} days old and passed validity check. Performing INCREMENTAL backup.", fullBackupAgeDays.ToString("0.00")); backupJob.IncrementalFile = new FileInfo(Path.Combine(backupSettings.LocalBackupFolder, string.Format("I-{0}-{1}.7z", backupJob.BackupName, DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")))); } else { log.Info("Full backup failed validity check. Performing FULL backup."); backupJob.FullBackupFile = new FileInfo(Path.Combine(backupSettings.LocalBackupFolder, string.Format("F-{0}-{1}.7z", backupJob.BackupName, DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")))); backupJob.IncrementalFile = null; } } }
private void RemoveOldLocalIncrementalBackups(BackupJob backupJob, int numKeep) { var existingFiles = new List <string>(Directory.GetFiles(backupSettings.LocalBackupFolder, string.Format("I-{0}-*.7z", backupJob.BackupName))); var filesToDelete = existingFiles.OrderByDescending(f => f.ToLower()).Skip(numKeep); log.Info("Found: {0} existing local incremental files. Will keep: {1}", existingFiles.Count, numKeep); foreach (string fileToDelete in filesToDelete) { log.Info("Deleting local: {0}", fileToDelete); File.Delete(fileToDelete); } }
private void CleanupLocalBackups(BackupJob backupJob) { if (backupJob.IsFullBackup) { foreach (var fullBak in Directory.GetFiles(backupSettings.LocalBackupFolder, string.Format("F-{0}*.7z", backupJob.BackupName))) { File.Delete(fullBak); } RemoveOldLocalIncrementalBackups(backupJob, 0); } else { //Only keep 1 less than specified in config - the backup that is about to run is that extra RemoveOldLocalIncrementalBackups(backupJob, Math.Max(backupJob.NumberIncremental - 1, 0)); } }
private void BuildArchive(BackupJob backupJob) { var r = new Random(); string listFile = "l" +r.Next(0, 100000)+ ".tmp"; File.WriteAllLines(listFile, backupJob.BackupLocations); Run7Zip(backupJob, listFile); File.Delete(listFile); if (backupJob.IsFullBackup) { backupJob.FullBackupFile.Refresh(); log.Info("Full archive file created. Size: {0}", StaticHelpers.FormatFileSize(backupJob.FullBackupFile.Length)); } else { backupJob.IncrementalFile.Refresh(); log.Info("Incremental archive file created. Size: {0}", StaticHelpers.FormatFileSize(backupJob.IncrementalFile.Length)); } }
private void Run7Zip(BackupJob backupJob, string listFile) { var p = new ProcessStartInfo { FileName = backupSettings.SevenZipExecutablePath, UseShellExecute = false, Arguments = BuildZipArguments(backupJob, listFile), RedirectStandardOutput = true }; var x = Process.Start(p); string output = x.StandardOutput.ReadToEnd(); x.WaitForExit(1000 * 60 * 30); log.Debug(output); if (x.ExitCode != 0) { throw new ApplicationException("Archive failed. Exit Code: " + x.ExitCode); } }
private void BuildArchive(BackupJob backupJob) { var r = new Random(); string listFile = "l" + r.Next(0, 100000) + ".tmp"; File.WriteAllLines(listFile, backupJob.BackupLocations); Run7Zip(backupJob, listFile); File.Delete(listFile); if (backupJob.IsFullBackup) { backupJob.FullBackupFile.Refresh(); log.Info("Full archive file created. Size: {0}", StaticHelpers.FormatFileSize(backupJob.FullBackupFile.Length)); } else { backupJob.IncrementalFile.Refresh(); log.Info("Incremental archive file created. Size: {0}", StaticHelpers.FormatFileSize(backupJob.IncrementalFile.Length)); } }
private bool TestFullBackupFile(BackupJob backupJob) { string args = "t \"" + backupJob.FullBackupFile.FullName + "\""; var archivePassword = SecurityHelpers.DecodeSecret(backupSettings.ArchivePassword); if (!string.IsNullOrEmpty(archivePassword)) { args += " -p" + archivePassword; } var p = new ProcessStartInfo { FileName = backupSettings.SevenZipExecutablePath, UseShellExecute = false, Arguments = args, RedirectStandardOutput = true }; var x = Process.Start(p); string output = x.StandardOutput.ReadToEnd(); x.WaitForExit(1000 * 60 * 30); log.Debug(output); return(x.ExitCode == 0); }
private string BuildZipArguments(BackupJob backupJob, string listFile) { const string archiveType = "7z"; var arguments = new StringBuilder(100); arguments.Append(backupJob.IsFullBackup ? "a" : "u"); arguments.AppendFormat(" \"{0}\"", backupJob.FullBackupFile.FullName); arguments.AppendFormat(" -t{0}", archiveType); arguments.AppendFormat(" -mx={0}", backupSettings.CompressionLevel); arguments.AppendFormat(" -mhe={0}", backupSettings.EncryptHeaders ? "on" : "off"); //Is the archive encrypted? var archivePassword = SecurityHelpers.DecodeSecret(backupSettings.ArchivePassword); if (!string.IsNullOrEmpty(archivePassword)) arguments.AppendFormat(" -p{0}", archivePassword); if (!backupJob.IsFullBackup) { arguments.Append(" -ms=off"); arguments.Append(" -u- -up0q3r2x2y2z0w2"); arguments.AppendFormat("!\"{0}\"", backupJob.IncrementalFile.FullName); } arguments.AppendFormat(" @{0}", listFile); return arguments.ToString(); }
private bool TestFullBackupFile(BackupJob backupJob) { string args = "t \"" + backupJob.FullBackupFile.FullName + "\""; var archivePassword = SecurityHelpers.DecodeSecret(backupSettings.ArchivePassword); if (!string.IsNullOrEmpty(archivePassword)) args += " -p" + archivePassword; var p = new ProcessStartInfo { FileName = backupSettings.SevenZipExecutablePath, UseShellExecute = false, Arguments = args, RedirectStandardOutput = true }; var x = Process.Start(p); string output = x.StandardOutput.ReadToEnd(); x.WaitForExit(1000*60*30); log.Debug(output); return x.ExitCode == 0; }
private void Run7Zip(BackupJob backupJob, string listFile) { var p = new ProcessStartInfo { FileName = backupSettings.SevenZipExecutablePath, UseShellExecute = false, Arguments = BuildZipArguments(backupJob, listFile), RedirectStandardOutput = true }; var x = Process.Start(p); string output = x.StandardOutput.ReadToEnd(); x.WaitForExit(1000 * 60 * 30); log.Debug(output); if (x.ExitCode != 0) throw new ApplicationException("Archive failed. Exit Code: " + x.ExitCode); }
private void RemoveOldLocalIncrementalBackups(BackupJob backupJob, int numKeep) { var existingFiles = new List<string>(Directory.GetFiles(backupSettings.LocalBackupFolder, string.Format("I-{0}-*.7z", backupJob.BackupName))); var filesToDelete = existingFiles.OrderByDescending(f => f.ToLower()).Skip(numKeep); log.Info("Found: {0} existing local incremental files. Will keep: {1}", existingFiles.Count, numKeep); foreach (string fileToDelete in filesToDelete) { log.Info("Deleting local: {0}", fileToDelete); File.Delete(fileToDelete); } }
private void DetermineBackupMode(BackupJob backupJob, bool forceFull) { if (forceFull) { log.Info("Performing FULL backup (requested)."); backupJob.FullBackupFile = new FileInfo(Path.Combine(backupSettings.LocalBackupFolder, string.Format("F-{0}-{1}.7z", backupJob.BackupName, DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")))); backupJob.IncrementalFile = null; return; } //Set the 7z container files for the Full/Inc. Figure out which backup to perform. var matchingFiles = Directory.GetFiles(backupSettings.LocalBackupFolder, string.Format("F-{0}*.7z", backupJob.BackupName)); //No full backups if (matchingFiles.Length != 1) { log.Info("No full backup file found. Performing FULL backup."); backupJob.FullBackupFile = new FileInfo(Path.Combine(backupSettings.LocalBackupFolder, string.Format("F-{0}-{1}.7z", backupJob.BackupName, DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")))); backupJob.IncrementalFile = null; return; } //There is one full backup, figure if it needs to be redone backupJob.FullBackupFile = new FileInfo(matchingFiles[0]); var fullBackupAgeDays = (DateTime.UtcNow - backupJob.FullBackupFile.CreationTimeUtc).TotalDays; if (fullBackupAgeDays > backupJob.MaxFullBackupAgeDays) { log.Info("Full backup is {0} days old. Performing FULL backup.", fullBackupAgeDays.ToString("0.00")); backupJob.FullBackupFile = new FileInfo(Path.Combine(backupSettings.LocalBackupFolder, string.Format("F-{0}-{1}.7z", backupJob.BackupName, DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")))); backupJob.IncrementalFile = null; } else { //Test the full backup file to make sure it isn't corrupt bool isFullBackupOK = TestFullBackupFile(backupJob); if (isFullBackupOK) { log.Info("Full backup is {0} days old and passed validity check. Performing INCREMENTAL backup.", fullBackupAgeDays.ToString("0.00")); backupJob.IncrementalFile = new FileInfo(Path.Combine(backupSettings.LocalBackupFolder, string.Format("I-{0}-{1}.7z", backupJob.BackupName, DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")))); }else { log.Info("Full backup failed validity check. Performing FULL backup."); backupJob.FullBackupFile = new FileInfo(Path.Combine(backupSettings.LocalBackupFolder, string.Format("F-{0}-{1}.7z", backupJob.BackupName, DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")))); backupJob.IncrementalFile = null; } } }
private void CleanupLocalBackups(BackupJob backupJob) { if (backupJob.IsFullBackup) { foreach (var fullBak in Directory.GetFiles(backupSettings.LocalBackupFolder, string.Format("F-{0}*.7z", backupJob.BackupName))) File.Delete(fullBak); RemoveOldLocalIncrementalBackups(backupJob, 0); } else { //Only keep 1 less than specified in config - the backup that is about to run is that extra RemoveOldLocalIncrementalBackups(backupJob, Math.Max(backupJob.NumberIncremental - 1, 0)); } }