From 6c2d0a2d50f764f25ff92a7d27157e094db631e4 Mon Sep 17 00:00:00 2001 From: Lance Pioch Date: Sun, 2 Jun 2024 21:59:12 -0400 Subject: [PATCH 01/16] Remove shenanigans --- app/Services/Nodes/NodeUpdateService.php | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/app/Services/Nodes/NodeUpdateService.php b/app/Services/Nodes/NodeUpdateService.php index f948686ed..708605b19 100644 --- a/app/Services/Nodes/NodeUpdateService.php +++ b/app/Services/Nodes/NodeUpdateService.php @@ -32,21 +32,10 @@ class NodeUpdateService $data['daemon_token_id'] = Str::random(Node::DAEMON_TOKEN_ID_LENGTH); } - [$updated, $exception] = $this->connection->transaction(function () use ($data, $node) { - /** @var \App\Models\Node $updated */ - $updated = $node->replicate(); - $updated->forceFill($data)->save(); + [$node, $exception] = $this->connection->transaction(function () use ($data, $node) { + $node->forceFill($data)->save(); try { - // If we're changing the FQDN for the node, use the newly provided FQDN for the connection - // address. This should alleviate issues where the node gets pointed to a "valid" FQDN that - // isn't actually running the daemon software, and therefore you can't actually change it - // back. - // - // This makes more sense anyways, because only the Panel uses the FQDN for connecting, the - // node doesn't actually care about this. - $node->fqdn = $updated->fqdn; - - $this->configurationRepository->setNode($node)->update($updated); + $this->configurationRepository->setNode($node)->update($node); } catch (DaemonConnectionException $exception) { logger()->warning($exception, ['node_id' => $node->id]); @@ -56,16 +45,16 @@ class NodeUpdateService // // This avoids issues with proxies such as Cloudflare which will see daemon as offline and then // inject their own response pages, causing this logic to get fucked up. - return [$updated, true]; + return [$node, true]; } - return [$updated, false]; + return [$node, false]; }); if ($exception) { throw new ConfigurationNotPersistedException(trans('exceptions.node.daemon_off_config_updated')); } - return $updated; + return $node; } } From 6f009ee1268070f11cf3617ead460a25279add71 Mon Sep 17 00:00:00 2001 From: Charles Date: Wed, 5 Jun 2024 14:15:33 -0400 Subject: [PATCH 02/16] Remove cli from php Every workflow run hangs at attempting to add the cli package and adds ~1 min to the workflow. --- .github/workflows/ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 998654549..1e4cdc0fd 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -59,7 +59,7 @@ jobs: uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} - extensions: bcmath, cli, curl, gd, mbstring, mysql, openssl, pdo, tokenizer, xml, zip + extensions: bcmath, curl, gd, mbstring, mysql, openssl, pdo, tokenizer, xml, zip tools: composer:v2 coverage: none @@ -119,7 +119,7 @@ jobs: uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} - extensions: bcmath, cli, curl, gd, mbstring, mysql, openssl, pdo, tokenizer, xml, zip + extensions: bcmath, curl, gd, mbstring, mysql, openssl, pdo, tokenizer, xml, zip tools: composer:v2 coverage: none From 6f1de675237d0b31d120cfc6a35c8ff7b6d39684 Mon Sep 17 00:00:00 2001 From: Lance Pioch Date: Wed, 5 Jun 2024 16:03:04 -0400 Subject: [PATCH 03/16] Remove extraneous parameters --- .../Controllers/Admin/Nodes/NodeController.php | 3 +-- .../Admin/Nodes/NodeViewController.php | 17 +++++------------ .../Admin/Servers/ServerController.php | 3 +-- app/Http/Controllers/Admin/UserController.php | 2 +- 4 files changed, 8 insertions(+), 17 deletions(-) diff --git a/app/Http/Controllers/Admin/Nodes/NodeController.php b/app/Http/Controllers/Admin/Nodes/NodeController.php index b02ada668..f4d7982cf 100644 --- a/app/Http/Controllers/Admin/Nodes/NodeController.php +++ b/app/Http/Controllers/Admin/Nodes/NodeController.php @@ -3,7 +3,6 @@ namespace App\Http\Controllers\Admin\Nodes; use Illuminate\View\View; -use Illuminate\Http\Request; use App\Models\Node; use Spatie\QueryBuilder\QueryBuilder; use App\Http\Controllers\Controller; @@ -13,7 +12,7 @@ class NodeController extends Controller /** * Returns a listing of nodes on the system. */ - public function index(Request $request): View + public function index(): View { $nodes = QueryBuilder::for( Node::query()->withCount('servers') diff --git a/app/Http/Controllers/Admin/Nodes/NodeViewController.php b/app/Http/Controllers/Admin/Nodes/NodeViewController.php index 9407ef2a7..95dc7ede0 100644 --- a/app/Http/Controllers/Admin/Nodes/NodeViewController.php +++ b/app/Http/Controllers/Admin/Nodes/NodeViewController.php @@ -3,7 +3,6 @@ namespace App\Http\Controllers\Admin\Nodes; use Illuminate\View\View; -use Illuminate\Http\Request; use App\Models\Node; use Illuminate\Support\Collection; use App\Models\Allocation; @@ -29,16 +28,10 @@ class NodeViewController extends Controller /** * Returns index view for a specific node on the system. */ - public function index(Request $request, Node $node): View + public function index(Node $node): View { $node->loadCount('servers'); - $stats = Node::query() - ->selectRaw('IFNULL(SUM(servers.memory), 0) as sum_memory, IFNULL(SUM(servers.disk), 0) as sum_disk') - ->join('servers', 'servers.node_id', '=', 'nodes.id') - ->where('node_id', '=', $node->id) - ->first(); - return view('admin.nodes.view.index', [ 'node' => $node, 'version' => $this->versionService, @@ -48,7 +41,7 @@ class NodeViewController extends Controller /** * Returns the settings page for a specific node. */ - public function settings(Request $request, Node $node): View + public function settings(Node $node): View { return view('admin.nodes.view.settings', [ 'node' => $node, @@ -58,7 +51,7 @@ class NodeViewController extends Controller /** * Return the node configuration page for a specific node. */ - public function configuration(Request $request, Node $node): View + public function configuration(Node $node): View { return view('admin.nodes.view.configuration', compact('node')); } @@ -66,7 +59,7 @@ class NodeViewController extends Controller /** * Return the node allocation management page. */ - public function allocations(Request $request, Node $node): View + public function allocations(Node $node): View { $node->setRelation( 'allocations', @@ -92,7 +85,7 @@ class NodeViewController extends Controller /** * Return a listing of servers that exist for this specific node. */ - public function servers(Request $request, Node $node): View + public function servers(Node $node): View { $this->plainInject([ 'node' => Collection::wrap($node->makeVisible(['daemon_token_id', 'daemon_token'])) diff --git a/app/Http/Controllers/Admin/Servers/ServerController.php b/app/Http/Controllers/Admin/Servers/ServerController.php index 06853e49e..5e4595225 100644 --- a/app/Http/Controllers/Admin/Servers/ServerController.php +++ b/app/Http/Controllers/Admin/Servers/ServerController.php @@ -3,7 +3,6 @@ namespace App\Http\Controllers\Admin\Servers; use Illuminate\View\View; -use Illuminate\Http\Request; use App\Models\Server; use Spatie\QueryBuilder\QueryBuilder; use Spatie\QueryBuilder\AllowedFilter; @@ -16,7 +15,7 @@ class ServerController extends Controller * Returns all the servers that exist on the system using a paginated result set. If * a query is passed along in the request it is also passed to the repository function. */ - public function index(Request $request): View + public function index(): View { $servers = QueryBuilder::for(Server::query()->with('node', 'user', 'allocation')) ->allowedFilters([ diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 33ced4b75..d69dc4301 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -37,7 +37,7 @@ class UserController extends Controller /** * Display user index page. */ - public function index(Request $request): View + public function index(): View { $users = QueryBuilder::for( User::query()->select('users.*') From df26c4f9f52572a8cc3f25b289940b470cc50d56 Mon Sep 17 00:00:00 2001 From: Lance Pioch Date: Wed, 5 Jun 2024 21:49:09 -0400 Subject: [PATCH 04/16] Better exception handling --- .../TwoFactorAuthenticationTokenInvalid.php | 6 ++--- .../Resources/UserResource/Pages/EditUser.php | 6 +++++ .../Exceptions/FilamentExceptionHandler.php | 24 +++++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 app/Services/Exceptions/FilamentExceptionHandler.php diff --git a/app/Exceptions/Service/User/TwoFactorAuthenticationTokenInvalid.php b/app/Exceptions/Service/User/TwoFactorAuthenticationTokenInvalid.php index 38771a453..d5f09884c 100644 --- a/app/Exceptions/Service/User/TwoFactorAuthenticationTokenInvalid.php +++ b/app/Exceptions/Service/User/TwoFactorAuthenticationTokenInvalid.php @@ -6,9 +6,9 @@ use App\Exceptions\DisplayException; class TwoFactorAuthenticationTokenInvalid extends DisplayException { - /** - * TwoFactorAuthenticationTokenInvalid constructor. - */ + public string $title = 'Invalid 2FA Code'; + public string $icon = 'tabler-2fa'; + public function __construct() { parent::__construct('The provided two-factor authentication token was not valid.'); diff --git a/app/Filament/Resources/UserResource/Pages/EditUser.php b/app/Filament/Resources/UserResource/Pages/EditUser.php index e12e4de40..4750ce28f 100644 --- a/app/Filament/Resources/UserResource/Pages/EditUser.php +++ b/app/Filament/Resources/UserResource/Pages/EditUser.php @@ -3,6 +3,7 @@ namespace App\Filament\Resources\UserResource\Pages; use App\Filament\Resources\UserResource; +use App\Services\Exceptions\FilamentExceptionHandler; use Filament\Actions; use Filament\Resources\Pages\EditRecord; use App\Models\User; @@ -77,4 +78,9 @@ class EditUser extends EditRecord { return []; } + + public function exception($exception, $stopPropagation): void + { + (new FilamentExceptionHandler())->handle($exception, $stopPropagation); + } } diff --git a/app/Services/Exceptions/FilamentExceptionHandler.php b/app/Services/Exceptions/FilamentExceptionHandler.php new file mode 100644 index 000000000..2898f6c2c --- /dev/null +++ b/app/Services/Exceptions/FilamentExceptionHandler.php @@ -0,0 +1,24 @@ +title($exception->title ?? null) + ->body($exception->body ?? $exception->getMessage()) + ->color($exception->color ?? 'danger') + ->icon($exception->icon ?? 'tabler-x') + ->danger() + ->send(); + + if ($this->stopPropagation ?? true) { + $stopPropagation(); + } + } +} From a4435a7454c8410d6680527232a7c58ebe20d611 Mon Sep 17 00:00:00 2001 From: Lance Pioch Date: Wed, 5 Jun 2024 22:12:53 -0400 Subject: [PATCH 05/16] Pint fix --- app/Services/Exceptions/FilamentExceptionHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Services/Exceptions/FilamentExceptionHandler.php b/app/Services/Exceptions/FilamentExceptionHandler.php index 2898f6c2c..328e944b0 100644 --- a/app/Services/Exceptions/FilamentExceptionHandler.php +++ b/app/Services/Exceptions/FilamentExceptionHandler.php @@ -7,7 +7,7 @@ use Filament\Notifications\Notification; class FilamentExceptionHandler { - public function handle(Exception $exception, Callable $stopPropagation): void + public function handle(Exception $exception, callable $stopPropagation): void { Notification::make() ->title($exception->title ?? null) From d68e7218a88c2d82780d508304a27f4e05f46864 Mon Sep 17 00:00:00 2001 From: Lance Pioch Date: Wed, 5 Jun 2024 23:37:09 -0400 Subject: [PATCH 06/16] Reformat as table --- readme.md | 58 +++++++++++++++---------------------------------------- 1 file changed, 16 insertions(+), 42 deletions(-) diff --git a/readme.md b/readme.md index a78646139..1d79e32d8 100644 --- a/readme.md +++ b/readme.md @@ -26,46 +26,20 @@ This gives you the power to run game servers without bloating machines with a ho Some of our popular eggs include but are not limited to: -* [Minecraft](https://github.com/pelican-eggs/minecraft) - * Paper - * Sponge - * Bungeecord - * Waterfall -* [SteamCMD](https://github.com/pelican-eggs/steamcmd) - * 7 Days to Die - * ARK: Survival - * ARMA - * Counter Strike - * DayZ - * Enshrouded - * Left 4 Dead - * Palworld - * Project Zomboid - * Sons of the Forest -* [Other Games](https://github.com/pelican-eggs/games) - * Among Us - * Factorio - * GTA - * Rimworld - * Terraria -* [Discord Bots](https://github.com/pelican-eggs/chatbots) - * Redbot - * JMusicBot - * SinusBot - * Dynamica -* [Software](https://github.com/pelican-eggs/software) -* [Programming Languages](https://github.com/pelican-eggs/generic) - * C# - * Java - * Lua - * Node.js - * Python -* [Database](https://github.com/pelican-eggs/database) - * Redis - * MariaDB - * PostgreSQL -* [Voice Servers](https://github.com/pelican-eggs/voice) -* [Storage](https://github.com/pelican-eggs/storage) -* [Monitoring](https://github.com/pelican-eggs/monitoring) +| Category | Eggs | | | | +|----------------------------------------------------------------------|-----------------|---------------|--------------------|----------------| +| [Minecraft](https://github.com/pelican-eggs/minecraft) | Paper | Sponge | Bungeecord | Waterfall | +| [SteamCMD](https://github.com/pelican-eggs/steamcmd) | 7 Days to Die | ARK: Survival | Arma 3 | Counter Strike | +| | DayZ | Enshrouded | Left 4 Dead | Palworld | +| | Project Zomboid | Satisfactory | Sons of the Forest | Starbound | +| [Standalone Games](https://github.com/pelican-eggs/games-standalone) | Among Us | Factorio | FTL | GTA | +| | Kerbal Space | Mindustry | Rimworld | Terraria | +| [Discord Bots](https://github.com/pelican-eggs/chatbots) | Redbot | JMusicBot | JMusicBot | Dynamica | +| [Voice Servers](https://github.com/pelican-eggs/voice) | Mumble | Teamspeak | Lavalink | | +| [Software](https://github.com/pelican-eggs/software) | Elasticsearch | Gitea | Grafana | RabbitMQ | +| [Programming](https://github.com/pelican-eggs/generic) | Node.js | Python | Java | C# | +| [Databases](https://github.com/pelican-eggs/database) | Redis | MariaDB | PostgreSQL | MongoDB | +| [Storage](https://github.com/pelican-eggs/storage) | S3 | SFTP Share | | | +| [Monitoring](https://github.com/pelican-eggs/monitoring) | Prometheus | Loki | | | -Copyright PelicanĀ® 2024 +*Copyright PelicanĀ® 2024* From 3010e3d61ecb51588d68a96a5f190eea7ddaf938 Mon Sep 17 00:00:00 2001 From: Lance Pioch Date: Wed, 5 Jun 2024 23:37:12 -0400 Subject: [PATCH 07/16] Better default --- app/Filament/Resources/ServerResource/Pages/CreateServer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Filament/Resources/ServerResource/Pages/CreateServer.php b/app/Filament/Resources/ServerResource/Pages/CreateServer.php index 7973349eb..a4b73abe5 100644 --- a/app/Filament/Resources/ServerResource/Pages/CreateServer.php +++ b/app/Filament/Resources/ServerResource/Pages/CreateServer.php @@ -583,7 +583,7 @@ class CreateServer extends CreateRecord Forms\Components\Hidden::make('io') ->helperText('The IO performance relative to other running containers') ->label('Block IO Proportion') - ->default(500), + ->default(0), Forms\Components\Grid::make() ->columns(4) From e0d7a094ab21860448aba3fff9d7942c95728a29 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Thu, 6 Jun 2024 10:18:05 +0200 Subject: [PATCH 08/16] add helper text to mounts --- app/Filament/Resources/ServerResource/Pages/EditServer.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Filament/Resources/ServerResource/Pages/EditServer.php b/app/Filament/Resources/ServerResource/Pages/EditServer.php index ec93fa9c6..e425a0331 100644 --- a/app/Filament/Resources/ServerResource/Pages/EditServer.php +++ b/app/Filament/Resources/ServerResource/Pages/EditServer.php @@ -576,6 +576,7 @@ class EditServer extends EditRecord ->options(fn (Server $server) => $server->node->mounts->mapWithKeys(fn ($mount) => [$mount->id => $mount->name])) ->descriptions(fn (Server $server) => $server->node->mounts->mapWithKeys(fn ($mount) => [$mount->id => "$mount->source -> $mount->target"])) ->label('Mounts') + ->helperText(fn (Server $server) => $server->node->mounts->isNotEmpty() ? '' : 'No Mounts exist for this Node') ->columnSpanFull(), ]), Tabs\Tab::make('Databases') From d245751c979e5885f4a7392b15b147ce4ddf8eb4 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Thu, 6 Jun 2024 11:59:24 +0200 Subject: [PATCH 09/16] use env value instead of config value --- app/Console/Commands/Environment/DatabaseSettingsCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Console/Commands/Environment/DatabaseSettingsCommand.php b/app/Console/Commands/Environment/DatabaseSettingsCommand.php index b06671f54..bc71a3419 100644 --- a/app/Console/Commands/Environment/DatabaseSettingsCommand.php +++ b/app/Console/Commands/Environment/DatabaseSettingsCommand.php @@ -98,7 +98,7 @@ class DatabaseSettingsCommand extends Command } elseif ($this->variables['DB_CONNECTION'] === 'sqlite') { $this->variables['DB_DATABASE'] = $this->option('database') ?? $this->ask( 'Database Path', - config('database.connections.sqlite.database', 'database.sqlite') + env('DB_DATABASE', 'database.sqlite') ); } From 91bf38b63d82056c27a268bbea0088c61f6756fc Mon Sep 17 00:00:00 2001 From: Boy132 Date: Thu, 6 Jun 2024 15:53:29 +0200 Subject: [PATCH 10/16] fix schedules running every minute --- app/Console/Commands/Schedule/ProcessRunnableCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Console/Commands/Schedule/ProcessRunnableCommand.php b/app/Console/Commands/Schedule/ProcessRunnableCommand.php index 687752a2d..0ebda2cdb 100644 --- a/app/Console/Commands/Schedule/ProcessRunnableCommand.php +++ b/app/Console/Commands/Schedule/ProcessRunnableCommand.php @@ -24,7 +24,7 @@ class ProcessRunnableCommand extends Command ->whereRelation('server', fn (Builder $builder) => $builder->whereNull('status')) ->where('is_active', true) ->where('is_processing', false) - ->whereDate('next_run_at', '<=', Carbon::now()->toDateString()) + ->whereDate('next_run_at', '<=', Carbon::now()->toDateTimeString()) ->get(); if ($schedules->count() < 1) { From 51cd7a8e814837d358728888b6a0803c3a9657bb Mon Sep 17 00:00:00 2001 From: Lance Pioch Date: Thu, 6 Jun 2024 16:15:35 -0400 Subject: [PATCH 11/16] Remove unused route files --- bootstrap/app.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/bootstrap/app.php b/bootstrap/app.php index fa0504e38..18295a393 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -9,10 +9,7 @@ return Application::configure(basePath: dirname(__DIR__)) \Prologue\Alerts\AlertsServiceProvider::class, ]) ->withRouting( - web: __DIR__.'/../routes/web.php', - // api: __DIR__.'/../routes/api.php', commands: __DIR__.'/../routes/console.php', - // channels: __DIR__.'/../routes/channels.php', health: '/up', ) ->withMiddleware(function (Middleware $middleware) { From 643e4168b9498cacfa4e5835bd3ca01ba0bc0828 Mon Sep 17 00:00:00 2001 From: Lance Pioch Date: Thu, 6 Jun 2024 19:39:46 -0400 Subject: [PATCH 12/16] Add required rule separately --- .../Resources/ServerResource/Pages/CreateServer.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/Filament/Resources/ServerResource/Pages/CreateServer.php b/app/Filament/Resources/ServerResource/Pages/CreateServer.php index 7973349eb..1abae3d30 100644 --- a/app/Filament/Resources/ServerResource/Pages/CreateServer.php +++ b/app/Filament/Resources/ServerResource/Pages/CreateServer.php @@ -371,19 +371,20 @@ class CreateServer extends CreateRecord $text = Forms\Components\TextInput::make('variable_value') ->hidden($this->shouldHideComponent(...)) ->maxLength(191) - ->rules([ + ->required(fn (Forms\Get $get) => in_array('required', explode('|', $get('rules')))) + ->rules( fn (Forms\Get $get): Closure => function (string $attribute, $value, Closure $fail) use ($get) { $validator = Validator::make(['validatorkey' => $value], [ 'validatorkey' => $get('rules'), ]); if ($validator->fails()) { - $message = str($validator->errors()->first())->replace('validatorkey', $get('name')); + $message = str($validator->errors()->first())->replace('validatorkey', $get('name'))->toString(); $fail($message); } }, - ]); + ); $select = Forms\Components\Select::make('variable_value') ->hidden($this->shouldHideComponent(...)) From eb99f53d879c5cff4e565baba837263fc64c724b Mon Sep 17 00:00:00 2001 From: Lance Pioch Date: Fri, 7 Jun 2024 00:08:41 -0400 Subject: [PATCH 13/16] Reset this for now --- app/Filament/Resources/ServerResource/Pages/CreateServer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Filament/Resources/ServerResource/Pages/CreateServer.php b/app/Filament/Resources/ServerResource/Pages/CreateServer.php index a4b73abe5..7973349eb 100644 --- a/app/Filament/Resources/ServerResource/Pages/CreateServer.php +++ b/app/Filament/Resources/ServerResource/Pages/CreateServer.php @@ -583,7 +583,7 @@ class CreateServer extends CreateRecord Forms\Components\Hidden::make('io') ->helperText('The IO performance relative to other running containers') ->label('Block IO Proportion') - ->default(0), + ->default(500), Forms\Components\Grid::make() ->columns(4) From 02d24b8a36f6937328abc3c3bbd73360a39ff7f2 Mon Sep 17 00:00:00 2001 From: Charles Date: Fri, 7 Jun 2024 16:23:25 -0400 Subject: [PATCH 14/16] 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]); + } + } +}; From cc1ac1eba1c4abe734380c378891b75b289d46d0 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Fri, 7 Jun 2024 23:31:34 +0200 Subject: [PATCH 15/16] Allow importing eggs via url (#344) * allow importing eggs via url * refactor * run pint * turn back into one button * fix empty check * small cleanup * removed container for tabs * Update URL function * Use sys temp --------- Co-authored-by: notCharles --- .../Resources/EggResource/Pages/ListEggs.php | 54 ++++++++++++--- .../Admin/Eggs/EggShareController.php | 4 +- .../Eggs/Sharing/EggImporterService.php | 18 ++++- .../Eggs/Sharing/EggUpdateImporterService.php | 19 +++++- composer.json | 1 + composer.lock | 65 ++++++++++++++++++- database/Seeders/EggSeeder.php | 4 +- 7 files changed, 149 insertions(+), 16 deletions(-) diff --git a/app/Filament/Resources/EggResource/Pages/ListEggs.php b/app/Filament/Resources/EggResource/Pages/ListEggs.php index 5a0d649f8..71adf94d7 100644 --- a/app/Filament/Resources/EggResource/Pages/ListEggs.php +++ b/app/Filament/Resources/EggResource/Pages/ListEggs.php @@ -8,6 +8,7 @@ use App\Services\Eggs\Sharing\EggImporterService; use Exception; use Filament\Actions; use Filament\Forms; +use Filament\Forms\Components\Tabs; use Filament\Notifications\Notification; use Filament\Resources\Pages\ListRecords; use Filament\Tables\Table; @@ -62,21 +63,58 @@ class ListEggs extends ListRecords Actions\Action::make('import') ->label('Import') ->form([ - Forms\Components\FileUpload::make('egg') - ->acceptedFileTypes(['application/json']) - ->storeFiles(false) - ->multiple(), + Tabs::make('Tabs') + ->tabs([ + Tabs\Tab::make('From File') + ->icon('tabler-file-upload') + ->schema([ + Forms\Components\FileUpload::make('egg') + ->label('Egg') + ->hint('This should be the json file ( egg-minecraft.json )') + ->acceptedFileTypes(['application/json']) + ->storeFiles(false) + ->multiple(), + ]), + Tabs\Tab::make('From URL') + ->icon('tabler-world-upload') + ->schema([ + Forms\Components\TextInput::make('url') + ->label('URL') + ->hint('This URL should point to a single json file') + ->url(), + ]), + ]) + ->contained(false), + ]) ->action(function (array $data): void { - /** @var TemporaryUploadedFile $eggFile */ - $eggFile = $data['egg']; /** @var EggImporterService $eggImportService */ $eggImportService = resolve(EggImporterService::class); - foreach ($eggFile as $file) { + if (!empty($data['egg'])) { + /** @var TemporaryUploadedFile[] $eggFile */ + $eggFile = $data['egg']; + + foreach ($eggFile as $file) { + try { + $eggImportService->fromFile($file); + } catch (Exception $exception) { + Notification::make() + ->title('Import Failed') + ->danger() + ->send(); + + report($exception); + + return; + } + } + } + + if (!empty($data['url'])) { try { - $eggImportService->handle($file); + $eggImportService->fromUrl($data['url']); } catch (Exception $exception) { Notification::make() ->title('Import Failed') diff --git a/app/Http/Controllers/Admin/Eggs/EggShareController.php b/app/Http/Controllers/Admin/Eggs/EggShareController.php index ffec4aad5..e938403db 100644 --- a/app/Http/Controllers/Admin/Eggs/EggShareController.php +++ b/app/Http/Controllers/Admin/Eggs/EggShareController.php @@ -46,7 +46,7 @@ class EggShareController extends Controller */ public function import(EggImportFormRequest $request): RedirectResponse { - $egg = $this->importerService->handle($request->file('import_file')); + $egg = $this->importerService->fromFile($request->file('import_file')); $this->alert->success(trans('admin/eggs.notices.imported'))->flash(); return redirect()->route('admin.eggs.view', ['egg' => $egg->id]); @@ -61,7 +61,7 @@ class EggShareController extends Controller */ public function update(EggImportFormRequest $request, Egg $egg): RedirectResponse { - $this->updateImporterService->handle($egg, $request->file('import_file')); + $this->updateImporterService->fromFile($egg, $request->file('import_file')); $this->alert->success(trans('admin/eggs.notices.updated_via_import'))->flash(); return redirect()->route('admin.eggs.view', ['egg' => $egg]); diff --git a/app/Services/Eggs/Sharing/EggImporterService.php b/app/Services/Eggs/Sharing/EggImporterService.php index 23ef0c819..5c94ec2fa 100644 --- a/app/Services/Eggs/Sharing/EggImporterService.php +++ b/app/Services/Eggs/Sharing/EggImporterService.php @@ -9,6 +9,7 @@ use Illuminate\Http\UploadedFile; use App\Models\EggVariable; use Illuminate\Database\ConnectionInterface; use App\Services\Eggs\EggParserService; +use Spatie\TemporaryDirectory\TemporaryDirectory; class EggImporterService { @@ -21,7 +22,7 @@ class EggImporterService * * @throws \App\Exceptions\Service\InvalidFileUploadException|\Throwable */ - public function handle(UploadedFile $file): Egg + public function fromFile(UploadedFile $file): Egg { $parsed = $this->parser->handle($file); @@ -46,4 +47,19 @@ class EggImporterService }); } + /** + * Take an url and parse it into a new egg. + * + * @throws \App\Exceptions\Service\InvalidFileUploadException|\Throwable + */ + public function fromUrl(string $url): Egg + { + $info = pathinfo($url); + $tmpDir = TemporaryDirectory::make()->deleteWhenDestroyed(); + $tmpPath = $tmpDir->path($info['basename']); + + file_put_contents($tmpPath, file_get_contents($url)); + + return $this->fromFile(new UploadedFile($tmpPath, $info['basename'], 'application/json')); + } } diff --git a/app/Services/Eggs/Sharing/EggUpdateImporterService.php b/app/Services/Eggs/Sharing/EggUpdateImporterService.php index f2123e1f4..a441079e5 100644 --- a/app/Services/Eggs/Sharing/EggUpdateImporterService.php +++ b/app/Services/Eggs/Sharing/EggUpdateImporterService.php @@ -8,6 +8,7 @@ use Illuminate\Support\Collection; use App\Models\EggVariable; use Illuminate\Database\ConnectionInterface; use App\Services\Eggs\EggParserService; +use Spatie\TemporaryDirectory\TemporaryDirectory; class EggUpdateImporterService { @@ -23,7 +24,7 @@ class EggUpdateImporterService * * @throws \App\Exceptions\Service\InvalidFileUploadException|\Throwable */ - public function handle(Egg $egg, UploadedFile $file): Egg + public function fromFile(Egg $egg, UploadedFile $file): Egg { $parsed = $this->parser->handle($file); @@ -47,4 +48,20 @@ class EggUpdateImporterService return $egg->refresh(); }); } + + /** + * Update an existing Egg using an url. + * + * @throws \App\Exceptions\Service\InvalidFileUploadException|\Throwable + */ + public function fromUrl(Egg $egg, string $url): Egg + { + $info = pathinfo($url); + $tmpDir = TemporaryDirectory::make()->deleteWhenDestroyed(); + $tmpPath = $tmpDir->path($info['basename']); + + file_put_contents($tmpPath, file_get_contents($url)); + + return $this->fromFile($egg, new UploadedFile($tmpPath, $info['basename'], 'application/json')); + } } diff --git a/composer.json b/composer.json index 45213c015..399b42278 100644 --- a/composer.json +++ b/composer.json @@ -33,6 +33,7 @@ "s1lentium/iptools": "~1.2.0", "spatie/laravel-fractal": "^6.2", "spatie/laravel-query-builder": "^5.8.1", + "spatie/temporary-directory": "^2.2", "symfony/http-client": "^7.1", "symfony/mailgun-mailer": "^7.1", "symfony/postmark-mailer": "^7.0.7", diff --git a/composer.lock b/composer.lock index 5a5c53536..3b1006ea4 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "8feeafbeb16044bd6716510a73393fc0", + "content-hash": "bf44faee3aae2b1d4c1b57893c1aba98", "packages": [ { "name": "abdelhamiderrahmouni/filament-monaco-editor", @@ -6990,6 +6990,67 @@ ], "time": "2024-05-10T08:19:35+00:00" }, + { + "name": "spatie/temporary-directory", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/temporary-directory.git", + "reference": "76949fa18f8e1a7f663fd2eaa1d00e0bcea0752a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/76949fa18f8e1a7f663fd2eaa1d00e0bcea0752a", + "reference": "76949fa18f8e1a7f663fd2eaa1d00e0bcea0752a", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\TemporaryDirectory\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Vanderbist", + "email": "alex@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily create, use and destroy temporary directories", + "homepage": "https://github.com/spatie/temporary-directory", + "keywords": [ + "php", + "spatie", + "temporary-directory" + ], + "support": { + "issues": "https://github.com/spatie/temporary-directory/issues", + "source": "https://github.com/spatie/temporary-directory/tree/2.2.1" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2023-12-25T11:46:58+00:00" + }, { "name": "symfony/clock", "version": "v7.0.7", @@ -13096,5 +13157,5 @@ "ext-zip": "*" }, "platform-dev": [], - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.3.0" } diff --git a/database/Seeders/EggSeeder.php b/database/Seeders/EggSeeder.php index efdfc8f04..afcb55a6d 100644 --- a/database/Seeders/EggSeeder.php +++ b/database/Seeders/EggSeeder.php @@ -75,10 +75,10 @@ class EggSeeder extends Seeder ->first(); if ($egg instanceof Egg) { - $this->updateImporterService->handle($egg, $file); + $this->updateImporterService->fromFile($egg, $file); $this->command->info('Updated ' . $decoded['name']); } else { - $this->importerService->handle($file); + $this->importerService->fromFile($file); $this->command->comment('Created ' . $decoded['name']); } } From 7ee52affb2136b62e29a27b8baa53258c061382a Mon Sep 17 00:00:00 2001 From: notCharles Date: Fri, 7 Jun 2024 17:38:58 -0400 Subject: [PATCH 16/16] Update token rotation --- app/Services/Nodes/NodeUpdateService.php | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/app/Services/Nodes/NodeUpdateService.php b/app/Services/Nodes/NodeUpdateService.php index 708605b19..8377261af 100644 --- a/app/Services/Nodes/NodeUpdateService.php +++ b/app/Services/Nodes/NodeUpdateService.php @@ -27,15 +27,22 @@ class NodeUpdateService */ public function handle(Node $node, array $data, bool $resetToken = false): Node { + $data['id'] = $node->id; + if ($resetToken) { $data['daemon_token'] = Str::random(Node::DAEMON_TOKEN_LENGTH); $data['daemon_token_id'] = Str::random(Node::DAEMON_TOKEN_ID_LENGTH); } - [$node, $exception] = $this->connection->transaction(function () use ($data, $node) { - $node->forceFill($data)->save(); + [$updated, $exception] = $this->connection->transaction(function () use ($data, $node) { + /** @var \App\Models\Node $updated */ + $updated = $node->replicate(); + $updated->exists = true; + $updated->forceFill($data)->save(); try { - $this->configurationRepository->setNode($node)->update($node); + $node->fqdn = $updated->fqdn; + + $this->configurationRepository->setNode($node)->update($updated); } catch (DaemonConnectionException $exception) { logger()->warning($exception, ['node_id' => $node->id]); @@ -45,16 +52,16 @@ class NodeUpdateService // // This avoids issues with proxies such as Cloudflare which will see daemon as offline and then // inject their own response pages, causing this logic to get fucked up. - return [$node, true]; + return [$updated, true]; } - return [$node, false]; + return [$updated, false]; }); if ($exception) { throw new ConfigurationNotPersistedException(trans('exceptions.node.daemon_off_config_updated')); } - return $node; + return $updated; } }