Ejemplo n.º 1
0
        public static IRunnerData CreateRestoreTask(Duplicati.Server.Serialization.Interface.IBackup backup, string[] filters, DateTime time, string restoreTarget, bool overwrite, bool restore_permissions, bool skip_metadata)
        {
            var dict = new Dictionary <string, string>();

            dict["time"] = Duplicati.Library.Utility.Utility.SerializeDateTime(time.ToUniversalTime());
            if (!string.IsNullOrWhiteSpace(restoreTarget))
            {
                dict["restore-path"] = SpecialFolders.ExpandEnvironmentVariables(restoreTarget);
            }
            if (overwrite)
            {
                dict["overwrite"] = "true";
            }
            if (restore_permissions)
            {
                dict["restore-permissions"] = "true";
            }
            if (skip_metadata)
            {
                dict["skip-metadata"] = "true";
            }

            return(CreateTask(
                       DuplicatiOperation.Restore,
                       backup,
                       dict,
                       filters));
        }
Ejemplo n.º 2
0
        public static IRunnerData CreateRestoreTask(Duplicati.Server.Serialization.Interface.IBackup backup, string[] filters,
                                                    DateTime time, string restoreTarget, bool overwrite, bool restore_permissions,
                                                    bool skip_metadata, string passphrase)
        {
            var dict = new Dictionary <string, string>
            {
                ["time"]                    = Library.Utility.Utility.SerializeDateTime(time.ToUniversalTime()),
                ["overwrite"]               = overwrite? Boolean.TrueString : Boolean.FalseString,
                ["restore-permissions"]     = restore_permissions ? Boolean.TrueString : Boolean.FalseString,
                ["skip-metadata"]           = skip_metadata ? Boolean.TrueString : Boolean.FalseString,
                ["allow-passphrase-change"] = Boolean.TrueString
            };

            if (!string.IsNullOrWhiteSpace(restoreTarget))
            {
                dict["restore-path"] = SpecialFolders.ExpandEnvironmentVariables(restoreTarget);
            }
            if (!(passphrase is null))
            {
                dict["passphrase"] = passphrase;
            }

            return(CreateTask(
                       DuplicatiOperation.Restore,
                       backup,
                       dict,
                       filters));
        }
Ejemplo n.º 3
0
        private static Library.Utility.IFilter ApplyFilter(Serialization.Interface.IBackup backup, DuplicatiOperation mode, Library.Utility.IFilter filter, IEnumerable <Library.Utility.IFilter> defaultFilters)
        {
            var f2 = backup.Filters;

            if (f2 != null && f2.Length > 0)
            {
                var nf =
                    (from n in f2
                     let exp =
                         n.Expression.StartsWith("[", StringComparison.Ordinal) && n.Expression.EndsWith("]", StringComparison.Ordinal)
                        ? SpecialFolders.ExpandEnvironmentVariablesRegexp(n.Expression)
                        : SpecialFolders.ExpandEnvironmentVariables(n.Expression)
                         orderby n.Order
                         select(Library.Utility.IFilter)(new Library.Utility.FilterExpression(exp, n.Include)))
                    .Aggregate((a, b) => Library.Utility.FilterExpression.Combine(a, b));

                filter = Library.Utility.FilterExpression.Combine(filter, nf);
            }

            if (defaultFilters != null && defaultFilters.Any())
            {
                filter = Library.Utility.FilterExpression.Combine(filter, defaultFilters.Aggregate((a, b) => Library.Utility.FilterExpression.Combine(a, b)));
            }

            return(filter);
        }
        internal static Dictionary <string, string> GetSourceNames(Serialization.Interface.IBackup backup)
        {
            var systemIO = Duplicati.Library.Snapshots.SnapshotUtility.SystemIO;

            if (backup.Sources == null || backup.Sources.Length == 0)
            {
                return(new Dictionary <string, string>());
            }

            var sources = backup.Sources.Distinct().Select(x =>
            {
                var sp = SpecialFolders.TranslateToDisplayString(x);
                if (sp != null)
                {
                    return(new KeyValuePair <string, string>(x, sp));
                }

                x = SpecialFolders.ExpandEnvironmentVariables(x);
                try
                {
                    var nx = x;
                    if (nx.EndsWith(System.IO.Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal))
                    {
                        nx = nx.Substring(0, nx.Length - 1);
                    }
                    var n = systemIO.PathGetFileName(nx);
                    if (!string.IsNullOrWhiteSpace(n))
                    {
                        return(new KeyValuePair <string, string>(x, n));
                    }
                }
                catch
                {
                }

                if (x.EndsWith(System.IO.Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal) && x.Length > 1)
                {
                    return(new KeyValuePair <string, string>(x, x.Substring(0, x.Length - 1).Substring(x.Substring(0, x.Length - 1).LastIndexOf("/", StringComparison.Ordinal) + 1)));
                }
                else
                {
                    return(new KeyValuePair <string, string>(x, x));
                }
            });

            // Handle duplicates
            var result = new Dictionary <string, string>();

            foreach (var x in sources)
            {
                result[x.Key] = x.Value;
            }

            return(result);
        }
Ejemplo n.º 5
0
        public static string[] GetCommandLineParts(IRunnerData data)
        {
            var backup = data.Backup;

            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;
                }
            }

            var cf = Program.DataConnection.Filters;
            var bf = backup.Filters;

            var sources =
                (from n in backup.Sources
                 let p = SpecialFolders.ExpandEnvironmentVariables(n)
                         where !string.IsNullOrWhiteSpace(p)
                         select p).ToArray();

            var parts = new List <string>
            {
                backup.TargetURL
            };

            parts.AddRange(sources);

            foreach (var opt in options)
            {
                parts.Add(string.Format("--{0}={1}", opt.Key, opt.Value));
            }

            if (cf != null)
            {
                foreach (var f in cf)
                {
                    parts.Add(string.Format("--{0}={1}", f.Include ? "include" : "exclude", f.Expression));
                }
            }

            if (bf != null)
            {
                foreach (var f in bf)
                {
                    parts.Add(string.Format("--{0}={1}", f.Include ? "include" : "exclude", f.Expression));
                }
            }

            return(parts.ToArray());
        }
Ejemplo n.º 6
0
        private static Duplicati.Library.Utility.IFilter ApplyFilter(Duplicati.Server.Serialization.Interface.IBackup backup, DuplicatiOperation mode, Duplicati.Library.Utility.IFilter filter)
        {
            var f2 = backup.Filters;

            if (f2 != null && f2.Length > 0)
            {
                var nf =
                    (from n in f2
                     let exp =
                         n.Expression.StartsWith("[") && n.Expression.EndsWith("]")
                        ? SpecialFolders.ExpandEnvironmentVariablesRegexp(n.Expression)
                        : SpecialFolders.ExpandEnvironmentVariables(n.Expression)
                         orderby n.Order
                         select(Duplicati.Library.Utility.IFilter)(new Duplicati.Library.Utility.FilterExpression(exp, n.Include)))
                    .Aggregate((a, b) => Duplicati.Library.Utility.FilterExpression.Combine(a, b));

                return(Duplicati.Library.Utility.FilterExpression.Combine(filter, nf));
            }
            else
            {
                return(filter);
            }
        }
Ejemplo n.º 7
0
        internal static Dictionary <string, string> GetSourceNames(Serialization.Interface.IBackup backup)
        {
            var systemIO = Duplicati.Library.Snapshots.SnapshotUtility.SystemIO;

            return(backup.Sources.Distinct().Select(x => {
                var sp = SpecialFolders.TranslateToDisplayString(x);
                if (sp != null)
                {
                    return new KeyValuePair <string, string>(x, sp);
                }

                x = SpecialFolders.ExpandEnvironmentVariables(x);
                try {
                    var nx = x;
                    if (nx.EndsWith(System.IO.Path.DirectorySeparatorChar.ToString()))
                    {
                        nx = nx.Substring(0, nx.Length - 1);
                    }
                    var n = systemIO.PathGetFileName(nx);
                    if (!string.IsNullOrWhiteSpace(n))
                    {
                        return new KeyValuePair <string, string>(x, n);
                    }
                } catch {
                }

                if (x.EndsWith(System.IO.Path.DirectorySeparatorChar.ToString()) && x.Length > 1)
                {
                    return new KeyValuePair <string, string>(x, x.Substring(0, x.Length - 1).Substring(x.Substring(0, x.Length - 1).LastIndexOf("/") + 1));
                }
                else
                {
                    return new KeyValuePair <string, string>(x, x);
                }
            }).ToDictionary(x => x.Key, x => x.Value));
        }
