Implemented first iteration of the docker-based server installer. Added restore functionality for the installer. Wired up for basic installer testing
This commit is contained in:
@@ -5,6 +5,7 @@ public interface IInstaller : IServerComponent
|
||||
public IAsyncObservable<object> OnExited { get; }
|
||||
public bool IsRunning { get; }
|
||||
|
||||
public Task Setup();
|
||||
public Task Start();
|
||||
public Task Abort();
|
||||
public Task Cleanup();
|
||||
|
||||
@@ -122,7 +122,7 @@ public class Server : IAsyncDisposable
|
||||
.Permit(ServerTrigger.Exited, ServerState.Offline);
|
||||
|
||||
StateMachine.Configure(ServerState.Installing)
|
||||
.Permit(ServerTrigger.FailSafe, ServerState.Offline)
|
||||
.Permit(ServerTrigger.FailSafe, ServerState.Offline) // TODO: Add kill
|
||||
.Permit(ServerTrigger.Exited, ServerState.Offline);
|
||||
|
||||
// Handle transitions
|
||||
@@ -130,6 +130,10 @@ public class Server : IAsyncDisposable
|
||||
StateMachine.Configure(ServerState.Starting)
|
||||
.OnEntryAsync(HandleStart)
|
||||
.OnExitFromAsync(ServerTrigger.Exited, HandleRuntimeExit);
|
||||
|
||||
StateMachine.Configure(ServerState.Installing)
|
||||
.OnEntryAsync(HandleInstall)
|
||||
.OnExitFromAsync(ServerTrigger.Exited, HandleInstallExit);
|
||||
|
||||
StateMachine.Configure(ServerState.Online)
|
||||
.OnExitFromAsync(ServerTrigger.Exited, HandleRuntimeExit);
|
||||
@@ -199,6 +203,40 @@ public class Server : IAsyncDisposable
|
||||
await Provisioner.Deprovision();
|
||||
}
|
||||
|
||||
private async Task HandleInstall()
|
||||
{
|
||||
Logger.LogDebug("Installing");
|
||||
|
||||
Logger.LogDebug("Setting up");
|
||||
await Console.WriteToMoonlight("Setting up installation");
|
||||
|
||||
// TODO: Extract to service
|
||||
|
||||
Context.InstallConfiguration = new()
|
||||
{
|
||||
Shell = "/bin/ash",
|
||||
DockerImage = "ghcr.io/parkervcp/installers:alpine",
|
||||
Script =
|
||||
"#!/bin/ash\n# Paper Installation Script\n#\n# Server Files: /mnt/server\nPROJECT=paper\n\nif [ -n \"${DL_PATH}\" ]; then\n\techo -e \"Using supplied download url: ${DL_PATH}\"\n\tDOWNLOAD_URL=`eval echo $(echo ${DL_PATH} | sed -e 's/{{/${/g' -e 's/}}/}/g')`\nelse\n\tVER_EXISTS=`curl -s https://api.papermc.io/v2/projects/${PROJECT} | jq -r --arg VERSION $MINECRAFT_VERSION '.versions[] | contains($VERSION)' | grep -m1 true`\n\tLATEST_VERSION=`curl -s https://api.papermc.io/v2/projects/${PROJECT} | jq -r '.versions' | jq -r '.[-1]'`\n\n\tif [ \"${VER_EXISTS}\" == \"true\" ]; then\n\t\techo -e \"Version is valid. Using version ${MINECRAFT_VERSION}\"\n\telse\n\t\techo -e \"Specified version not found. Defaulting to the latest ${PROJECT} version\"\n\t\tMINECRAFT_VERSION=${LATEST_VERSION}\n\tfi\n\n\tBUILD_EXISTS=`curl -s https://api.papermc.io/v2/projects/${PROJECT}/versions/${MINECRAFT_VERSION} | jq -r --arg BUILD ${BUILD_NUMBER} '.builds[] | tostring | contains($BUILD)' | grep -m1 true`\n\tLATEST_BUILD=`curl -s https://api.papermc.io/v2/projects/${PROJECT}/versions/${MINECRAFT_VERSION} | jq -r '.builds' | jq -r '.[-1]'`\n\n\tif [ \"${BUILD_EXISTS}\" == \"true\" ]; then\n\t\techo -e \"Build is valid for version ${MINECRAFT_VERSION}. Using build ${BUILD_NUMBER}\"\n\telse\n\t\techo -e \"Using the latest ${PROJECT} build for version ${MINECRAFT_VERSION}\"\n\t\tBUILD_NUMBER=${LATEST_BUILD}\n\tfi\n\n\tJAR_NAME=${PROJECT}-${MINECRAFT_VERSION}-${BUILD_NUMBER}.jar\n\n\techo \"Version being downloaded\"\n\techo -e \"MC Version: ${MINECRAFT_VERSION}\"\n\techo -e \"Build: ${BUILD_NUMBER}\"\n\techo -e \"JAR Name of Build: ${JAR_NAME}\"\n\tDOWNLOAD_URL=https://api.papermc.io/v2/projects/${PROJECT}/versions/${MINECRAFT_VERSION}/builds/${BUILD_NUMBER}/downloads/${JAR_NAME}\nfi\n\ncd /mnt/server\n\necho -e \"Running curl -o ${SERVER_JARFILE} ${DOWNLOAD_URL}\"\n\nif [ -f ${SERVER_JARFILE} ]; then\n\tmv ${SERVER_JARFILE} ${SERVER_JARFILE}.old\nfi\n\ncurl -o ${SERVER_JARFILE} ${DOWNLOAD_URL}\n\nif [ ! -f server.properties ]; then\n echo -e \"Downloading MC server.properties\"\n curl -o server.properties https://raw.githubusercontent.com/parkervcp/eggs/master/minecraft/java/server.properties\nfi"
|
||||
};
|
||||
|
||||
await Installer.Setup();
|
||||
|
||||
await Console.AttachToInstallation();
|
||||
|
||||
await Installer.Start();
|
||||
}
|
||||
|
||||
private async Task HandleInstallExit()
|
||||
{
|
||||
Logger.LogDebug("Installation done");
|
||||
await Console.WriteToMoonlight("Cleaning up");
|
||||
|
||||
await Installer.Cleanup();
|
||||
|
||||
await Console.WriteToMoonlight("Installation completed");
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public async ValueTask DisposeAsync()
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using MoonlightServers.Daemon.Models.Cache;
|
||||
using MoonlightServers.DaemonShared.PanelSide.Http.Responses;
|
||||
|
||||
namespace MoonlightServers.Daemon.ServerSys.Abstractions;
|
||||
|
||||
@@ -6,4 +7,5 @@ public record ServerContext
|
||||
{
|
||||
public ServerConfiguration Configuration { get; set; }
|
||||
public AsyncServiceScope ServiceScope { get; set; }
|
||||
public ServerInstallDataResponse InstallConfiguration { get; set; }
|
||||
}
|
||||
Reference in New Issue
Block a user