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