Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }