コード例 #1
0
        private static int ParseCommandLine(TextWriter outwriter, Action <Library.Main.Controller> setup, ref bool verboseErrors, string[] args)
        {
            List <string> cargs = new List <string>(args);

            var tmpparsed = Library.Utility.FilterCollector.ExtractOptions(cargs);
            var options   = tmpparsed.Item1;
            var filter    = tmpparsed.Item2;

            verboseErrors = Library.Utility.Utility.ParseBoolOption(options, "debug-output");

            if (cargs.Count == 1 && string.Equals(cargs[0], "changelog", StringComparison.OrdinalIgnoreCase))
            {
                return(ShowChangeLog(outwriter));
            }

            foreach (string internaloption in Library.Main.Options.InternalOptions)
            {
                if (options.ContainsKey(internaloption))
                {
                    outwriter.WriteLine(Strings.Program.InternalOptionUsedError(internaloption));
                    return(200);
                }
            }

            // Probe for "help" to avoid extra processing
            if (cargs.Count == 0 || (string.Equals(cargs[0], "help", StringComparison.OrdinalIgnoreCase)))
            {
                return(Commands.Help(outwriter, setup, cargs, options, filter));
            }

            // try and parse all parameter file aliases
            foreach (string parameterOption in new [] { "parameters-file", "parameters-file", "parameterfile" })
            {
                if (options.ContainsKey(parameterOption) && !string.IsNullOrEmpty(options[parameterOption]))
                {
                    string filename = options[parameterOption];
                    options.Remove(parameterOption);
                    if (!ReadOptionsFromFile(outwriter, filename, ref filter, cargs, options))
                    {
                        return(100);
                    }
                    break;
                }
            }

            if (!options.ContainsKey("passphrase"))
            {
                if (!string.IsNullOrEmpty(System.Environment.GetEnvironmentVariable("PASSPHRASE")))
                {
                    options["passphrase"] = System.Environment.GetEnvironmentVariable("PASSPHRASE");
                }
            }

            if (!options.ContainsKey("auth-password"))
            {
                if (!string.IsNullOrEmpty(System.Environment.GetEnvironmentVariable("AUTH_PASSWORD")))
                {
                    options["auth-password"] = System.Environment.GetEnvironmentVariable("AUTH_PASSWORD");
                }
            }

            if (!options.ContainsKey("auth-username"))
            {
                if (!string.IsNullOrEmpty(System.Environment.GetEnvironmentVariable("AUTH_USERNAME")))
                {
                    options["auth-username"] = System.Environment.GetEnvironmentVariable("AUTH_USERNAME");
                }
            }

            var showDeletionErrors = verboseErrors;

            Duplicati.Library.Utility.TempFile.RemoveOldApplicationTempFiles((path, ex) =>
            {
                if (showDeletionErrors)
                {
                    outwriter.WriteLine(string.Format("Failed to delete temp file: {0}", path));
                }
            });

            string command = cargs[0];

            cargs.RemoveAt(0);

            if (CommandMap.ContainsKey(command))
            {
                var autoupdate = Library.Utility.Utility.ParseBoolOption(options, "auto-update");
                options.Remove("auto-update");

                var res = CommandMap[command](outwriter, setup, cargs, options, filter);

                if (autoupdate && FROM_COMMANDLINE)
                {
                    CheckForUpdates(outwriter);
                }

                return(res);
            }
            else
            {
                Commands.PrintInvalidCommand(outwriter, command, cargs);
                return(200);
            }
        }