Started with servers sync to daemon

This commit is contained in:
2024-12-24 00:42:17 +01:00
parent 4326af2925
commit 9f8c1f6d24
19 changed files with 271 additions and 12 deletions

View File

@@ -0,0 +1,99 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using MoonCore.Extended.Abstractions;
using MoonCore.Models;
using MoonlightServers.ApiServer.Database.Entities;
using MoonlightServers.DaemonShared.PanelSide.Http.Responses;
namespace MoonlightServers.ApiServer.Http.Controllers.Remote.Servers;
[ApiController]
[Route("api/servers/remote/servers")]
public class RemoteServersController : Controller
{
private readonly DatabaseRepository<Server> ServerRepository;
private readonly ILogger<RemoteServersController> Logger;
public RemoteServersController(
DatabaseRepository<Server> serverRepository,
ILogger<RemoteServersController> logger
)
{
ServerRepository = serverRepository;
Logger = logger;
}
[HttpGet]
public async Task<PagedData<ServerDataResponse>> Get([FromQuery] int page, [FromQuery] int pageSize)
{
var total = await ServerRepository
.Get()
.Where(x => x.Node.Id == 1)
.CountAsync();
var servers = await ServerRepository
.Get()
.Where(x => x.Node.Id == 1)
.Include(x => x.Star)
.ThenInclude(x => x.DockerImages)
.Include(x => x.Variables)
.Include(x => x.Allocations)
.Skip(page * pageSize)
.Take(pageSize)
.ToArrayAsync();
var serverData = new List<ServerDataResponse>();
foreach (var server in servers)
{
var dockerImage = server.Star.DockerImages
.FirstOrDefault(x => x.Id == server.DockerImageIndex);
if (dockerImage == null)
{
dockerImage = server.Star.DockerImages
.FirstOrDefault(x => x.Id == server.Star.DefaultDockerImage);
}
if (dockerImage == null)
dockerImage = server.Star.DockerImages.FirstOrDefault();
if (dockerImage == null)
{
Logger.LogWarning("Unable to map server data for server {id}: No docker image available", server.Id);
continue;
}
serverData.Add(new ServerDataResponse()
{
Id = server.Id,
StartupCommand = server.StartupOverride ?? server.Star.StartupCommand,
Allocations = server.Allocations.Select(x => new AllocationDataResponse()
{
IpAddress = x.IpAddress,
Port = x.Port
}).ToArray(),
Variables = server.Variables.ToDictionary(x => x.Key, x => x.Value),
Bandwidth = server.Bandwidth,
Cpu = server.Cpu,
Disk = server.Disk,
Memory = server.Memory,
OnlineDetection = server.Star.OnlineDetection,
DockerImage = dockerImage.Identifier,
PullDockerImage = dockerImage.AutoPulling,
ParseConiguration = server.Star.ParseConfiguration,
StopCommand = server.Star.StopCommand,
UseVirtualDisk = server.UseVirtualDisk
});
}
return new PagedData<ServerDataResponse>()
{
Items = serverData.ToArray(),
CurrentPage = page,
PageSize = pageSize,
TotalItems = total,
TotalPages = total == 0 ? 0 : total / pageSize
};
}
}

View File

@@ -1,8 +1,8 @@
using MoonCore.Attributes; using MoonCore.Attributes;
using MoonCore.Helpers; using MoonCore.Helpers;
using MoonlightServers.ApiServer.Database.Entities; using MoonlightServers.ApiServer.Database.Entities;
using MoonlightServers.DaemonShared.Http.Responses.Statistics; using MoonlightServers.DaemonShared.DaemonSide.Http.Responses.Statistics;
using MoonlightServers.DaemonShared.Http.Responses.Sys; using MoonlightServers.DaemonShared.DaemonSide.Http.Responses.Sys;
namespace MoonlightServers.ApiServer.Services; namespace MoonlightServers.ApiServer.Services;

View File

@@ -1,6 +1,6 @@
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using MoonlightServers.Daemon.Helpers; using MoonlightServers.Daemon.Helpers;
using MoonlightServers.DaemonShared.Http.Responses.Statistics; using MoonlightServers.DaemonShared.DaemonSide.Http.Responses.Statistics;
namespace MoonlightServers.Daemon.Http.Controllers.Statistics; namespace MoonlightServers.Daemon.Http.Controllers.Statistics;