Ejemplo n.º 8
0
        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.InvariantCultureIgnoreCase) || string.Equals(options["store-task-config"], "*", StringComparison.InvariantCultureIgnoreCase);
                    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))
                    {
                        ((RunnerData)data).Controller = controller;

                        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);
                        }

                        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;
            }
        }
Ejemplo n.º 9
0
        public static string GetCommandLine(IRunnerData data)
        {
            var backup = data.Backup;

            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;
                }
            }

            var cf = Program.DataConnection.Filters;
            var bf = backup.Filters;

            var sources =
                (from n in backup.Sources
                 let p = SpecialFolders.ExpandEnvironmentVariables(n)
                         where !string.IsNullOrWhiteSpace(p)
                         select p).ToArray();

            var cmd = new System.Text.StringBuilder();

            var exe =
                System.IO.Path.Combine(
                    Library.AutoUpdater.UpdaterManager.InstalledBaseDir,
                    System.IO.Path.GetFileName(
                        typeof(Duplicati.CommandLine.Commands).Assembly.Location
                        )
                    );

            Func <string, string> commandLineEscapeValue = x =>
            {
                if (string.IsNullOrWhiteSpace(x))
                {
                    return(x);
                }

                if (x.EndsWith("\\", StringComparison.Ordinal))
                {
                    x += "\\";
                }

                x = x.Replace("\"", Library.Utility.Utility.IsClientWindows ? "\"\"" : "\\\"");

                return("\"" + x + "\"");
            };

            exe = commandLineEscapeValue(exe);

            if (Library.Utility.Utility.IsMono)
            {
                exe = "mono " + exe;
            }


            cmd.Append(exe);
            cmd.Append(" backup");
            cmd.Append(" ");
            cmd.Append(commandLineEscapeValue(backup.TargetURL));
            cmd.Append(" ");
            cmd.Append(string.Join(" ", sources.Select(x => commandLineEscapeValue(x))));

            foreach (var opt in options)
            {
                cmd.AppendFormat(" --{0}={1}", opt.Key, commandLineEscapeValue(opt.Value));
            }

            if (cf != null)
            {
                foreach (var f in cf)
                {
                    cmd.AppendFormat(" --{0}={1}", f.Include ? "include" : "exclude", commandLineEscapeValue(f.Expression));
                }
            }

            if (bf != null)
            {
                foreach (var f in bf)
                {
                    cmd.AppendFormat(" --{0}={1}", f.Include ? "include" : "exclude", commandLineEscapeValue(f.Expression));
                }
            }

            return(cmd.ToString());
        }
Ejemplo n.º 10
0
        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;
            }
        }
Ejemplo n.º 11
0
        public static string GetCommandLine(IRunnerData data)
        {
            var backup = data.Backup;

            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;
                }
            }

            var cf = Program.DataConnection.Filters;
            var bf = backup.Filters;

            var sources =
                (from n in backup.Sources
                 let p = SpecialFolders.ExpandEnvironmentVariables(n)
                         where !string.IsNullOrWhiteSpace(p)
                         select p).ToArray();

            var exe =
                System.IO.Path.Combine(
                    Library.AutoUpdater.UpdaterManager.InstalledBaseDir,
                    System.IO.Path.GetFileName(
                        typeof(Duplicati.CommandLine.Commands).Assembly.Location
                        )
                    );

            var cmd = new System.Text.StringBuilder();

            if (Library.Utility.Utility.IsMono)
            {
                cmd.Append("mono ");
            }

            cmd.Append(Library.Utility.Utility.WrapAsCommandLine(new string[] { exe, "backup", backup.TargetURL }, false));

            cmd.Append(" ");
            cmd.Append(Library.Utility.Utility.WrapAsCommandLine(sources, true));

            // TODO: We should check each option to see if it is a path, and allow expansion on that
            foreach (var opt in options)
            {
                cmd.AppendFormat(" --{0}={1}", opt.Key, Library.Utility.Utility.WrapCommandLineElement(opt.Value, false));
            }

            if (cf != null)
            {
                foreach (var f in cf)
                {
                    cmd.AppendFormat(" --{0}={1}", f.Include ? "include" : "exclude", Library.Utility.Utility.WrapCommandLineElement(f.Expression, true));
                }
            }

            if (bf != null)
            {
                foreach (var f in bf)
                {
                    cmd.AppendFormat(" --{0}={1}", f.Include ? "include" : "exclude", Library.Utility.Utility.WrapCommandLineElement(f.Expression, true));
                }
            }

            return(cmd.ToString());
        }
