示例#1
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());
        }
示例#2
0
        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;
                }
            }
        }
示例#3
0
        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);
            }
        }
示例#4
0
 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));
     }
 }
示例#5
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));
            }
        }
示例#6
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);
            }
        }
示例#7
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));
            }
        }
示例#8
0
        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);
        }
示例#9
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();
        }
示例#10
0
        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;
        }
示例#11
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);
        }
示例#12
0
        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);
            }
        }
示例#13
0
        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;
                }
            }
        }
示例#14
0
 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));
     }
 }