mirror of
https://github.com/pelican-dev/panel.git
synced 2025-05-20 07:34: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\Models\ServerVariable;
|
||||||
use App\Services\Databases\DatabaseManagementService;
|
use App\Services\Databases\DatabaseManagementService;
|
||||||
use App\Services\Databases\DatabasePasswordService;
|
use App\Services\Databases\DatabasePasswordService;
|
||||||
|
use App\Services\Eggs\EggChangerService;
|
||||||
use App\Services\Servers\RandomWordService;
|
use App\Services\Servers\RandomWordService;
|
||||||
use App\Services\Servers\ReinstallServerService;
|
use App\Services\Servers\ReinstallServerService;
|
||||||
use App\Services\Servers\ServerDeletionService;
|
use App\Services\Servers\ServerDeletionService;
|
||||||
@ -38,6 +39,7 @@ use Filament\Forms\Components\Tabs\Tab;
|
|||||||
use Filament\Forms\Components\TagsInput;
|
use Filament\Forms\Components\TagsInput;
|
||||||
use Filament\Forms\Components\Textarea;
|
use Filament\Forms\Components\Textarea;
|
||||||
use Filament\Forms\Components\TextInput;
|
use Filament\Forms\Components\TextInput;
|
||||||
|
use Filament\Forms\Components\Toggle;
|
||||||
use Filament\Forms\Components\ToggleButtons;
|
use Filament\Forms\Components\ToggleButtons;
|
||||||
use Filament\Forms\Form;
|
use Filament\Forms\Form;
|
||||||
use Filament\Forms\Get;
|
use Filament\Forms\Get;
|
||||||
@ -474,7 +476,7 @@ class EditServer extends EditRecord
|
|||||||
])
|
])
|
||||||
->schema([
|
->schema([
|
||||||
Select::make('egg_id')
|
Select::make('egg_id')
|
||||||
->disabledOn('edit')
|
->disabled()
|
||||||
->prefixIcon('tabler-egg')
|
->prefixIcon('tabler-egg')
|
||||||
->columnSpan([
|
->columnSpan([
|
||||||
'default' => 6,
|
'default' => 6,
|
||||||
@ -485,7 +487,28 @@ class EditServer extends EditRecord
|
|||||||
->relationship('egg', 'name')
|
->relationship('egg', 'name')
|
||||||
->searchable()
|
->searchable()
|
||||||
->preload()
|
->preload()
|
||||||
|
->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(),
|
->required(),
|
||||||
|
Toggle::make('keepOldVariables')
|
||||||
|
->label('Keep old variables if possible?')
|
||||||
|
->default(true),
|
||||||
|
])
|
||||||
|
),
|
||||||
|
|
||||||
ToggleButtons::make('skip_scripts')
|
ToggleButtons::make('skip_scripts')
|
||||||
->label('Run Egg Install Script?')->inline()
|
->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