From 02d24b8a36f6937328abc3c3bbd73360a39ff7f2 Mon Sep 17 00:00:00 2001 From: Charles Date: Fri, 7 Jun 2024 16:23:25 -0400 Subject: [PATCH] Fix the egg variable disaster... (#331) * Migrations to update existing eggs in db * Update stock eggs * Update Eggs on import * Also update updated versions of eggs that are uploaded * Redo this.. Tests passed locally. * Pint & Update replace * Squash Migrations, simplify logic * Maybe this way... * Swap them over to single call --------- Co-authored-by: Lance Pioch --- app/Services/Eggs/EggConfigurationService.php | 36 +------- app/Services/Eggs/EggParserService.php | 21 ++++- .../Eggs/Sharing/EggImporterService.php | 1 + .../eggs/minecraft/egg-bungeecord.json | 4 +- .../eggs/minecraft/egg-forge-minecraft.json | 4 +- .../Seeders/eggs/minecraft/egg-paper.json | 4 +- .../minecraft/egg-sponge--sponge-vanilla.json | 6 +- .../eggs/minecraft/egg-vanilla-minecraft.json | 4 +- .../eggs/voice-servers/egg-mumble-server.json | 4 +- ..._05_220135_update_egg_config_variables.php | 92 +++++++++++++++++++ 10 files changed, 127 insertions(+), 49 deletions(-) create mode 100644 database/migrations/2024_06_05_220135_update_egg_config_variables.php diff --git a/app/Services/Eggs/EggConfigurationService.php b/app/Services/Eggs/EggConfigurationService.php index 5280688ee..cfe458403 100644 --- a/app/Services/Eggs/EggConfigurationService.php +++ b/app/Services/Eggs/EggConfigurationService.php @@ -124,38 +124,6 @@ class EggConfigurationService return $response; } - /** - * Replaces the legacy modifies from eggs with their new counterpart. The legacy Daemon would - * set SERVER_MEMORY, SERVER_IP, and SERVER_PORT with their respective values on the Daemon - * side. Ensure that anything referencing those properly replaces them with the matching config - * value. - */ - protected function replaceLegacyModifiers(string $key, string $value): string - { - switch ($key) { - case 'config.docker.interface': - $replace = 'config.docker.network.interface'; - break; - case 'server.build.env.SERVER_MEMORY': - case 'env.SERVER_MEMORY': - $replace = 'server.build.memory'; - break; - case 'server.build.env.SERVER_IP': - case 'env.SERVER_IP': - $replace = 'server.build.default.ip'; - break; - case 'server.build.env.SERVER_PORT': - case 'env.SERVER_PORT': - $replace = 'server.build.default.port'; - break; - default: - // By default, we don't need to change anything, only if we ended up matching a specific legacy item. - $replace = $key; - } - - return str_replace("{{{$key}}}", "{{{$replace}}}", $value); - } - protected function matchAndReplaceKeys(mixed $value, array $structure): mixed { preg_match_all('/{{(?[\w.-]*)}}/', $value, $matches); @@ -175,8 +143,6 @@ class EggConfigurationService continue; } - $value = $this->replaceLegacyModifiers($key, $value); - // We don't want to do anything with config keys since the Daemon will need to handle // that. For example, the Spigot egg uses "config.docker.interface" to identify the Docker // interface to proxy through, but the Panel would be unaware of that. @@ -198,7 +164,7 @@ class EggConfigurationService // variable from the server configuration. $plucked = Arr::get( $structure, - preg_replace('/^env\./', 'build.env.', $key), + preg_replace('/^env\./', 'build.environment.', $key), '' ); diff --git a/app/Services/Eggs/EggParserService.php b/app/Services/Eggs/EggParserService.php index dfb2e2631..d780a9f94 100644 --- a/app/Services/Eggs/EggParserService.php +++ b/app/Services/Eggs/EggParserService.php @@ -10,6 +10,16 @@ use App\Exceptions\Service\InvalidFileUploadException; class EggParserService { + public const UPGRADE_VARIABLES = [ + 'server.build.env.SERVER_IP' => 'server.allocations.default.ip', + 'server.build.default.ip' => 'server.allocations.default.ip', + 'server.build.env.SERVER_PORT' => 'server.allocations.default.port', + 'server.build.default.port' => 'server.allocations.default.port', + 'server.build.env.SERVER_MEMORY' => 'server.build.memory_limit', + 'server.build.memory' => 'server.build.memory_limit', + 'server.build.env' => 'server.build.environment', + ]; + /** * Takes an uploaded file and parses out the egg configuration from within. * @@ -26,11 +36,20 @@ class EggParserService $version = $parsed['meta']['version'] ?? ''; - return match ($version) { + $parsed = match ($version) { 'PTDL_v1' => $this->convertToV2($parsed), 'PTDL_v2' => $parsed, default => throw new InvalidFileUploadException('The JSON file provided is not in a format that can be recognized.') }; + + // Make sure we only use recent variable format from now on + $parsed['config']['files'] = str_replace( + array_keys(self::UPGRADE_VARIABLES), + array_values(self::UPGRADE_VARIABLES), + $parsed['config']['files'] ?? '', + ); + + return $parsed; } /** diff --git a/app/Services/Eggs/Sharing/EggImporterService.php b/app/Services/Eggs/Sharing/EggImporterService.php index 7ed7f010a..23ef0c819 100644 --- a/app/Services/Eggs/Sharing/EggImporterService.php +++ b/app/Services/Eggs/Sharing/EggImporterService.php @@ -45,4 +45,5 @@ class EggImporterService return $egg; }); } + } diff --git a/database/Seeders/eggs/minecraft/egg-bungeecord.json b/database/Seeders/eggs/minecraft/egg-bungeecord.json index 99aeea036..d6d15c3fc 100644 --- a/database/Seeders/eggs/minecraft/egg-bungeecord.json +++ b/database/Seeders/eggs/minecraft/egg-bungeecord.json @@ -4,7 +4,7 @@ "version": "PTDL_v2", "update_url": null }, - "exported_at": "2024-06-02T20:42:01+00:00", + "exported_at": "2024-06-04T22:51:49+00:00", "name": "Bungeecord", "author": "panel@example.com", "uuid": "9e6b409e-4028-4947-aea8-50a2c404c271", @@ -24,7 +24,7 @@ "file_denylist": [], "startup": "java -Xms128M -XX:MaxRAMPercentage=95.0 -jar {{SERVER_JARFILE}}", "config": { - "files": "{\r\n \"config.yml\": {\r\n \"parser\": \"yaml\",\r\n \"find\": {\r\n \"listeners[0].query_port\": \"{{server.build.default.port}}\",\r\n \"listeners[0].host\": \"0.0.0.0:{{server.build.default.port}}\",\r\n \"servers.*.address\": {\r\n \"regex:^(127\\\\.0\\\\.0\\\\.1|localhost)(:\\\\d{1,5})?$\": \"{{config.docker.interface}}$2\"\r\n }\r\n }\r\n }\r\n}", + "files": "{\r\n \"config.yml\": {\r\n \"parser\": \"yaml\",\r\n \"find\": {\r\n \"listeners[0].query_port\": \"{{server.allocations.default.port}}\",\r\n \"listeners[0].host\": \"0.0.0.0:{{server.allocations.default.port}}\",\r\n \"servers.*.address\": {\r\n \"regex:^(127\\\\.0\\\\.0\\\\.1|localhost)(:\\\\d{1,5})?$\": \"{{config.docker.interface}}$2\"\r\n }\r\n }\r\n }\r\n}", "startup": "{\r\n \"done\": \"Listening on \"\r\n}", "logs": "{}", "stop": "end" diff --git a/database/Seeders/eggs/minecraft/egg-forge-minecraft.json b/database/Seeders/eggs/minecraft/egg-forge-minecraft.json index 543fb2dc0..6875e79ae 100644 --- a/database/Seeders/eggs/minecraft/egg-forge-minecraft.json +++ b/database/Seeders/eggs/minecraft/egg-forge-minecraft.json @@ -4,7 +4,7 @@ "version": "PTDL_v2", "update_url": null }, - "exported_at": "2024-06-02T20:42:02+00:00", + "exported_at": "2024-06-04T22:51:58+00:00", "name": "Forge Minecraft", "author": "panel@example.com", "uuid": "ed072427-f209-4603-875c-f540c6dd5a65", @@ -24,7 +24,7 @@ "file_denylist": [], "startup": "java -Xms128M -XX:MaxRAMPercentage=95.0 -Dterminal.jline=false -Dterminal.ansi=true $( [[ ! -f unix_args.txt ]] && printf %s \"-jar {{SERVER_JARFILE}}\" || printf %s \"@unix_args.txt\" )", "config": { - "files": "{\r\n \"server.properties\": {\r\n \"parser\": \"properties\",\r\n \"find\": {\r\n \"server-ip\": \"0.0.0.0\",\r\n \"server-port\": \"{{server.build.default.port}}\",\r\n \"query.port\": \"{{server.build.default.port}}\"\r\n }\r\n }\r\n}", + "files": "{\r\n \"server.properties\": {\r\n \"parser\": \"properties\",\r\n \"find\": {\r\n \"server-ip\": \"0.0.0.0\",\r\n \"server-port\": \"{{server.allocations.default.port}}\",\r\n \"query.port\": \"{{server.allocations.default.port}}\"\r\n }\r\n }\r\n}", "startup": "{\r\n \"done\": \")! For help, type \"\r\n}", "logs": "{}", "stop": "stop" diff --git a/database/Seeders/eggs/minecraft/egg-paper.json b/database/Seeders/eggs/minecraft/egg-paper.json index 3337a84cc..8eb3002ec 100644 --- a/database/Seeders/eggs/minecraft/egg-paper.json +++ b/database/Seeders/eggs/minecraft/egg-paper.json @@ -4,7 +4,7 @@ "version": "PTDL_v2", "update_url": null }, - "exported_at": "2024-06-02T20:42:02+00:00", + "exported_at": "2024-06-04T22:51:57+00:00", "name": "Paper", "author": "parker@example.com", "uuid": "5da37ef6-58da-4169-90a6-e683e1721247", @@ -24,7 +24,7 @@ "file_denylist": [], "startup": "java -Xms128M -XX:MaxRAMPercentage=95.0 -Dterminal.jline=false -Dterminal.ansi=true -jar {{SERVER_JARFILE}}", "config": { - "files": "{\r\n \"server.properties\": {\r\n \"parser\": \"properties\",\r\n \"find\": {\r\n \"server-ip\": \"0.0.0.0\",\r\n \"server-port\": \"{{server.build.default.port}}\",\r\n \"query.port\": \"{{server.build.default.port}}\"\r\n }\r\n }\r\n}", + "files": "{\r\n \"server.properties\": {\r\n \"parser\": \"properties\",\r\n \"find\": {\r\n \"server-ip\": \"0.0.0.0\",\r\n \"server-port\": \"{{server.allocations.default.port}}\",\r\n \"query.port\": \"{{server.allocations.default.port}}\"\r\n }\r\n }\r\n}", "startup": "{\r\n \"done\": \")! For help, type \"\r\n}", "logs": "{}", "stop": "stop" diff --git a/database/Seeders/eggs/minecraft/egg-sponge--sponge-vanilla.json b/database/Seeders/eggs/minecraft/egg-sponge--sponge-vanilla.json index 29b52d24a..a9d0ebeef 100644 --- a/database/Seeders/eggs/minecraft/egg-sponge--sponge-vanilla.json +++ b/database/Seeders/eggs/minecraft/egg-sponge--sponge-vanilla.json @@ -4,7 +4,7 @@ "version": "PTDL_v2", "update_url": null }, - "exported_at": "2024-06-02T20:42:03+00:00", + "exported_at": "2024-06-04T22:50:55+00:00", "name": "Sponge (SpongeVanilla)", "author": "panel@example.com", "uuid": "f0d2f88f-1ff3-42a0-b03f-ac44c5571e6d", @@ -24,7 +24,7 @@ "file_denylist": [], "startup": "java -Xms128M -XX:MaxRAMPercentage=95.0 -jar {{SERVER_JARFILE}}", "config": { - "files": "{\r\n \"server.properties\": {\r\n \"parser\": \"properties\",\r\n \"find\": {\r\n \"server-ip\": \"0.0.0.0\",\r\n \"server-port\": \"{{server.build.default.port}}\",\r\n \"query.port\": \"{{server.build.default.port}}\"\r\n }\r\n }\r\n}", + "files": "{\r\n \"server.properties\": {\r\n \"parser\": \"properties\",\r\n \"find\": {\r\n \"server-ip\": \"0.0.0.0\",\r\n \"server-port\": \"{{server.allocations.default.port}}\",\r\n \"query.port\": \"{{server.allocations.default.port}}\"\r\n }\r\n }\r\n}", "startup": "{\r\n \"done\": \")! For help, type \"\r\n}", "logs": "{}", "stop": "stop" @@ -60,4 +60,4 @@ "field_type": "text" } ] -} \ No newline at end of file +} diff --git a/database/Seeders/eggs/minecraft/egg-vanilla-minecraft.json b/database/Seeders/eggs/minecraft/egg-vanilla-minecraft.json index d7bd64abf..63036eda0 100644 --- a/database/Seeders/eggs/minecraft/egg-vanilla-minecraft.json +++ b/database/Seeders/eggs/minecraft/egg-vanilla-minecraft.json @@ -4,7 +4,7 @@ "version": "PTDL_v2", "update_url": null }, - "exported_at": "2024-06-02T20:42:03+00:00", + "exported_at": "2024-06-04T22:51:16+00:00", "name": "Vanilla Minecraft", "author": "panel@example.com", "uuid": "9ac39f3d-0c34-4d93-8174-c52ab9e6c57b", @@ -24,7 +24,7 @@ "file_denylist": [], "startup": "java -Xms128M -XX:MaxRAMPercentage=95.0 -jar {{SERVER_JARFILE}}", "config": { - "files": "{\r\n \"server.properties\": {\r\n \"parser\": \"properties\",\r\n \"find\": {\r\n \"server-ip\": \"0.0.0.0\",\r\n \"server-port\": \"{{server.build.default.port}}\",\r\n \"query.port\": \"{{server.build.default.port}}\"\r\n }\r\n }\r\n}", + "files": "{\r\n \"server.properties\": {\r\n \"parser\": \"properties\",\r\n \"find\": {\r\n \"server-ip\": \"0.0.0.0\",\r\n \"server-port\": \"{{server.allocations.default.port}}\",\r\n \"query.port\": \"{{server.allocations.default.port}}\"\r\n }\r\n }\r\n}", "startup": "{\r\n \"done\": \")! For help, type \"\r\n}", "logs": "{}", "stop": "stop" diff --git a/database/Seeders/eggs/voice-servers/egg-mumble-server.json b/database/Seeders/eggs/voice-servers/egg-mumble-server.json index 1278c26e3..fd7ecf679 100644 --- a/database/Seeders/eggs/voice-servers/egg-mumble-server.json +++ b/database/Seeders/eggs/voice-servers/egg-mumble-server.json @@ -4,7 +4,7 @@ "version": "PTDL_v2", "update_url": null }, - "exported_at": "2024-06-02T20:42:08+00:00", + "exported_at": "2024-06-04T22:53:03+00:00", "name": "Mumble Server", "author": "panel@example.com", "uuid": "727ee758-7fb2-4979-972b-d3eba4e1e9f0", @@ -16,7 +16,7 @@ "file_denylist": [], "startup": "mumble-server -fg -ini murmur.ini", "config": { - "files": "{\r\n \"murmur.ini\": {\r\n \"parser\": \"ini\",\r\n \"find\": {\r\n \"database\": \"\/home\/container\/murmur.sqlite\",\r\n \"logfile\": \"\/home\/container\/murmur.log\",\r\n \"port\": \"{{server.build.default.port}}\",\r\n \"host\": \"\",\r\n \"users\": \"{{server.build.env.MAX_USERS}}\"\r\n }\r\n }\r\n}", + "files": "{\r\n \"murmur.ini\": {\r\n \"parser\": \"ini\",\r\n \"find\": {\r\n \"database\": \"\/home\/container\/murmur.sqlite\",\r\n \"logfile\": \"\/home\/container\/murmur.log\",\r\n \"port\": \"{{server.allocations.default.port}}\",\r\n \"host\": \"\",\r\n \"users\": \"{{server.environment.MAX_USERS}}\"\r\n }\r\n }\r\n}", "startup": "{\r\n \"done\": \"Server listening on\"\r\n}", "logs": "{}", "stop": "^C" diff --git a/database/migrations/2024_06_05_220135_update_egg_config_variables.php b/database/migrations/2024_06_05_220135_update_egg_config_variables.php new file mode 100644 index 000000000..d8c60d3f9 --- /dev/null +++ b/database/migrations/2024_06_05_220135_update_egg_config_variables.php @@ -0,0 +1,92 @@ +get(); + + foreach ($eggs as $egg) { + $updatedPort = str_replace( + 'server.build.default.port', + 'server.allocations.default.port', + $egg->config_files + ); + + if ($updatedPort !== $egg->config_files) { + $egg->config_files = $updatedPort; + echo "Processed Port update with ID: {$egg->name}\n"; + } + + $updatedIp = str_replace( + 'server.build.default.ip', + 'server.allocations.default.ip', + $egg->config_files + ); + + if ($updatedIp !== $egg->config_files) { + $egg->config_files = $updatedIp; + echo "Processed IP update with ID: {$egg->name}\n"; + } + + $updatedEnv = str_replace( + 'server.build.env.', + 'server.environment.', + $egg->config_files + ); + + if ($updatedEnv !== $egg->config_files) { + $egg->config_files = $updatedEnv; + echo "Processed ENV update with ID: {$egg->name}\n"; + } + + DB::table('eggs') + ->where('id', $egg->id) + ->update(['config_files' => $egg->config_files]); + } + } + + public function down(): void + { + $eggs = DB::table('eggs')->get(); + + foreach ($eggs as $egg) { + $revertedEnv = str_replace( + 'server.environment.', + 'server.build.env.', + $egg->config_files + ); + + if ($revertedEnv !== $egg->config_files) { + $egg->config_files = $revertedEnv; + } + + $revertedIp = str_replace( + 'server.allocations.default.ip', + 'server.build.default.ip', + $egg->config_files + ); + + if ($revertedIp !== $egg->config_files) { + $egg->config_files = $revertedIp; + } + + $revertedPort = str_replace( + 'server.allocations.default.port', + 'server.build.default.port', + $egg->config_files + ); + + if ($revertedPort !== $egg->config_files) { + $egg->config_files = $revertedPort; + } + + DB::table('eggs') + ->where('id', $egg->id) + ->update(['config_files' => $egg->config_files]); + } + } +};