Beispiel #1
0
        internal void Start(string[] args)
        {
            var programArgs = new ProgramArguments(args);

            if (programArgs.Flags.ContainsKey("help"))
            {
                Console.WriteLine("usage: {0} [options]", System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
                Console.WriteLine("TODO: documentation");
                return;
            }

            ProcessArguments(programArgs);

            #if DEBUG
            Trace.Listeners.Add(new ConsoleTraceListener());
            #endif

            Run();
        }
Beispiel #2
0
        private void ProcessArguments(ProgramArguments args)
        {
            _args = args;

            var fooOptions = new Options();

            if (_args.Flags.ContainsKey("casesensitive"))
            {
                fooOptions.CaseInsensitive = _args.Flags["casesensitive"];
            }
            else
            {
                //
                // default to case-sensitive on Unix
                //
                fooOptions.CaseInsensitive = !(Environment.OSVersion.Platform == PlatformID.Unix);
            }

            _listenPort = DefaultPort;
            if (_args.Options.ContainsKey("port"))
            {
                try
                {
                    _listenPort = int.Parse(_args.Options["port"]);
                }
                catch (FormatException)
                {
                    // keep default port
                }
            }

            var configPath = DefaultConfig;
            if (_args.Options.ContainsKey("config"))
            {
                configPath = _args.Options["config"];
            }

            try
            {
                string err = string.Empty;
                _config = ServerRepositoryConfigLoader.GetConfig(configPath, out err);

                if (_config == null)
                {
                    Trace.TraceError("Error loading FooSync daemon config: {0}", err);
                    throw new Exception(string.Format("Error loading FooSync daemon config: {0}", err));
                }
            }
            catch (Exception ex)
            {
                Trace.TraceError("Error loading FooSync daemon config: {0}: {1}{2}", ex.GetType().Name, ex.Message, ex.StackTrace);
                throw;
            }

            _exceptions = new Dictionary<string, ICollection<string>>();

            foreach (var repo in _config.Repositories)
            {
                _exceptions.Add(repo.Key, FooSyncEngine.PrepareExceptions(repo.Value.IgnorePatterns));
            }

            _foo = new FooSyncEngine(fooOptions);
        }
Beispiel #3
0
        string CommandLineGetMode(ProgramArguments args, string defaultMode)
        {
            string mode = null;
            IQueryable<string> modes = MODES.AsQueryable<string>();

            foreach (string flag in args.Flags.Keys)
            {
                if (modes.Contains(flag))
                {
                    if (mode != null)
                    {
                        return null;
                    }

                    mode = flag;
                }
            }

            return mode ?? defaultMode;
        }
Beispiel #4
0
        void Run(ProgramArguments args)
        {
            string mode = CommandLineGetMode(args, "sync");

            switch (mode)
            {
                case null:
                    Console.WriteLine("usage: {0} <command>", ProgramName);
                    Console.WriteLine("where <command> is one of: {0}", string.Join(", ", MODES));
                    break;

                case "create":
                    {
                        if (args.Ordinals.Count != 2)
                        {
                            Console.WriteLine("usage: {0} --create <sync group name> <filename>.fsg", ProgramName);
                            return;
                        }

                        CreateSyncGroup(args.Ordinals[0], args.Ordinals[1]);
                    }
                    break;

                case "add":
                    {
                        if (args.Ordinals.Count != 2)
                        {
                            Console.WriteLine("usage: {0} --add <filename>.fsg <url/path>", ProgramName);
                            return;
                        }

                        SyncGroupConfig syncGroup = LoadSyncGroupConfig(args.Ordinals[0]);
                        SyncGroupConfigMember newMember = new SyncGroupConfigMember();

                        FooSyncUrl newUrl = NormalizePath(args.Ordinals[1]);
                        if (newUrl == null)
                        {
                            Console.WriteLine("Invalid path or URL \"{0}\"", args.Ordinals[1]);
                            return;
                        }

                        newMember.UrlString = newUrl.ToString();
                        if (newUrl.IsLocal)
                        {
                            newMember.Host = Environment.MachineName;
                        }

                        if (!newMember.UrlString.Equals(args.Ordinals[1]))
                        {
                            Console.WriteLine("Path or URL {0} interpreted as {1}", args.Ordinals[1], newMember.UrlString);
                        }

                        foreach (SyncGroupConfigMember existingMember in syncGroup.Members)
                        {
                            try
                            {
                                if (existingMember.Url.Equals(newUrl, Foo.Options.CaseInsensitive)
                                        && existingMember.Host.Equals(newMember.Host, StringComparison.OrdinalIgnoreCase)
                                        && !string.IsNullOrEmpty(newMember.Host))
                                {
                                    Console.WriteLine("{0} is already a member of that sync group. Aborting.",
                                        newMember.UrlString);
                                    return;
                                }
                            }
                            catch (FormatException)
                            {
                            }
                        }

                        if (args.Options.ContainsKey("user"))
                        {
                            newMember.Auth = new SyncGroupConfigMemberAuth();
                            newMember.Auth.User = args.Options["user"];

                            if (args.Options.ContainsKey("pass"))
                            {
                                newMember.Auth.Password = args.Options["pass"];
                            }

                            //TODO: option for prompting at console
                        }

                        syncGroup.Members.Add(newMember);
                        XmlConfigLoader.Write(syncGroup, args.Ordinals[0]);

                        Console.WriteLine("Added {0} to sync group \"{1}\"",newMember.UrlString, syncGroup.Name);
                    }
                    break;

                case "rm":
                    {
                        if (args.Ordinals.Count != 2)
                        {
                            Console.WriteLine("usage: {0} --rm <filename>.fsg <url/path>", ProgramName);
                            return;
                        }

                        SyncGroupConfig syncGroup = LoadSyncGroupConfig(args.Ordinals[0]);

                        FooSyncUrl rmUrl = NormalizePath(args.Ordinals[1]);
                        if (rmUrl == null)
                        {
                            Console.WriteLine("Invalid path or URL \"{0}\"", args.Ordinals[1]);
                            return;
                        }

                        if (!args.Ordinals[1].Equals(rmUrl.ToString()))
                        {
                            Console.WriteLine("Path or URL {0} interpreted as {1}", args.Ordinals[1], rmUrl.ToString());
                        }

                        SyncGroupConfigMember rmMember = null;
                        foreach (SyncGroupConfigMember member in syncGroup.Members)
                        {
                            if (member.Url.Equals(rmUrl, Foo.Options.CaseInsensitive)
                                && !string.IsNullOrEmpty(member.Host)
                                && member.Host.Equals(Environment.MachineName))
                            {
                                rmMember = member;
                                break;
                            }
                        }

                        if (rmMember != null)
                        {
                            syncGroup.Members.Remove(rmMember);
                        }
                        else
                        {
                            Console.WriteLine("Sync group member {0} not found.", rmUrl.ToString());
                            return;
                        }

                        XmlConfigLoader.Write(syncGroup, args.Ordinals[0]);

                        Console.WriteLine("Removed {0} from sync group \"{1}\"", rmMember.UrlString, syncGroup.Name);
                    }
                    break;

                case "sync":
                    {
                        if (args.Ordinals.Count != 1)
                        {
                            Console.WriteLine("usage: {0} --sync <filename>.fsg", ProgramName);
                            return;
                        }

                        SyncGroupConfig syncGroup = LoadSyncGroupConfig(args.Ordinals[0]);

                        Console.WriteLine("Syncing sync group \"{0}\" with {1} members.",
                            syncGroup.Name,
                            syncGroup.Members.Count);

                        Sync(syncGroup);

                        Console.WriteLine("Done syncing \"{0}\".", syncGroup.Name);
                    }
                    break;
            }
        }
Beispiel #5
0
        static void Main(string[] args)
        {
            var programArgs = new ProgramArguments(args);
            var fooOptions = new Options();

            if (programArgs.Flags.ContainsKey("casesensitive"))
            {
                fooOptions.CaseInsensitive = !programArgs.Flags["casesensitive"];
            }

            var foo = new FooSyncEngine(fooOptions);

            Console.WriteLine("FooSync.ConsoleApp v{0} / FooSync v{1}",
                System.Reflection.Assembly.GetExecutingAssembly().GetName().Version,
                foo.GetType().Assembly.GetName().Version.ToString());

            Console.WriteLine("{0} / {1} / {2}",
                Environment.MachineName,
                Environment.OSVersion.Platform,
                Environment.OSVersion.VersionString);
            if (Type.GetType("Mono.Runtime") != null)
            {
                Console.WriteLine("Using the Mono runtime.");
            }
            Console.WriteLine();

            if (programArgs.Flags.ContainsKey("help"))
            {
                Console.WriteLine("usage: {0} [options]", ProgramName);
                //TODO
                return;
            }

            var program = new Program(foo);
            program.Run(programArgs);
        }