예제 #1
0
파일: Program.cs 프로젝트: skreddy6673/cafe
        public static int Main(string[] args)
        {
            Directory.SetCurrentDirectory(AssemblyDirectory);
            LoggingInitializer.ConfigureLogging(args);
            const string application = "cafe.Updater";

            var processExecutor = new ProcessExecutor(() => new ProcessBoundary());

            IWin32Service ServiceFactory() => new CafeUpdaterWindowsService(new CafeInstaller(
                                                                                new FileSystemCommandsBoundary(), processExecutor,
                                                                                UpdaterSettings.Instance.CafeApplicationDirectory));

            var runner = new OptionGroup()
                         .WithGroup("server", serverGroup =>
            {
                serverGroup.WithDefaultOption(new ServerInteractiveOption(application, ServiceFactory));
                serverGroup.WithOption(new ServerWindowsServiceOption(application, ServiceFactory),
                                       "--run-as-service");
            })
                         .WithGroup("service",
                                    serviceGroup =>
            {
                var fileSystem          = new FileSystem(new EnvironmentBoundary(), new FileSystemCommandsBoundary());
                var serviceStatusWaiter = new ServiceStatusWaiter("waiting for service status",
                                                                  new AutoResetEventBoundary(), new TimerFactory(),
                                                                  new ServiceStatusProvider(processExecutor,
                                                                                            fileSystem), application);
                ServiceOptionInitializer.AddServiceOptionsTo(serviceGroup, serviceStatusWaiter, processExecutor,
                                                             fileSystem, application, "cafe Updater", "updates cafe");
            })
                         .WithOption(new WaitForInstallOption(new FileSystemCommandsBoundary()), OptionValueSpecification.ForCommand("wait"),
                                     OptionValueSpecification.ForValue("installer:", "the name of the installer file that should be processed by the updater"));


            var arguments = runner.ParseArguments(args);

            if (arguments != null)
            {
                var returnValue = runner.RunProgram(arguments);
                Logger.Debug($"Finishing {application} run");
                return(returnValue);
            }
            else
            {
                Presenter.ShowError(
                    $"No options match the supplied arguments. Run {application} help to view all options",
                    Logger);
                return(-2);
            }
        }
예제 #2
0
파일: Program.cs 프로젝트: skreddy6673/cafe
        public static OptionGroup CreateRootGroup(IClientFactory clientFactory, ISchedulerWaiter schedulerWaiter,
                                                  IFileSystemCommands fileSystemCommands, ProcessExecutor processExecutor, IFileSystem fileSystem,
                                                  ServiceStatusWaiter serviceStatusWaiter, IEnvironment environment)
        {
            var root = new OptionGroup()
                       .WithGroup("chef", chefGroup =>
            {
                const string chefProduct = "Chef";
                Func <IChefServer> restClientForChefServerFactory = clientFactory.RestClientForChefServer;
                chefGroup.WithOption(new RunChefOption(restClientForChefServerFactory, schedulerWaiter),
                                     OptionValueSpecification.ForCommand("run"), OnNode());
                chefGroup.WithOption(
                    new DownloadProductOption <IChefServer, ChefStatus>(chefProduct,
                                                                        restClientForChefServerFactory,
                                                                        schedulerWaiter),
                    CreateDownloadVersionSpecifications());
                chefGroup.WithOption(new ShowChefStatusOption(restClientForChefServerFactory),
                                     OptionValueSpecification.ForCommand("status"), OnNode());
                chefGroup.WithOption(
                    new BootstrapChefRunListOption(restClientForChefServerFactory, schedulerWaiter,
                                                   fileSystemCommands),
                    OptionValueSpecification.ForCommand("bootstrap"),
                    OptionValueSpecification.ForValue("run-list:", "the run list"),
                    OptionValueSpecification.ForValue("config:", "the client.rb file"),
                    OptionValueSpecification.ForValue("validator:", "the validator.pem file used to join the node"),
                    OnNode());
                chefGroup.WithOption(
                    new BootstrapChefPolicyOption(restClientForChefServerFactory, schedulerWaiter,
                                                  fileSystemCommands),
                    OptionValueSpecification.ForCommand("bootstrap"),
                    OptionValueSpecification.ForValue("policy:", "the policy name"),
                    OptionValueSpecification.ForValue("group:", "the policy group"),
                    OptionValueSpecification.ForValue("config:", "the client.rb file"),
                    OptionValueSpecification.ForValue("validator:", "the validator.pem file used to join the node"),
                    OnNode());
                var installChefOption =
                    new InstallOption <IChefServer, ChefStatus>(chefProduct, restClientForChefServerFactory,
                                                                schedulerWaiter);
                chefGroup.WithOption(installChefOption, CreateInstallVersionSpecifications());
                chefGroup.WithOption(installChefOption, OptionValueSpecification.ForCommand("upgrade"),
                                     OptionValueSpecification.ForVersion(), OnNode(), ReturnImmediatelyOrDelayed());
                chefGroup.WithOption(
                    ChangeChefRunningStatusOption.CreatePauseChefOption(restClientForChefServerFactory),
                    OptionValueSpecification.ForCommand("pause"), OnNode());
                chefGroup.WithOption(
                    ChangeChefRunningStatusOption.CreateResumeChefOption(restClientForChefServerFactory),
                    OptionValueSpecification.ForCommand("resume"), OnNode());
                chefGroup.WithOption(
                    new CheckProductVersionOption("chef", clientFactory.GenericRestClientForChefServer),
                    OptionValueSpecification.ForCommand("version?"),
                    OptionValueSpecification.ForVersion(), OnNode());
            })
                       .WithGroup("inspec", inspecGroup =>
            {
                const string inspecProduct = "inspec";
                Func <IProductServer <ProductStatus> > productServerFactory = clientFactory.RestClientForInspecServer;
                AddProductOptionsTo(inspecGroup, inspecProduct, productServerFactory, schedulerWaiter);
            })
                       .WithGroup("server", serverGroup =>
            {
                const string application            = "cafe";
                Func <IWin32Service> serviceCreator = () => new CafeServerWindowsService();
                serverGroup.WithDefaultOption(new ServerInteractiveOption(application, serviceCreator));
                serverGroup.WithOption(new ServerWindowsServiceOption(application, serviceCreator),
                                       "--run-as-service");
            })
                       .WithGroup("service",
                                  serviceGroup =>
            {
                ServiceOptionInitializer.AddServiceOptionsTo(serviceGroup, serviceStatusWaiter, processExecutor,
                                                             fileSystem, CafeServerWindowsServiceOptions.ServiceName,
                                                             CafeServerWindowsServiceOptions.ServiceDisplayName,
                                                             CafeServerWindowsServiceOptions.ServiceDescription);
            })
                       .WithGroup("job", statusGroup =>
            {
                var statusOption = new StatusOption(clientFactory.RestClientForJobServer);
                statusGroup.WithDefaultOption(statusOption);
                statusGroup.WithOption(statusOption, OptionValueSpecification.ForCommand("status"),
                                       OnNode());
                statusGroup.WithOption(new JobRunStatusOption(clientFactory.RestClientForJobServer),
                                       OptionValueSpecification.ForCommand("status"),
                                       OptionValueSpecification.ForValue("id:", "job run id"),
                                       OnNode());
            })
                       .WithOption(new InitOption(AssemblyDirectory, environment), "init");

            AddProductOptionsTo(root, "cafe", clientFactory.RestClientForCafeProductServer, schedulerWaiter);

            var helpOption = new HelpOption(root);

            root.WithOption(helpOption, "help");
            root.WithDefaultOption(helpOption);

            return(root);
        }