List <BackupTask> CreateTasks(BackupUtilityConfiguration config, ITimeManager time) { var tasks = new List <BackupTask>(); foreach (var backup in config.Backup) { var sourceFs = CreateFileManager(config.Sftp, backup.From.Mode, backup.From.Host); if (sourceFs == null) { return(null); } var destFs = CreateFileManager(config.Sftp, backup.To.Mode, backup.To.Host); if (destFs == null) { return(null); } var fromPathes = backup.From.Pathes; if (fromPathes.Count == 0) { fromPathes = new List <string> { backup.From.Path }; } foreach (var path in fromPathes) { if (string.IsNullOrEmpty(path)) { WriteLineWithColor("Empty source path!", ConsoleColor.Red); return(null); } if (string.IsNullOrEmpty(backup.To.Path)) { WriteLineWithColor("Empty destination path!", ConsoleColor.Red); return(null); } var sourceCachePath = path + ".md5.cache"; var sourceFilesRange = sourceFs is SftpFileManager ? 128 : 1024; var sourceHasher = new CachedFileHasher(new DirectFileHasher(sourceFs), sourceFs, sourceCachePath, sourceFilesRange, true); var sourceDirName = sourceFs.GetDirectoryName(path); var cachePath = destFs.CombinePath(backup.To.Path, sourceDirName + ".md5.cache"); var destFilesRange = destFs is SftpFileManager ? 128 : 1024; var destHasher = new CachedFileHasher(new DirectFileHasher(destFs), destFs, cachePath, destFilesRange, false); var task = new BackupTask( path, backup.To.Path, sourceFs, destFs, new DefaultHistoryProvider(time, 3), new FileChangeValidator(sourceHasher, destHasher) ); tasks.Add(task); } } return(tasks); }
BackupDirResult ProcessBackup(BackupTask backupTask) { WriteLineWithColor($"Starting backup: '{backupTask.SourceDir}' => '{backupTask.DestinationDir}'.", ConsoleColor.Yellow); Console.WriteLine(); var manager = new BackupManager( backupTask.SourceFs, backupTask.DestinationFs, backupTask.HistoryProvider, backupTask.ChangeValidator, LoggerFactory.CreateLogger <BackupManager>() ); var task = manager.Dump(backupTask.SourceDir, backupTask.DestinationDir); Task.Run(async() => { var prevFiles = 0; while (true) { await Task.Delay(5000); var progress = manager.GetLatestProgress(); if (progress.Done) { return; } var mbs = progress.Bytes / 1024 / 1024; var secs = progress.Elapsed.TotalSeconds; if (prevFiles >= progress.Files) { continue; } prevFiles = progress.Files; Console.WriteLine( $"Files: {progress.Files}, MBs: {mbs}, elapsed: {progress.Elapsed} " + $"[{(secs > 0 ? Math.Round(mbs/secs, 2) : -1.0)} MB/sec]" ); } }); task.ConfigureAwait(true); var result = task.Result; Thread.Sleep(100); // hack for console output delay (several messages may overrides) Console.WriteLine(); WriteBackupResults(result); Console.WriteLine(); return(result); }