View File

@@ -1,6 +1,6 @@
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using MoonlightServers.Daemon.Services; using MoonlightServers.Daemon.Services;
using MoonlightServers.DaemonShared.Http.Responses.Statistics; using MoonlightServers.DaemonShared.DaemonSide.Http.Responses.Statistics;
namespace MoonlightServers.Daemon.Http.Controllers.Statistics; namespace MoonlightServers.Daemon.Http.Controllers.Statistics;

View File

@@ -1,6 +1,6 @@
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using MoonlightServers.Daemon.Helpers; using MoonlightServers.Daemon.Helpers;
using MoonlightServers.DaemonShared.Http.Responses.Statistics; using MoonlightServers.DaemonShared.DaemonSide.Http.Responses.Statistics;
namespace MoonlightServers.Daemon.Http.Controllers.Statistics; namespace MoonlightServers.Daemon.Http.Controllers.Statistics;

View File

@@ -1,7 +1,7 @@
using System.Diagnostics; using System.Diagnostics;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using MoonlightServers.Daemon.Services; using MoonlightServers.Daemon.Services;
using MoonlightServers.DaemonShared.Http.Responses.Sys; using MoonlightServers.DaemonShared.DaemonSide.Http.Responses.Sys;
namespace MoonlightServers.Daemon.Http.Controllers.Sys; namespace MoonlightServers.Daemon.Http.Controllers.Sys;

View File

@@ -0,0 +1,7 @@
namespace MoonlightServers.Daemon.Models;
public class Allocation
{
public string IpAddress { get; set; }
public int Port { get; set; }
}

View File

@@ -0,0 +1,22 @@
namespace MoonlightServers.Daemon.Models;
public class ServerData
{
public int Id { get; set; }
public string StartupCommand { get; set; }
public string OnlineDetection { get; set; }
public string StopCommand { get; set; }
public string DockerImage { get; set; }
public bool PullDockerImage { get; set; }
public string ParseConiguration { get; set; }
public int Cpu { get; set; }
public int Memory { get; set; }
public int Disk { get; set; }
public bool UseVirtualDisk { get; set; }
public int Bandwidth { get; set; }
public List<Allocation> Allocations { get; set; }
public Dictionary<string, string> Variables { get; set; }
}

View File

@@ -8,7 +8,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Docker.DotNet" Version="3.125.15" /> <PackageReference Include="Docker.DotNet" Version="3.125.15" />
<PackageReference Include="MoonCore" Version="1.8.0" /> <PackageReference Include="MoonCore" Version="1.8.1" />
<PackageReference Include="MoonCore.Extended" Version="1.2.4" /> <PackageReference Include="MoonCore.Extended" Version="1.2.4" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2"/> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2"/>
</ItemGroup> </ItemGroup>

View File

@@ -0,0 +1,38 @@
using MoonCore.Attributes;
namespace MoonlightServers.Daemon.Services;
[Singleton]
public class ApplicationStateService : IHostedLifecycleService
{
private readonly ServerService ServerService;
private readonly ILogger<ApplicationStateService> Logger;
public ApplicationStateService(ServerService serverService, ILogger<ApplicationStateService> logger)
{
ServerService = serverService;
Logger = logger;
}
public Task StartAsync(CancellationToken cancellationToken)
=> Task.CompletedTask;
public Task StopAsync(CancellationToken cancellationToken)
=> Task.CompletedTask;
public async Task StartedAsync(CancellationToken cancellationToken)
{
Logger.LogInformation("Performing initialization");
await ServerService.Initialize();
}
public Task StartingAsync(CancellationToken cancellationToken)
=> Task.CompletedTask;
public Task StoppedAsync(CancellationToken cancellationToken)
=> Task.CompletedTask;
public Task StoppingAsync(CancellationToken cancellationToken)
=> Task.CompletedTask;
}

View File

