using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Json.Serialization;
using NewLife;
using NewLife.Cube;
using NewLife.Log;
using NewLife.Serialization;
using Rainbow;
using Rainbow.Entity;
using Rainbow.Services;
using Rainbow.Web;
using Scalar.AspNetCore;
// 启用控制台日志
XTrace.UseConsole();
var builder = WebApplication.CreateBuilder(args);
var services = builder.Services;
// 配置星尘(StarAgent 守护)
var star = services.AddStardust(null);
// 注册 Rainbow 服务层
services.AddSingleton<ShellAuditLogger>();
services.AddSingleton<SudoWhitelist>(_ => new SudoWhitelist(""));
services.AddSingleton<ShellExecutor>();
services.AddSingleton<IShellExecutor>(sp => sp.GetRequiredService<ShellExecutor>());
services.AddSingleton<ConfigBackup>();
// 跨平台适配器
var osAdapter = AdapterFactory.Create();
services.AddSingleton<IOSAdapter>(osAdapter);
// 网络管理接口(按平台注册具体实现)
services.AddSingleton<INetworkInterfaceManager>(sp =>
{
if (OperatingSystem.IsWindows())
return new WindowsNetworkInterfaceManager();
return new StubNetworkInterfaceManager();
});
services.AddSingleton<INetworkRouteManager>(sp =>
{
if (OperatingSystem.IsWindows())
return new WindowsRouteManager();
return new StubNetworkRouteManager();
});
// 网口流量统计提供者(按平台注册)
services.AddSingleton<INetworkStatProvider>(sp =>
{
if (OperatingSystem.IsWindows())
return new WindowsNetworkStatProvider();
return new StubNetworkStatProvider();
});
// 防火墙适配器(按平台注册)
services.AddSingleton<IFirewallAdapter>(sp =>
{
if (OperatingSystem.IsWindows())
return new WindowsFirewallAdapter();
// Linux 上根据发行版选择 iptables/nftables
var shell = sp.GetRequiredService<ShellExecutor>();
return new IptablesAdapter(shell);
});
// DHCP/DNS 适配器(按平台注册)
services.AddSingleton<IDhcpDnsAdapter>(sp =>
{
if (OperatingSystem.IsLinux())
{
var shell = sp.GetRequiredService<ShellExecutor>();
return new DnsmasqAdapter(shell);
}
if (OperatingSystem.IsWindows())
return new WindowsDhcpDnsAdapter();
return new DnsmasqAdapter(sp.GetRequiredService<ShellExecutor>());
});
// 服务注册(含平台感知的注入)
services.AddSingleton<MonitorCollector>();
services.AddSingleton<WanManager>();
services.AddSingleton<PppManager>();
services.AddSingleton<FirewallManager>();
services.AddSingleton<DnsmasqManager>();
services.AddSingleton<DnsLogParser>();
services.AddSingleton<StatCollector>();
services.AddSingleton<StatAggregator>();
services.AddSingleton<DeviceHistoryTracker>();
services.AddSingleton<MemberQuotaService>();
services.AddSingleton<UpgradeService>();
// 拦截提示页服务(端口 9080)
services.AddHostedService<BlockPageService>();
// 启用响应压缩
services.AddResponseCompression();
// 配置 JSON 序列化 + MVC(Cube 需要 AddControllersWithViews)
services.AddControllersWithViews()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
options.JsonSerializerOptions.Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping;
options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
SystemJson.Apply(options.JsonSerializerOptions, true);
});
// CORS(开发环境允许前端跨域)
services.AddCors(options =>
{
options.AddPolicy("DevCors", builder =>
{
builder.WithOrigins("http://localhost:5173", "http://localhost:3000")
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
});
// 引入魔方(提供 /admin 后台管理:用户/角色/日志/配置,StarChat 模式)
services.AddCube();
// OpenAPI 支持(Scalar 交互式 API 文档)
services.AddOpenApi();
// 注册 Rainbow 扩展(预留服务注册点)
services.AddRainbow();
var app = builder.Build();
// 启动统计采集与汇总(星尘监控模式)
app.Services.GetRequiredService<StatCollector>().Start();
app.Services.GetRequiredService<StatAggregator>().Start();
app.Services.GetRequiredService<DeviceHistoryTracker>().Start();
app.Services.GetRequiredService<MemberQuotaService>().Start();
app.Services.GetRequiredService<DnsLogParser>().Start();
app.UseCors("DevCors");
if (app.Environment.IsDevelopment())
app.UseDeveloperExceptionPage();
if (Environment.GetEnvironmentVariable("__ASPNETCORE_BROWSER_TOOLS") is null)
app.UseResponseCompression();
// 路由中间件:UseRouting + UseAuthorization 必须在 UseEndpoints 之前
app.UseRouting();
app.UseAuthorization();
// 使用魔方(认证/授权/菜单/权限中间件)
// UseCube 内部 UseRouter 检测到 __EndpointRouteBuilder 已存在时跳过 UseEndpoints
app.UseCube(app.Environment);
// API 控制器路由(Cube 已注册区域路由)
app.MapControllers();
// Scalar 交互式 API 文档(开发环境)
if (app.Environment.IsDevelopment())
{
app.MapOpenApi();
app.MapScalarApiReference(options =>
{
options.WithTitle("Rainbow API")
.WithTheme(ScalarTheme.Purple)
.WithDefaultHttpClient(ScalarTarget.CSharp, ScalarClient.HttpClient);
});
}
// 静态文件(嵌入资源 + SPA 回退,Cube → API 路由之后,不被静态文件中间件拦截)
app.UseRainbow();
// 注册到星尘注册中心
app.RegisterService(star.AppId, null, app.Environment.EnvironmentName);
app.Run();
|