public static Duplicati.Library.Interface.IBasicResults Run(IRunnerData data, bool fromQueue) { if (data is CustomRunnerTask) { try { var sink = new MessageSink(data.TaskID, null); Program.GenerateProgressState = () => sink.Copy(); Program.StatusEventNotifyer.SignalNewEvent(); ((CustomRunnerTask)data).Run(sink); } catch (Exception ex) { Program.DataConnection.LogError(string.Empty, "Failed while executing custom task", ex); } return(null); } var backup = data.Backup; if (backup.Metadata == null) { backup.Metadata = new Dictionary <string, string>(); } Duplicati.Library.Utility.TempFolder tempfolder = null; try { var sink = new MessageSink(data.TaskID, backup.ID); if (fromQueue) { Program.GenerateProgressState = () => sink.Copy(); Program.StatusEventNotifyer.SignalNewEvent(); } var options = ApplyOptions(backup, data.Operation, GetCommonOptions(backup, data.Operation)); if (data.ExtraOptions != null) { foreach (var k in data.ExtraOptions) { options[k.Key] = k.Value; } } // Pack in the system or task config for easy restore if (data.Operation == DuplicatiOperation.Backup && options.ContainsKey("store-task-config")) { tempfolder = StoreTaskConfigAndGetTempFolder(data, options); } // Attach a log scope that tags all messages to relay the TaskID and BackupID using (Library.Logging.Log.StartScope(log => { log[LogWriteHandler.LOG_EXTRA_TASKID] = data.TaskID.ToString(); log[LogWriteHandler.LOG_EXTRA_BACKUPID] = data.BackupID; })) using (tempfolder) using (var controller = new Duplicati.Library.Main.Controller(backup.TargetURL, options, sink)) { try { if (options.ContainsKey("throttle-upload")) { ((RunnerData)data).OriginalUploadSpeed = Duplicati.Library.Utility.Sizeparser.ParseSize(options["throttle-upload"], "kb"); } } catch { } try { if (options.ContainsKey("throttle-download")) { ((RunnerData)data).OriginalDownloadSpeed = Duplicati.Library.Utility.Sizeparser.ParseSize(options["throttle-download"], "kb"); } } catch { } ((RunnerData)data).Controller = controller; data.UpdateThrottleSpeed(); switch (data.Operation) { case DuplicatiOperation.Backup: { var filter = ApplyFilter(backup, data.Operation, GetCommonFilter(backup, data.Operation)); var sources = (from n in backup.Sources let p = SpecialFolders.ExpandEnvironmentVariables(n) where !string.IsNullOrWhiteSpace(p) select p).ToArray(); var r = controller.Backup(sources, filter); UpdateMetadata(backup, r); return(r); } case DuplicatiOperation.List: { var r = controller.List(data.FilterStrings); UpdateMetadata(backup, r); return(r); } case DuplicatiOperation.Repair: { var r = controller.Repair(data.FilterStrings == null ? null : new Library.Utility.FilterExpression(data.FilterStrings)); UpdateMetadata(backup, r); return(r); } case DuplicatiOperation.RepairUpdate: { var r = controller.UpdateDatabaseWithVersions(); UpdateMetadata(backup, r); return(r); } case DuplicatiOperation.Remove: { var r = controller.Delete(); UpdateMetadata(backup, r); return(r); } case DuplicatiOperation.Restore: { var r = controller.Restore(data.FilterStrings); UpdateMetadata(backup, r); return(r); } case DuplicatiOperation.Verify: { var r = controller.Test(); UpdateMetadata(backup, r); return(r); } case DuplicatiOperation.Compact: { var r = controller.Compact(); UpdateMetadata(backup, r); return(r); } case DuplicatiOperation.CreateReport: { using (var tf = new Duplicati.Library.Utility.TempFile()) { var r = controller.CreateLogDatabase(tf); var tempid = Program.DataConnection.RegisterTempFile("create-bug-report", r.TargetPath, DateTime.Now.AddDays(3)); if (string.Equals(tf, r.TargetPath, Library.Utility.Utility.ClientFilenameStringComparison)) { tf.Protected = true; } Program.DataConnection.RegisterNotification( NotificationType.Information, "Bugreport ready", "Bugreport is ready for download", null, null, "bug-report:created:" + tempid, null, "BugreportCreatedReady", "", (n, a) => n ); return(r); } } case DuplicatiOperation.ListRemote: { var r = controller.ListRemote(); UpdateMetadata(backup, r); return(r); } case DuplicatiOperation.Delete: { if (Library.Utility.Utility.ParseBoolOption(data.ExtraOptions, "delete-remote-files")) { controller.DeleteAllRemoteFiles(); } if (Library.Utility.Utility.ParseBoolOption(data.ExtraOptions, "delete-local-db")) { string dbpath; options.TryGetValue("db-path", out dbpath); if (!string.IsNullOrWhiteSpace(dbpath) && System.IO.File.Exists(dbpath)) { System.IO.File.Delete(dbpath); } } Program.DataConnection.DeleteBackup(backup); Program.Scheduler.Reschedule(); return(null); } case DuplicatiOperation.Vacuum: { var r = controller.Vacuum(); UpdateMetadata(backup, r); return(r); } default: //TODO: Log this return(null); } } } catch (Exception ex) { Program.DataConnection.LogError(data.Backup.ID, string.Format("Failed while executing \"{0}\" with id: {1}", data.Operation, data.Backup.ID), ex); UpdateMetadataError(data.Backup, ex); Library.UsageReporter.Reporter.Report(ex); if (!fromQueue) { throw; } return(null); } finally { ((RunnerData)data).Controller = null; } }
public static Duplicati.Library.Interface.IBasicResults Run(IRunnerData data, bool fromQueue) { if (data is CustomRunnerTask) { try { var sink = new MessageSink(data.TaskID, null); Program.GenerateProgressState = () => sink.Copy(); Program.StatusEventNotifyer.SignalNewEvent(); ((CustomRunnerTask)data).Run(sink); } catch (Exception ex) { Program.DataConnection.LogError(string.Empty, "Failed while executing custom task", ex); } return(null); } var backup = data.Backup; Duplicati.Library.Utility.TempFolder tempfolder = null; if (backup.Metadata == null) { backup.Metadata = new Dictionary <string, string>(); } try { var sink = new MessageSink(data.TaskID, backup.ID); if (fromQueue) { Program.GenerateProgressState = () => sink.Copy(); Program.StatusEventNotifyer.SignalNewEvent(); } var options = ApplyOptions(backup, data.Operation, GetCommonOptions(backup, data.Operation)); if (data.ExtraOptions != null) { foreach (var k in data.ExtraOptions) { options[k.Key] = k.Value; } } // Pack in the system or task config for easy restore if (data.Operation == DuplicatiOperation.Backup && options.ContainsKey("store-task-config")) { var all_tasks = string.Equals(options["store-task-config"], "all", StringComparison.OrdinalIgnoreCase) || string.Equals(options["store-task-config"], "*", StringComparison.OrdinalIgnoreCase); var this_task = Duplicati.Library.Utility.Utility.ParseBool(options["store-task-config"], false); options.Remove("store-task-config"); if (all_tasks || this_task) { if (tempfolder == null) { tempfolder = new Duplicati.Library.Utility.TempFolder(); } var temppath = System.IO.Path.Combine(tempfolder, "task-setup.json"); using (var tempfile = Duplicati.Library.Utility.TempFile.WrapExistingFile(temppath)) { object taskdata = null; if (all_tasks) { taskdata = Program.DataConnection.Backups.Where(x => !x.IsTemporary).Select(x => Program.DataConnection.PrepareBackupForExport(Program.DataConnection.GetBackup(x.ID))); } else { taskdata = new [] { Program.DataConnection.PrepareBackupForExport(data.Backup) } }; using (var fs = System.IO.File.OpenWrite(tempfile)) using (var sw = new System.IO.StreamWriter(fs, System.Text.Encoding.UTF8)) Serializer.SerializeJson(sw, taskdata, true); tempfile.Protected = true; string controlfiles = null; options.TryGetValue("control-files", out controlfiles); if (string.IsNullOrWhiteSpace(controlfiles)) { controlfiles = tempfile; } else { controlfiles += System.IO.Path.PathSeparator + tempfile; } options["control-files"] = controlfiles; } } } using (tempfolder) using (var controller = new Duplicati.Library.Main.Controller(backup.TargetURL, options, sink)) { try { if (options.ContainsKey("throttle-upload")) { ((RunnerData)data).OriginalUploadSpeed = Duplicati.Library.Utility.Sizeparser.ParseSize(options["throttle-upload"], "kb"); } } catch { } try { if (options.ContainsKey("throttle-download")) { ((RunnerData)data).OriginalDownloadSpeed = Duplicati.Library.Utility.Sizeparser.ParseSize(options["throttle-download"], "kb"); } } catch { } ((RunnerData)data).Controller = controller; data.UpdateThrottleSpeed(); switch (data.Operation) { case DuplicatiOperation.Backup: { var filter = ApplyFilter(backup, data.Operation, GetCommonFilter(backup, data.Operation)); var sources = (from n in backup.Sources let p = SpecialFolders.ExpandEnvironmentVariables(n) where !string.IsNullOrWhiteSpace(p) select p).ToArray(); var r = controller.Backup(sources, filter); UpdateMetadata(backup, r); return(r); } case DuplicatiOperation.List: { var r = controller.List(data.FilterStrings); UpdateMetadata(backup, r); return(r); } case DuplicatiOperation.Repair: { var r = controller.Repair(data.FilterStrings == null ? null : new Library.Utility.FilterExpression(data.FilterStrings)); UpdateMetadata(backup, r); return(r); } case DuplicatiOperation.RepairUpdate: { var r = controller.UpdateDatabaseWithVersions(); UpdateMetadata(backup, r); return(r); } case DuplicatiOperation.Remove: { var r = controller.Delete(); UpdateMetadata(backup, r); return(r); } case DuplicatiOperation.Restore: { var r = controller.Restore(data.FilterStrings); UpdateMetadata(backup, r); return(r); } case DuplicatiOperation.Verify: { var r = controller.Test(); UpdateMetadata(backup, r); return(r); } case DuplicatiOperation.Compact: { var r = controller.Compact(); UpdateMetadata(backup, r); return(r); } case DuplicatiOperation.CreateReport: { using (var tf = new Duplicati.Library.Utility.TempFile()) { var r = controller.CreateLogDatabase(tf); var tempid = Program.DataConnection.RegisterTempFile("create-bug-report", r.TargetPath, DateTime.Now.AddDays(3)); if (string.Equals(tf, r.TargetPath, Library.Utility.Utility.ClientFilenameStringComparision)) { tf.Protected = true; } Program.DataConnection.RegisterNotification( NotificationType.Information, "Bugreport ready", "Bugreport is ready for download", null, null, "bug-report:created:" + tempid, (n, a) => n ); return(r); } } case DuplicatiOperation.ListRemote: { var r = controller.ListRemote(); UpdateMetadata(backup, r); return(r); } case DuplicatiOperation.Delete: { if (Library.Utility.Utility.ParseBoolOption(data.ExtraOptions, "delete-remote-files")) { controller.DeleteAllRemoteFiles(); } if (Library.Utility.Utility.ParseBoolOption(data.ExtraOptions, "delete-local-db")) { string dbpath; options.TryGetValue("db-path", out dbpath); if (!string.IsNullOrWhiteSpace(dbpath) && System.IO.File.Exists(dbpath)) { System.IO.File.Delete(dbpath); } } Program.DataConnection.DeleteBackup(backup); Program.Scheduler.Reschedule(); return(null); } case DuplicatiOperation.Vacuum: { var r = controller.Vacuum(); UpdateMetadata(backup, r); return(r); } default: //TODO: Log this return(null); } } } catch (Exception ex) { Program.DataConnection.LogError(data.Backup.ID, string.Format("Failed while executing \"{0}\" with id: {1}", data.Operation, data.Backup.ID), ex); UpdateMetadataError(data.Backup, ex); Library.UsageReporter.Reporter.Report(ex); if (!fromQueue) { throw; } return(null); } finally { ((RunnerData)data).Controller = null; } }