refactor: 枚举移入Models目录,命名空间更新为Rainbow.Entity.Models
大石头 authored at 2026-07-02 12:54:58
5.47 KiB
RainbowBridge
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();