Cleaned up interfaces. Extracted server state machine trigger handler to seperated classes. Removed legacy code
This commit is contained in:
@@ -1,44 +0,0 @@
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using MoonCore.Exceptions;
|
||||
using MoonlightServers.Daemon.ServerSystem.SubSystems;
|
||||
using MoonlightServers.Daemon.Services;
|
||||
|
||||
namespace MoonlightServers.Daemon.Http.Controllers.Servers;
|
||||
|
||||
[ApiController]
|
||||
[Route("api/servers/download")]
|
||||
[Authorize(AuthenticationSchemes = "accessToken", Policy = "serverDownload")]
|
||||
public class DownloadController : Controller
|
||||
{
|
||||
private readonly ServerService ServerService;
|
||||
|
||||
public DownloadController(ServerService serverService)
|
||||
{
|
||||
ServerService = serverService;
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
public async Task Download()
|
||||
{
|
||||
var serverId = int.Parse(User.Claims.First(x => x.Type == "serverId").Value);
|
||||
var path = User.Claims.First(x => x.Type == "path").Value;
|
||||
|
||||
var server = ServerService.Find(serverId);
|
||||
|
||||
if (server == null)
|
||||
throw new HttpApiException("No server with this id found", 404);
|
||||
|
||||
var storageSubSystem = server.GetRequiredSubSystem<StorageSubSystem>();
|
||||
|
||||
var fileSystem = await storageSubSystem.GetFileSystem();
|
||||
|
||||
await fileSystem.Read(
|
||||
path,
|
||||
async dataStream =>
|
||||
{
|
||||
await Results.File(dataStream).ExecuteAsync(HttpContext);
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,99 +0,0 @@
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using MoonCore.Exceptions;
|
||||
using MoonlightServers.Daemon.Helpers;
|
||||
using MoonlightServers.Daemon.ServerSystem.SubSystems;
|
||||
using MoonlightServers.Daemon.Services;
|
||||
using MoonlightServers.DaemonShared.DaemonSide.Http.Requests;
|
||||
using MoonlightServers.DaemonShared.DaemonSide.Http.Responses.Servers;
|
||||
|
||||
namespace MoonlightServers.Daemon.Http.Controllers.Servers;
|
||||
|
||||
[Authorize]
|
||||
[ApiController]
|
||||
[Route("api/servers/{id:int}/files")]
|
||||
public class ServerFileSystemController : Controller
|
||||
{
|
||||
private readonly ServerService ServerService;
|
||||
|
||||
public ServerFileSystemController(ServerService serverService)
|
||||
{
|
||||
ServerService = serverService;
|
||||
}
|
||||
|
||||
[HttpGet("list")]
|
||||
public async Task<ServerFileSystemResponse[]> List([FromRoute] int id, [FromQuery] string path = "")
|
||||
{
|
||||
var fileSystem = await GetFileSystemById(id);
|
||||
|
||||
return await fileSystem.List(path);
|
||||
}
|
||||
|
||||
[HttpPost("move")]
|
||||
public async Task Move([FromRoute] int id, [FromQuery] string oldPath, [FromQuery] string newPath)
|
||||
{
|
||||
var fileSystem = await GetFileSystemById(id);
|
||||
|
||||
await fileSystem.Move(oldPath, newPath);
|
||||
}
|
||||
|
||||
[HttpDelete("delete")]
|
||||
public async Task Delete([FromRoute] int id, [FromQuery] string path)
|
||||
{
|
||||
var fileSystem = await GetFileSystemById(id);
|
||||
|
||||
await fileSystem.Delete(path);
|
||||
}
|
||||
|
||||
[HttpPost("mkdir")]
|
||||
public async Task Mkdir([FromRoute] int id, [FromQuery] string path)
|
||||
{
|
||||
var fileSystem = await GetFileSystemById(id);
|
||||
|
||||
await fileSystem.Mkdir(path);
|
||||
}
|
||||
|
||||
[HttpPost("touch")]
|
||||
public async Task Touch([FromRoute] int id, [FromQuery] string path)
|
||||
{
|
||||
var fileSystem = await GetFileSystemById(id);
|
||||
|
||||
await fileSystem.Touch(path);
|
||||
}
|
||||
|
||||
[HttpPost("compress")]
|
||||
public async Task Compress([FromRoute] int id, [FromBody] ServerFilesCompressRequest request)
|
||||
{
|
||||
var fileSystem = await GetFileSystemById(id);
|
||||
|
||||
await fileSystem.Compress(
|
||||
request.Items,
|
||||
request.Destination,
|
||||
request.Type
|
||||
);
|
||||
}
|
||||
|
||||
[HttpPost("decompress")]
|
||||
public async Task Decompress([FromRoute] int id, [FromBody] ServerFilesDecompressRequest request)
|
||||
{
|
||||
var fileSystem = await GetFileSystemById(id);
|
||||
|
||||
await fileSystem.Decompress(
|
||||
request.Path,
|
||||
request.Destination,
|
||||
request.Type
|
||||
);
|
||||
}
|
||||
|
||||
private async Task<ServerFileSystem> GetFileSystemById(int serverId)
|
||||
{
|
||||
var server = ServerService.Find(serverId);
|
||||
|
||||
if (server == null)
|
||||
throw new HttpApiException("No server with this id found", 404);
|
||||
|
||||
var storageSubSystem = server.GetRequiredSubSystem<StorageSubSystem>();
|
||||
|
||||
return await storageSubSystem.GetFileSystem();
|
||||
}
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using MoonCore.Exceptions;
|
||||
using MoonlightServers.Daemon.Enums;
|
||||
using MoonlightServers.Daemon.Services;
|
||||
using ServerTrigger = MoonlightServers.Daemon.ServerSystem.ServerTrigger;
|
||||
|
||||
namespace MoonlightServers.Daemon.Http.Controllers.Servers;
|
||||
|
||||
[Authorize]
|
||||
[ApiController]
|
||||
[Route("api/servers")]
|
||||
public class ServerPowerController : Controller
|
||||
{
|
||||
private readonly NewServerService ServerService;
|
||||
|
||||
public ServerPowerController(NewServerService serverService)
|
||||
{
|
||||
ServerService = serverService;
|
||||
}
|
||||
|
||||
[HttpPost("{serverId:int}/start")]
|
||||
public async Task Start(int serverId)
|
||||
{
|
||||
var server = ServerService.Find(serverId);
|
||||
|
||||
if (server == null)
|
||||
throw new HttpApiException("No server with this id found", 404);
|
||||
|
||||
await server.StateMachine.FireAsync(ServerTrigger.Start);
|
||||
}
|
||||
|
||||
[HttpPost("{serverId:int}/stop")]
|
||||
public async Task Stop(int serverId)
|
||||
{
|
||||
var server = ServerService.Find(serverId);
|
||||
|
||||
if (server == null)
|
||||
throw new HttpApiException("No server with this id found", 404);
|
||||
|
||||
await server.StateMachine.FireAsync(ServerTrigger.Stop);
|
||||
}
|
||||
|
||||
[HttpPost("{serverId:int}/install")]
|
||||
public async Task Install(int serverId)
|
||||
{
|
||||
var server = ServerService.Find(serverId);
|
||||
|
||||
if (server == null)
|
||||
throw new HttpApiException("No server with this id found", 404);
|
||||
|
||||
await server.StateMachine.FireAsync(ServerTrigger.Install);
|
||||
}
|
||||
|
||||
[HttpPost("{serverId:int}/kill")]
|
||||
public async Task Kill(int serverId)
|
||||
{
|
||||
var server = ServerService.Find(serverId);
|
||||
|
||||
if (server == null)
|
||||
throw new HttpApiException("No server with this id found", 404);
|
||||
|
||||
await server.StateMachine.FireAsync(ServerTrigger.Kill);
|
||||
}
|
||||
}
|
||||
@@ -1,109 +0,0 @@
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using MoonCore.Exceptions;
|
||||
using MoonlightServers.Daemon.ServerSystem.SubSystems;
|
||||
using MoonlightServers.Daemon.Services;
|
||||
using MoonlightServers.DaemonShared.DaemonSide.Http.Requests;
|
||||
using MoonlightServers.DaemonShared.DaemonSide.Http.Responses.Servers;
|
||||
using MoonlightServers.DaemonShared.Enums;
|
||||
|
||||
namespace MoonlightServers.Daemon.Http.Controllers.Servers;
|
||||
|
||||
[Authorize]
|
||||
[ApiController]
|
||||
[Route("api/servers/{serverId:int}")]
|
||||
public class ServersController : Controller
|
||||
{
|
||||
private readonly NewServerService ServerService;
|
||||
|
||||
public ServersController(NewServerService serverService)
|
||||
{
|
||||
ServerService = serverService;
|
||||
}
|
||||
|
||||
[HttpPost("sync")]
|
||||
public async Task Sync([FromRoute] int serverId)
|
||||
{
|
||||
await ServerService.Sync(serverId);
|
||||
}
|
||||
|
||||
[HttpDelete]
|
||||
public async Task Delete([FromRoute] int serverId)
|
||||
{
|
||||
await ServerService.Delete(serverId);
|
||||
}
|
||||
|
||||
[HttpGet("status")]
|
||||
public Task<ServerStatusResponse> GetStatus([FromRoute] int serverId)
|
||||
{
|
||||
var server = ServerService.Find(serverId);
|
||||
|
||||
if (server == null)
|
||||
throw new HttpApiException("No server with this id found", 404);
|
||||
|
||||
var result = new ServerStatusResponse()
|
||||
{
|
||||
State = (ServerState)server.StateMachine.State
|
||||
};
|
||||
|
||||
return Task.FromResult(result);
|
||||
}
|
||||
|
||||
[HttpGet("logs")]
|
||||
public async Task<ServerLogsResponse> GetLogs([FromRoute] int serverId)
|
||||
{
|
||||
var server = ServerService.Find(serverId);
|
||||
|
||||
if (server == null)
|
||||
throw new HttpApiException("No server with this id found", 404);
|
||||
|
||||
var messages = server.Console.GetOutput();
|
||||
|
||||
return new ServerLogsResponse()
|
||||
{
|
||||
Messages = messages
|
||||
};
|
||||
}
|
||||
|
||||
[HttpGet("stats")]
|
||||
public Task<ServerStatsResponse> GetStats([FromRoute] int serverId)
|
||||
{
|
||||
var server = ServerService.Find(serverId);
|
||||
|
||||
if (server == null)
|
||||
throw new HttpApiException("No server with this id found", 404);
|
||||
/*
|
||||
var statsSubSystem = server.GetRequiredSubSystem<StatsSubSystem>();
|
||||
|
||||
return Task.FromResult<ServerStatsResponse>(new()
|
||||
{
|
||||
CpuUsage = statsSubSystem.CurrentStats.CpuUsage,
|
||||
MemoryUsage = statsSubSystem.CurrentStats.MemoryUsage,
|
||||
NetworkRead = statsSubSystem.CurrentStats.NetworkRead,
|
||||
NetworkWrite = statsSubSystem.CurrentStats.NetworkWrite,
|
||||
IoRead = statsSubSystem.CurrentStats.IoRead,
|
||||
IoWrite = statsSubSystem.CurrentStats.IoWrite
|
||||
});*/
|
||||
|
||||
return Task.FromResult<ServerStatsResponse>(new()
|
||||
{
|
||||
CpuUsage = 0,
|
||||
MemoryUsage = 0,
|
||||
NetworkRead = 0,
|
||||
NetworkWrite = 0,
|
||||
IoRead = 0,
|
||||
IoWrite = 0
|
||||
});
|
||||
}
|
||||
|
||||
[HttpPost("command")]
|
||||
public async Task Command([FromRoute] int serverId, [FromBody] ServerCommandRequest request)
|
||||
{
|
||||
var server = ServerService.Find(serverId);
|
||||
|
||||
if (server == null)
|
||||
throw new HttpApiException("No server with this id found", 404);
|
||||
|
||||
await server.Console.WriteToInput(request.Command);
|
||||
}
|
||||
}
|
||||
@@ -1,85 +0,0 @@
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using MoonCore.Exceptions;
|
||||
using MoonCore.Helpers;
|
||||
using MoonlightServers.Daemon.Configuration;
|
||||
using MoonlightServers.Daemon.ServerSystem.SubSystems;
|
||||
using MoonlightServers.Daemon.Services;
|
||||
|
||||
namespace MoonlightServers.Daemon.Http.Controllers.Servers;
|
||||
|
||||
[ApiController]
|
||||
[Route("api/servers/upload")]
|
||||
[Authorize(AuthenticationSchemes = "accessToken", Policy = "serverUpload")]
|
||||
public class UploadController : Controller
|
||||
{
|
||||
private readonly AppConfiguration Configuration;
|
||||
private readonly ServerService ServerService;
|
||||
|
||||
public UploadController(
|
||||
ServerService serverService,
|
||||
AppConfiguration configuration
|
||||
)
|
||||
{
|
||||
ServerService = serverService;
|
||||
Configuration = configuration;
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public async Task Upload(
|
||||
[FromQuery] long totalSize,
|
||||
[FromQuery] int chunkId,
|
||||
[FromQuery] string path
|
||||
)
|
||||
{
|
||||
var chunkSize = ByteConverter.FromMegaBytes(Configuration.Files.UploadChunkSize).Bytes;
|
||||
var uploadLimit = ByteConverter.FromMegaBytes(Configuration.Files.UploadSizeLimit).Bytes;
|
||||
|
||||
#region File validation
|
||||
|
||||
if (Request.Form.Files.Count != 1)
|
||||
throw new HttpApiException("You need to provide exactly one file", 400);
|
||||
|
||||
var file = Request.Form.Files[0];
|
||||
|
||||
if (file.Length > chunkSize)
|
||||
throw new HttpApiException("The provided data exceeds the chunk size limit", 400);
|
||||
|
||||
#endregion
|
||||
|
||||
var serverId = int.Parse(User.Claims.First(x => x.Type == "serverId").Value);
|
||||
|
||||
#region Chunk calculation and validation
|
||||
|
||||
if(totalSize > uploadLimit)
|
||||
throw new HttpApiException("Invalid upload request: Exceeding upload limit", 400);
|
||||
|
||||
var chunks = totalSize / chunkSize;
|
||||
chunks += totalSize % chunkSize > 0 ? 1 : 0;
|
||||
|
||||
if (chunkId > chunks)
|
||||
throw new HttpApiException("Invalid chunk id: Out of bounds", 400);
|
||||
|
||||
var positionToSkipTo = chunkSize * chunkId;
|
||||
|
||||
#endregion
|
||||
|
||||
var server = ServerService.Find(serverId);
|
||||
|
||||
if (server == null)
|
||||
throw new HttpApiException("No server with this id found", 404);
|
||||
|
||||
var storageSubSystem = server.GetRequiredSubSystem<StorageSubSystem>();
|
||||
|
||||
var fileSystem = await storageSubSystem.GetFileSystem();
|
||||
|
||||
var dataStream = file.OpenReadStream();
|
||||
|
||||
await fileSystem.CreateChunk(
|
||||
path,
|
||||
totalSize,
|
||||
positionToSkipTo,
|
||||
dataStream
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user