mirror of
https://github.com/pelican-dev/panel.git
synced 2025-05-20 01:44:45 +02:00
Allow admins to change server egg (#811)
* add service that handles egg changing * add "change egg" action to EditServer page * add toggle for keeping old variables or not
This commit is contained in:
parent
ef1ae72d06
commit
0051d9fefc
@ -15,6 +15,7 @@ use App\Models\Server;
|
||||
use App\Models\ServerVariable;
|
||||
use App\Services\Databases\DatabaseManagementService;
|
||||
use App\Services\Databases\DatabasePasswordService;
|
||||
use App\Services\Eggs\EggChangerService;
|
||||
use App\Services\Servers\RandomWordService;
|
||||
use App\Services\Servers\ReinstallServerService;
|
||||
use App\Services\Servers\ServerDeletionService;
|
||||
@ -38,6 +39,7 @@ use Filament\Forms\Components\Tabs\Tab;
|
||||
use Filament\Forms\Components\TagsInput;
|
||||
use Filament\Forms\Components\Textarea;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Forms\Components\Toggle;
|
||||
use Filament\Forms\Components\ToggleButtons;
|
||||
use Filament\Forms\Form;
|
||||
use Filament\Forms\Get;
|
||||
@ -474,7 +476,7 @@ class EditServer extends EditRecord
|
||||
])
|
||||
->schema([
|
||||
Select::make('egg_id')
|
||||
->disabledOn('edit')
|
||||
->disabled()
|
||||
->prefixIcon('tabler-egg')
|
||||
->columnSpan([
|
||||
'default' => 6,
|
||||
@ -485,7 +487,28 @@ class EditServer extends EditRecord
|
||||
->relationship('egg', 'name')
|
||||
->searchable()
|
||||
->preload()
|
||||
->required(),
|
||||
->required()
|
||||
->hintAction(
|
||||
Action::make('change_egg')
|
||||
->action(function (array $data, Server $server, EggChangerService $service) {
|
||||
$service->handle($server, $data['egg_id'], $data['keepOldVariables']);
|
||||
|
||||
// Use redirect instead of fillForm to prevent server variables from duplicating
|
||||
$this->redirect($this->getUrl(['record' => $server, 'tab' => '-egg-tab']), true);
|
||||
})
|
||||
->form(fn (Server $server) => [
|
||||
Select::make('egg_id')
|
||||
->label('New Egg')
|
||||
->prefixIcon('tabler-egg')
|
||||
->options(fn () => Egg::all()->filter(fn (Egg $egg) => $egg->id !== $server->egg->id)->mapWithKeys(fn (Egg $egg) => [$egg->id => $egg->name]))
|
||||
->searchable()
|
||||
->preload()
|
||||
->required(),
|
||||
Toggle::make('keepOldVariables')
|
||||
->label('Keep old variables if possible?')
|
||||
->default(true),
|
||||
])
|
||||
),
|
||||
|
||||
ToggleButtons::make('skip_scripts')
|
||||
->label('Run Egg Install Script?')->inline()
|
||||
|
48
app/Services/Eggs/EggChangerService.php
Normal file
48
app/Services/Eggs/EggChangerService.php
Normal file
@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Eggs;
|
||||
|
||||
use App\Models\Egg;
|
||||
use App\Models\Server;
|
||||
use App\Models\ServerVariable;
|
||||
|
||||
class EggChangerService
|
||||
{
|
||||
public function handle(Server $server, Egg|int $newEgg, bool $keepOldVariables = true): void
|
||||
{
|
||||
if (!$newEgg instanceof Egg) {
|
||||
$newEgg = Egg::findOrFail($newEgg);
|
||||
}
|
||||
|
||||
if ($server->egg->id === $newEgg->id) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Change egg id, default image and startup command
|
||||
$server->forceFill([
|
||||
'egg_id' => $newEgg->id,
|
||||
'image' => array_values($newEgg->docker_images)[0],
|
||||
'startup' => $newEgg->startup,
|
||||
])->saveOrFail();
|
||||
|
||||
$oldVariables = [];
|
||||
if ($keepOldVariables) {
|
||||
// Keep copy of old server variables
|
||||
foreach ($server->serverVariables as $serverVariable) {
|
||||
$oldVariables[$serverVariable->variable->env_variable] = $serverVariable->variable_value;
|
||||
}
|
||||
}
|
||||
|
||||
// Delete old server variables
|
||||
ServerVariable::where('server_id', $server->id)->delete();
|
||||
|
||||
// Create new server variables
|
||||
foreach ($newEgg->variables as $eggVariable) {
|
||||
ServerVariable::create([
|
||||
'server_id' => $server->id,
|
||||
'variable_id' => $eggVariable->id,
|
||||
'variable_value' => $oldVariables[$eggVariable->env_variable] ?? $eggVariable->default_value,
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user