using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using ProxmoxConnector.Server.Application.Services.Environment; using ProxmoxConnector.Server.Application.Utils; using Serilog; using Serilog.Core; using Serilog.Events; using System; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; namespace ProxmoxConnector.Server { public class Program { public static void Main(string[] args) { var isContainer = args.Contains("--docker"); if (!isContainer) { var pathToExe = Process.GetCurrentProcess().MainModule.FileName; var pathToContentRoot = Path.GetDirectoryName(pathToExe); Directory.SetCurrentDirectory(pathToContentRoot); } var configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables() .Build(); var configurator = new EnvironmentConfigurator(configuration); configurator.Configure(); var (databasePath, workspace) = configurator.GetStorageTools(); var loggingLevelParam = configuration.GetValue("Logging:LogLevel:Default"); if (!Enum.TryParse(loggingLevelParam, out LogEventLevel loggingLevel)) throw new Exception($"Unknown logging level '{loggingLevelParam}'."); var loggingLevelSwitch = new LoggingLevelSwitch(loggingLevel); Log.Logger = new LoggerConfiguration() .MinimumLevel.ControlledBy(loggingLevelSwitch) .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) .Enrich.FromLogContext() .WriteTo.Console() .WriteTo.SQLite(databasePath, "__Logs", levelSwitch: loggingLevelSwitch) .CreateLogger(); try { var urls = configuration.GetValue("urls"); Log.Information($"Starting Proxmox connector {SystemRegistry.GetVersion()}..."); Log.Information($"API listening on {urls}"); Log.Information($"Workspace configured at '{workspace}' path"); Console.WriteLine("Application started. Press Ctrl+C to shut down."); CreateHostBuilder(args, configuration).Build().Run(); } catch (Exception ex) { Log.Fatal(ex, "CDN Server host terminated unexpectedly"); } finally { Log.CloseAndFlush(); } } public static IHostBuilder CreateHostBuilder(string[] args, IConfiguration configuration) { var builder = Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup() .UseConfiguration(configuration) .UseSerilog(); }); return builder; } } }