Files
2025-01-11 02:35:39 +08:00

79 lines
2.9 KiB
C#

using System.Runtime.Loader;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Proxd_man.Config;
using Proxd_man.Monitor;
using Proxd_man.Subscribe;
namespace Proxd_man;
internal class Program
{
public static async Task Main(string[] args)
{
Console.WriteLine($"Base Directory: {AppContext.BaseDirectory}");
var configurationBuilder = new ConfigurationBuilder()
.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: false)
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.AddCommandLine(args);
var configuration = configurationBuilder.Build();
var serviceProvider = new ServiceCollection()
.AddLogging(configure =>
{
configure.AddConfiguration(configuration);
configure.AddConsole();
configure.SetMinimumLevel(LogLevel.Debug);
})
.Configure<ProxdConfig>(configuration.GetSection("Proxd"))
.AddSingleton<XrayCoreManager>()
.AddSingleton<SubscribeManager>()
.AddSingleton<OutboundMonitor>()
.BuildServiceProvider();
var logger = serviceProvider.GetRequiredService<ILogger<Program>>();
var xrayCoreManager = serviceProvider.GetRequiredService<XrayCoreManager>();
await xrayCoreManager.InitialXrayCoreProgram();
var subscribeManager = serviceProvider.GetRequiredService<SubscribeManager>();
await subscribeManager.CheckAndUpdateSubscribes();
var outboundMonitor = serviceProvider.GetRequiredService<OutboundMonitor>();
if (subscribeManager.GetSubscribeOutbounds().Count > 0)
{
logger.LogInformation("已通过订阅获取到出站代理, 正在尝试选取最优出站代理...");
_ = outboundMonitor.ReselectOutbound(subscribeManager.GetSubscribeOutbounds());
}
else
{
logger.LogWarning("没有获取到任何出站代理, 等待下一次订阅更新...");
}
subscribeManager.StartUpdateSubscribes();
// 监听 SIGTERM 和 SIGINT 信号, 以优雅退出
var cts = new CancellationTokenSource();
AppDomain.CurrentDomain.ProcessExit += (_, _) => cts.Cancel();
Console.CancelKeyPress += (_, _) => cts.Cancel();
AssemblyLoadContext.Default.Unloading += _ => cts.Cancel();
try
{
await Task.Delay(-1, cts.Token);
}
catch (TaskCanceledException)
{
logger.LogInformation("正在退出...");
}
logger.LogInformation("Good Bye!");
}
}