Ejemplo n.º 12
0
        public static Duplicati.Library.Interface.IBasicResults Run(IRunnerData data, bool fromQueue)
        {
            var backup = data.Backup;

            try
            {
                var options = ApplyOptions(backup, data.Operation, GetCommonOptions(backup, data.Operation));
                var sink    = new MessageSink(data.TaskID, backup.ID);
                if (fromQueue)
                {
                    Program.GenerateProgressState = () => sink.Copy();
                    Program.StatusEventNotifyer.SignalNewEvent();
                }

                if (data.ExtraOptions != null)
                {
                    foreach (var k in data.ExtraOptions)
                    {
                        options[k.Key] = k.Value;
                    }
                }

                if (options.ContainsKey("log-file"))
                {
                    var file = options["log-file"];

                    string o;
                    Library.Logging.LogMessageType level;
                    options.TryGetValue("log-level", out o);
                    Enum.TryParse <Library.Logging.LogMessageType>(o, true, out level);

                    options.Remove("log-file");
                    options.Remove("log-level");

                    Program.LogHandler.SetOperationFile(file, level);
                }

                using (var controller = new Duplicati.Library.Main.Controller(backup.TargetURL, options, sink))
                {
                    ((RunnerData)data).Controller = controller;

                    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();
                        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.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);
                        }
                    }

                    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);

                if (!fromQueue)
                {
                    throw;
                }

                return(null);
            }
            finally
            {
                ((RunnerData)data).Controller = null;
                Program.LogHandler.RemoveOperationFile();
            }
        }
Ejemplo n.º 13
0
        public static string GetCommandLine(IRunnerData data)
        {
            var backup = data.Backup;

            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;
                }
            }

            var cf = Program.DataConnection.Filters;
            var bf = backup.Filters;

            var sources =
                (from n in backup.Sources
                 let p = SpecialFolders.ExpandEnvironmentVariables(n)
                         where !string.IsNullOrWhiteSpace(p)
                         select p).ToArray();

            var cmd = new System.Text.StringBuilder();

            var exe =
                System.IO.Path.Combine(
                    Library.AutoUpdater.UpdaterManager.InstalledBaseDir,
                    System.IO.Path.GetFileName(
                        typeof(Duplicati.CommandLine.Commands).Assembly.Location
                        )
                    );

            if (Library.Utility.Utility.IsMono)
            {
                exe = "mono " + exe;
            }

            cmd.Append(exe);
            cmd.Append(" backup ");
            cmd.AppendFormat("\"{0}\"", backup.TargetURL);
            cmd.Append("\"" + string.Join("\", \"", sources) + "\"");

            foreach (var opt in options)
            {
                cmd.AppendFormat(" --{0}={1}", opt.Key, string.IsNullOrWhiteSpace(opt.Value) ? "" : "\"" + opt.Value + "\"");
            }

            if (cf != null)
            {
                foreach (var f in cf)
                {
                    cmd.AppendFormat("--{0}=\"{1}\"", f.Include ? "include" : "exclude", f.Expression);
                }
            }

            if (bf != null)
            {
                foreach (var f in cf)
                {
                    cmd.AppendFormat("--{0}=\"{1}\"", f.Include ? "include" : "exclude", f.Expression);
                }
            }

            return(cmd.ToString());
        }