@@ -0,0 +1,44 @@
using MoonCore.Attributes;
using MoonCore.Models;
using MoonlightServers.Daemon.Models;
using MoonlightServers.DaemonShared.PanelSide.Http.Responses;
namespace MoonlightServers.Daemon.Services;
[Singleton]
public class ServerService
{
private readonly List<ServerData> Servers = new();
private readonly RemoteService RemoteService;
private readonly ILogger<ServerService> Logger;
public ServerService(RemoteService remoteService, ILogger<ServerService> logger)
{
RemoteService = remoteService;
Logger = logger;
}
public async Task Initialize() //TODO: Add initialize call from panel
{
//TODO: Handle block creating servers while initializing
Logger.LogInformation("Loading servers from panel");
var apiClient = await RemoteService.CreateHttpClient();
var servers = await PagedData<ServerDataResponse>.All(async (page, pageSize) =>
await apiClient.GetJson<PagedData<ServerDataResponse>>(
$"api/servers/remote/servers?page={page}&pageSize={pageSize}"
)
);
Logger.LogInformation("Initializing {count} servers", servers.Length);
}
public Task ImportServer(ServerData serverData)
{
lock (Servers)
Servers.Add(serverData);
return Task.CompletedTask;
}
}

View File

@@ -6,6 +6,7 @@ using MoonCore.Extensions;
using MoonCore.Helpers; using MoonCore.Helpers;
using MoonCore.Services; using MoonCore.Services;
using MoonlightServers.Daemon.Configuration; using MoonlightServers.Daemon.Configuration;
using MoonlightServers.Daemon.Services;
namespace MoonlightServers.Daemon; namespace MoonlightServers.Daemon;
@@ -41,6 +42,7 @@ public class Startup
await RegisterLogging(); await RegisterLogging();
await RegisterBase(); await RegisterBase();
await RegisterDocker(); await RegisterDocker();
await RegisterServers();
await BuildWebApplication(); await BuildWebApplication();
@@ -238,4 +240,22 @@ public class Startup
} }
#endregion #endregion
#region Servers
private Task RegisterServers()
{
WebApplicationBuilder.Services.AddHostedService<ApplicationStateService>(
sp => sp.GetRequiredService<ApplicationStateService>()
);
return Task.CompletedTask;
}
private Task UseServers()
{
return Task.CompletedTask;
}
#endregion
} }

View File

@@ -1,4 +1,4 @@
namespace MoonlightServers.DaemonShared.Http.Responses.Statistics; namespace MoonlightServers.DaemonShared.DaemonSide.Http.Responses.Statistics;
public class StatisticsApplicationResponse public class StatisticsApplicationResponse
{ {

View File

@@ -1,4 +1,4 @@
namespace MoonlightServers.DaemonShared.Http.Responses.Statistics; namespace MoonlightServers.DaemonShared.DaemonSide.Http.Responses.Statistics;
public class StatisticsDockerResponse public class StatisticsDockerResponse
{ {

View File

@@ -1,4 +1,4 @@
namespace MoonlightServers.DaemonShared.Http.Responses.Statistics; namespace MoonlightServers.DaemonShared.DaemonSide.Http.Responses.Statistics;
public class StatisticsHostResponse public class StatisticsHostResponse
{ {

View File

@@ -1,4 +1,4 @@
namespace MoonlightServers.DaemonShared.Http.Responses.Sys; namespace MoonlightServers.DaemonShared.DaemonSide.Http.Responses.Sys;
public class SystemStatusResponse public class SystemStatusResponse
{ {

View File

@@ -7,7 +7,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Http\Requests\" /> <Folder Include="DaemonSide\" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -0,0 +1,7 @@
namespace MoonlightServers.DaemonShared.PanelSide.Http.Responses;
public class AllocationDataResponse
{
public string IpAddress { get; set; }
public int Port { get; set; }
}

View File

@@ -0,0 +1,22 @@
namespace MoonlightServers.DaemonShared.PanelSide.Http.Responses;
public class ServerDataResponse
{
public int Id { get; set; }
public string StartupCommand { get; set; }
public string OnlineDetection { get; set; }
public string StopCommand { get; set; }
public string DockerImage { get; set; }
public bool PullDockerImage { get; set; }
public string ParseConiguration { get; set; }
public int Cpu { get; set; }
public int Memory { get; set; }
public int Disk { get; set; }
public bool UseVirtualDisk { get; set; }
public int Bandwidth { get; set; }
public AllocationDataResponse[] Allocations { get; set; }
public Dictionary<string, string> Variables { get; set; }
}