Files
squad-rain-ops-mini/Apis/FrpApi.cs

122 lines
5.5 KiB
C#

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using RainOpsMini.Services;
using RainOpsMini.Models;
using RainOpsMini.Plugins;
using RainOpsMini.Helpers;
using System.IO;
using System.Threading.Tasks;
using System;
using System.Collections.Generic;
using System.Linq;
namespace RainOpsMini.Apis
{
public static class FrpApi
{
public static void MapFrpApis(this IEndpointRouteBuilder app)
{
// API: 获取 FRP 状态
// 返回 FRP 进程是否运行、PID、启动时间等
app.MapGet("/api/frp/status", (FrpManager frp) =>
{
return Results.Ok(new
{
isRunning = frp.IsRunning,
processId = frp.ProcessId,
startTime = frp.StartTime,
autoRestartEnabled = frp.AutoRestartEnabled,
restartIntervalMinutes = frp.RestartIntervalMinutes,
nextRestartTime = frp.NextRestartTime
});
});
// API: 启动 FRP
// 手动启动 FRP 进程
app.MapPost("/api/frp/start", (FrpManager frp, HttpContext ctx) =>
{
if (!ctx.User.HasClaim("Permission", "frp.manage") && !ctx.User.HasClaim("Permission", "all") && ctx.User.FindFirst("IsSuperAdmin")?.Value != "true") return Results.Unauthorized();
try
{
frp.Start();
return Results.Ok(new { message = "FRP started" });
}
catch (Exception ex)
{
return Results.BadRequest(new { error = ex.Message });
}
});
// API: 停止 FRP
// 手动停止 FRP 进程
app.MapPost("/api/frp/stop", (FrpManager frp, HttpContext ctx) =>
{
if (!ctx.User.HasClaim("Permission", "frp.manage") && !ctx.User.HasClaim("Permission", "all") && ctx.User.FindFirst("IsSuperAdmin")?.Value != "true") return Results.Unauthorized();
frp.Stop();
return Results.Ok(new { message = "FRP stopped" });
});
// API: 重启 FRP
// 手动重启 FRP 进程
app.MapPost("/api/frp/restart", (FrpManager frp, HttpContext ctx) =>
{
if (!ctx.User.HasClaim("Permission", "frp.manage") && !ctx.User.HasClaim("Permission", "all") && ctx.User.FindFirst("IsSuperAdmin")?.Value != "true") return Results.Unauthorized();
try
{
frp.Restart();
return Results.Ok(new { message = "FRP restarted" });
}
catch (Exception ex)
{
return Results.BadRequest(new { error = ex.Message });
}
});
// API: 获取 FRP 配置
// 读取 frpc.ini 内容
app.MapGet("/api/frp/config", (FrpManager frp, HttpContext ctx) =>
{
if (!ctx.User.HasClaim("Permission", "frp.manage") && !ctx.User.HasClaim("Permission", "all") && ctx.User.FindFirst("IsSuperAdmin")?.Value != "true") return Results.Unauthorized();
return Results.Ok(new { content = frp.GetConfig() });
});
// API: 保存 FRP 配置
// 写入 frpc.ini 内容
app.MapPost("/api/frp/config", (FrpManager frp, FrpConfigModel model, HttpContext ctx) =>
{
if (!ctx.User.HasClaim("Permission", "frp.manage") && !ctx.User.HasClaim("Permission", "all") && ctx.User.FindFirst("IsSuperAdmin")?.Value != "true") return Results.Unauthorized();
if (string.IsNullOrEmpty(model.Content)) return Results.BadRequest(new { error = "Content is empty" });
frp.SaveConfig(model.Content);
return Results.Ok(new { message = "Config saved" });
});
// API: 保存 FRP 设置
// 更新 FRP 自动重启策略
app.MapPost("/api/frp/settings", (FrpManager frp, FrpSettingsModel model, HttpContext ctx) =>
{
if (!ctx.User.HasClaim("Permission", "frp.manage") && !ctx.User.HasClaim("Permission", "all") && ctx.User.FindFirst("IsSuperAdmin")?.Value != "true") return Results.Unauthorized();
frp.SetAutoRestart(model.AutoRestartEnabled, model.RestartIntervalMinutes);
return Results.Ok(new { message = "Settings saved" });
});
// API: 获取 FRP 日志
// 返回最近的 FRP 运行日志
app.MapGet("/api/frp/logs", (FrpManager frp, HttpContext ctx) =>
{
if (!ctx.User.HasClaim("Permission", "frp.manage") && !ctx.User.HasClaim("Permission", "all") && ctx.User.FindFirst("IsSuperAdmin")?.Value != "true") return Results.Unauthorized();
return Results.Ok(frp.GetLogs());
});
// API: 清空 FRP 日志
// 清除内存中的 FRP 日志
app.MapPost("/api/frp/logs/clear", (FrpManager frp, HttpContext ctx) =>
{
if (!ctx.User.HasClaim("Permission", "frp.manage") && !ctx.User.HasClaim("Permission", "all") && ctx.User.FindFirst("IsSuperAdmin")?.Value != "true") return Results.Unauthorized();
frp.ClearLogs();
return Results.Ok(new { message = "Logs cleared" });
});
}
}
}