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