using Autofac; using PKISharp.WACS.Clients; using PKISharp.WACS.Clients.Acme; using PKISharp.WACS.Clients.DNS; using PKISharp.WACS.Clients.IIS; using PKISharp.WACS.Configuration; using PKISharp.WACS.Plugins.Resolvers; using PKISharp.WACS.Services; using System; using System.Linq; using System.Threading.Tasks; namespace PKISharp.WACS.Host { /// /// This class serves as bootstrapper to call the main library /// internal class Program { private async static Task Main(string[] args) { // Error handling AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException); // Setup IOC container var container = GlobalScope(args); if (container == null) { Environment.ExitCode = -1; if (Environment.UserInteractive) { Console.WriteLine(" Press to close"); _ = Console.ReadLine(); } return; } // The main class might change the character encoding // save the original setting so that it can be restored // after the run. var original = Console.OutputEncoding; try { // Load instance of the main class and start the program var wacs = container.Resolve(new TypedParameter(typeof(IContainer), container)); Environment.ExitCode = await wacs.Start(); } catch (Exception ex) { Console.WriteLine("Error in main function: " + ex.Message); Environment.ExitCode = -1; } // Restore original code page Console.OutputEncoding = original; } /// /// Final resort to catch unhandled exceptions and log something /// before the runtime explodes. /// /// /// static void OnUnhandledException(object sender, UnhandledExceptionEventArgs args) { var ex = (Exception)args.ExceptionObject; Console.WriteLine("Unhandled exception caught: " + ex.Message); } /// /// Configure dependency injection /// /// /// internal static IContainer GlobalScope(string[] args) { var builder = new ContainerBuilder(); var logger = new LogService(); if (args.Contains("--verbose")) { logger.SetVerbose(); } var pluginService = new PluginService(logger); var argumentsParser = new ArgumentsParser(logger, pluginService, args); var argumentsService = new ArgumentsService(logger, argumentsParser); if (!argumentsService.Valid) { return null; } var settingsService = new SettingsService(logger, argumentsService); if (!settingsService.Valid) { return null; } logger.SetDiskLoggingPath(settingsService.Client.LogPath); _ = builder.RegisterInstance(argumentsService); _ = builder.RegisterInstance(argumentsParser); _ = builder.RegisterInstance(logger).As(); _ = builder.RegisterInstance(settingsService).As(); _ = builder.RegisterInstance(argumentsService).As(); _ = builder.RegisterInstance(pluginService).As(); _ = builder.RegisterType().As().SingleInstance(); _ = builder.RegisterType().As().SingleInstance(); _ = builder.RegisterType().SingleInstance(); _ = builder.RegisterType().SingleInstance(); _ = builder.RegisterType().As().SingleInstance(); _ = builder.RegisterType().SingleInstance(); pluginService.Configure(builder); _ = builder.RegisterType().SingleInstance(); _ = builder.RegisterType().As().InstancePerLifetimeScope(); _ = builder.RegisterType().SingleInstance(); _ = builder.RegisterType().SingleInstance(); _ = builder.RegisterType(); _ = builder.RegisterType(); _ = builder.RegisterType().As().SingleInstance(); _ = builder.RegisterType().SingleInstance(); _ = builder.RegisterType().SingleInstance(); _ = builder.RegisterType().SingleInstance(); _ = builder.RegisterType().SingleInstance(); _ = builder.RegisterType().SingleInstance(); _ = builder.RegisterType().SingleInstance(); _ = builder.RegisterType().As().SingleInstance(); _ = builder.RegisterType().SingleInstance(); _ = builder.RegisterType().SingleInstance(); _ = builder.RegisterType().SingleInstance(); _ = builder.RegisterType().SingleInstance(); _ = builder.RegisterType().SingleInstance(); _ = builder.RegisterType().SingleInstance(); _ = builder.Register(c => c.Resolve().MainArguments).SingleInstance(); _ = builder.RegisterType(); return builder.Build(); } } }