public static int Restore(List <string> args, Dictionary <string, string> options, Library.Utility.IFilter filter) { if (args.Count < 1) { return(PrintWrongNumberOfArguments(args, 1)); } string backend = args[0]; args.RemoveAt(0); bool controlFiles = Library.Utility.Utility.ParseBoolOption(options, "control-files"); options.Remove("control-files"); // Prefix all filenames with "*/" so we search all folders for (var ix = 0; ix < args.Count; ix++) { if (args[ix].IndexOfAny(new char[] { '*', '?', System.IO.Path.DirectorySeparatorChar, System.IO.Path.AltDirectorySeparatorChar }) < 0 && !args[ix].StartsWith("[")) { args[ix] = "*" + System.IO.Path.DirectorySeparatorChar.ToString() + args[ix]; } } var output = new ConsoleOutput(options); output.MessageEvent(string.Format("Restore started at {0}", DateTime.Now)); using (var i = new Library.Main.Controller(backend, options, output)) if (controlFiles) { var res = i.RestoreControlFiles(args.ToArray(), filter); output.MessageEvent("Restore control files completed:"); foreach (var s in res.Files) { Console.WriteLine(s); } } else { using (var periodicOutput = new PeriodicOutput(output, TimeSpan.FromSeconds(5))) { output.PhaseChanged += (phase, previousPhase) => { if (phase == Duplicati.Library.Main.OperationPhase.Restore_PreRestoreVerify) { output.MessageEvent("Checking remote backup ..."); } else if (phase == Duplicati.Library.Main.OperationPhase.Restore_ScanForExistingFiles) { output.MessageEvent("Checking existing target files ..."); } /*else if (phase == Duplicati.Library.Main.OperationPhase.Restore_DownloadingRemoteFiles) * output.MessageEvent("Downloading remote files ..."); */ else if (phase == Duplicati.Library.Main.OperationPhase.Restore_PatchWithLocalBlocks) { output.MessageEvent("Updating target files with local data ..."); } else if (phase == Duplicati.Library.Main.OperationPhase.Restore_PostRestoreVerify) { periodicOutput.SetFinished(); periodicOutput.Join(TimeSpan.FromMilliseconds(100)); output.MessageEvent("Verifying restored files ..."); } else if (phase == Duplicati.Library.Main.OperationPhase.Restore_ScanForLocalBlocks) { output.MessageEvent("Scanning local files for needed data ..."); } else if (phase == Duplicati.Library.Main.OperationPhase.Restore_CreateTargetFolders) { periodicOutput.SetReady(); } }; periodicOutput.WriteOutput += (progress, files, size, counting) => { output.MessageEvent(string.Format(" {0} files need to be restored ({1})", files, Library.Utility.Utility.FormatSizeString(size))); }; var res = i.Restore(args.ToArray(), filter); string restorePath; options.TryGetValue("restore-path", out restorePath); output.MessageEvent(string.Format("Restored {0} ({1}) files to {2}", res.FilesRestored, Library.Utility.Utility.FormatSizeString(res.SizeOfRestoredFiles), string.IsNullOrEmpty(restorePath) ? "original path" : restorePath)); output.MessageEvent(string.Format("Duration of restore: {0:hh\\:mm\\:ss}", res.Duration)); if (res.FilesRestored > 0) { output.MessageEvent("***********************************************"); output.MessageEvent("Did we help save your files? If so, please support Duplicati with a donation. We suggest 10€ for private use and 100€ for commercial use."); output.MessageEvent(""); output.MessageEvent("Paypal: http://goo.gl/P4XJ6S"); output.MessageEvent("Bitcoin: 1L74qa1n5SFKwwyHhECTHBJgcf6WT2rJKf"); output.MessageEvent("***********************************************"); } if (output.VerboseOutput) { Library.Utility.Utility.PrintSerializeObject(res, Console.Out); } } } return(0); }
public static int Restore(List<string> args, Dictionary<string, string> options, Library.Utility.IFilter filter) { if (args.Count < 1) return PrintWrongNumberOfArguments(args, 1); string backend = args[0]; args.RemoveAt(0); bool controlFiles = Library.Utility.Utility.ParseBoolOption(options, "control-files"); options.Remove("control-files"); // Prefix all filenames with "*/" so we search all folders for (var ix = 0; ix < args.Count; ix++) if (args[ix].IndexOfAny(new char[] { '*', '?', System.IO.Path.DirectorySeparatorChar, System.IO.Path.AltDirectorySeparatorChar }) < 0 && !args[ix].StartsWith("[")) args[ix] = "*" + System.IO.Path.DirectorySeparatorChar.ToString() + args[ix]; // suffix all folders with "*" so we restore all contents in the folder for (var ix = 0; ix < args.Count; ix++) if (args[ix].IndexOfAny(new char[] { '*', '?' }) < 0 && !args[ix].StartsWith("[") && args[ix].EndsWith(System.IO.Path.DirectorySeparatorChar.ToString())) args[ix] += "*"; var output = new ConsoleOutput(options); output.MessageEvent(string.Format("Restore started at {0}", DateTime.Now)); using(var i = new Library.Main.Controller(backend, options, output)) if (controlFiles) { var res = i.RestoreControlFiles(args.ToArray(), filter); output.MessageEvent("Restore control files completed:"); foreach(var s in res.Files) Console.WriteLine(s); } else { using(var periodicOutput = new PeriodicOutput(output, TimeSpan.FromSeconds(5))) { output.PhaseChanged += (phase, previousPhase) => { if (phase == Duplicati.Library.Main.OperationPhase.Restore_PreRestoreVerify) output.MessageEvent("Checking remote backup ..."); else if (phase == Duplicati.Library.Main.OperationPhase.Restore_ScanForExistingFiles) output.MessageEvent("Checking existing target files ..."); /*else if (phase == Duplicati.Library.Main.OperationPhase.Restore_DownloadingRemoteFiles) output.MessageEvent("Downloading remote files ..."); */ else if (phase == Duplicati.Library.Main.OperationPhase.Restore_PatchWithLocalBlocks) output.MessageEvent("Updating target files with local data ..."); else if (phase == Duplicati.Library.Main.OperationPhase.Restore_PostRestoreVerify) { periodicOutput.SetFinished(); periodicOutput.Join(TimeSpan.FromMilliseconds(100)); output.MessageEvent("Verifying restored files ..."); } else if (phase == Duplicati.Library.Main.OperationPhase.Restore_ScanForLocalBlocks) output.MessageEvent("Scanning local files for needed data ..."); else if (phase == Duplicati.Library.Main.OperationPhase.Restore_CreateTargetFolders) periodicOutput.SetReady(); }; periodicOutput.WriteOutput += (progress, files, size, counting) => { output.MessageEvent(string.Format(" {0} files need to be restored ({1})", files, Library.Utility.Utility.FormatSizeString(size))); }; var res = i.Restore(args.ToArray(), filter); string restorePath; options.TryGetValue("restore-path", out restorePath); output.MessageEvent(string.Format("Restored {0} ({1}) files to {2}", res.FilesRestored, Library.Utility.Utility.FormatSizeString(res.SizeOfRestoredFiles), string.IsNullOrEmpty(restorePath) ? "original path" : restorePath)); output.MessageEvent(string.Format("Duration of restore: {0:hh\\:mm\\:ss}", res.Duration)); if (res.FilesRestored > 0 && !Library.Main.Utility.SuppressDonationMessages) { output.MessageEvent("***********************************************"); output.MessageEvent("Did we help save your files? If so, please support Duplicati with a donation. We suggest 10€ for private use and 100€ for commercial use."); output.MessageEvent(""); output.MessageEvent("Paypal: http://goo.gl/P4XJ6S"); output.MessageEvent("Bitcoin: 1L74qa1n5SFKwwyHhECTHBJgcf6WT2rJKf"); output.MessageEvent("***********************************************"); } if (output.VerboseOutput) Library.Utility.Utility.PrintSerializeObject(res, Console.Out); if (res.Warnings.Count() > 0) return 2; } } return 0; }