mirror of
https://github.com/pelican-dev/panel.git
synced 2025-09-15 12:34:55 +02:00
Wip
This commit is contained in:
parent
48fd3cc84e
commit
eb0bad82e6
@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
namespace App\Filament\Resources\ServerResource\Pages;
|
namespace App\Filament\Resources\ServerResource\Pages;
|
||||||
|
|
||||||
|
use App\Models\Node;
|
||||||
|
use App\Models\Objects\Endpoint;
|
||||||
|
use Illuminate\Support\HtmlString;
|
||||||
use LogicException;
|
use LogicException;
|
||||||
use App\Filament\Resources\ServerResource;
|
use App\Filament\Resources\ServerResource;
|
||||||
use App\Http\Controllers\Admin\ServersController;
|
use App\Http\Controllers\Admin\ServersController;
|
||||||
@ -15,7 +18,6 @@ use App\Enums\ServerState;
|
|||||||
use App\Models\Egg;
|
use App\Models\Egg;
|
||||||
use App\Models\Server;
|
use App\Models\Server;
|
||||||
use App\Models\ServerVariable;
|
use App\Models\ServerVariable;
|
||||||
use App\Repositories\Daemon\DaemonServerRepository;
|
|
||||||
use App\Services\Servers\ServerDeletionService;
|
use App\Services\Servers\ServerDeletionService;
|
||||||
use Filament\Forms\Components\Tabs;
|
use Filament\Forms\Components\Tabs;
|
||||||
use Filament\Forms\Form;
|
use Filament\Forms\Form;
|
||||||
@ -27,6 +29,11 @@ use Webbingbrasil\FilamentCopyActions\Forms\Actions\CopyAction;
|
|||||||
|
|
||||||
class EditServer extends EditRecord
|
class EditServer extends EditRecord
|
||||||
{
|
{
|
||||||
|
public ?Node $node = null;
|
||||||
|
public ?Egg $egg = null;
|
||||||
|
public array $ports = [];
|
||||||
|
public array $eggDefaultPorts = [];
|
||||||
|
|
||||||
protected static string $resource = ServerResource::class;
|
protected static string $resource = ServerResource::class;
|
||||||
|
|
||||||
public function form(Form $form): Form
|
public function form(Form $form): Form
|
||||||
@ -152,7 +159,8 @@ class EditServer extends EditRecord
|
|||||||
])
|
])
|
||||||
->disabled(),
|
->disabled(),
|
||||||
]),
|
]),
|
||||||
Tabs\Tab::make('Environment')
|
Tabs\Tab::make('env-tab')
|
||||||
|
->label('Environment')
|
||||||
->icon('tabler-brand-docker')
|
->icon('tabler-brand-docker')
|
||||||
->schema([
|
->schema([
|
||||||
Forms\Components\Fieldset::make('Resource Limits')
|
Forms\Components\Fieldset::make('Resource Limits')
|
||||||
@ -437,6 +445,9 @@ class EditServer extends EditRecord
|
|||||||
'md' => 3,
|
'md' => 3,
|
||||||
'lg' => 5,
|
'lg' => 5,
|
||||||
])
|
])
|
||||||
|
->afterStateHydrated(function (Forms\Set $set, Forms\Get $get) {
|
||||||
|
// $this->resetEggVariables($set, $get);
|
||||||
|
})
|
||||||
->relationship('egg', 'name')
|
->relationship('egg', 'name')
|
||||||
->searchable()
|
->searchable()
|
||||||
->preload()
|
->preload()
|
||||||
@ -458,6 +469,50 @@ class EditServer extends EditRecord
|
|||||||
])
|
])
|
||||||
->required(),
|
->required(),
|
||||||
|
|
||||||
|
Forms\Components\TagsInput::make('ports')
|
||||||
|
->columnSpan(3)
|
||||||
|
->placeholder('Example: 25565, 8080, 1337-1340')
|
||||||
|
->splitKeys(['Tab', ' ', ','])
|
||||||
|
->helperText(new HtmlString('
|
||||||
|
These are the ports that users can connect to this Server through.
|
||||||
|
<br />
|
||||||
|
You would typically port forward these on your home network.
|
||||||
|
'))
|
||||||
|
->label('Ports')
|
||||||
|
->formatStateUsing(fn (Server $server) => $server->ports->map(fn ($port) => (string) $port)->all())
|
||||||
|
->afterStateUpdated(self::ports(...))
|
||||||
|
->hintAction(
|
||||||
|
Forms\Components\Actions\Action::make('asdf')
|
||||||
|
->action(function (Forms\Get $get, Forms\Set $set) {
|
||||||
|
$this->resetEggVariables($set, $get);
|
||||||
|
}))
|
||||||
|
->live(),
|
||||||
|
|
||||||
|
Forms\Components\Repeater::make('assignments')
|
||||||
|
->columnSpan(3)
|
||||||
|
->defaultItems(fn () => count($this->eggDefaultPorts))
|
||||||
|
->label('Port Assignments')
|
||||||
|
->helperText(fn (Forms\Get $get) => empty($get('ports')) ? 'You must add ports to assign them!' : '')
|
||||||
|
->live()
|
||||||
|
->addable(false)
|
||||||
|
->deletable(false)
|
||||||
|
->reorderable(false)
|
||||||
|
->simple(
|
||||||
|
Forms\Components\Select::make('port')
|
||||||
|
->live()
|
||||||
|
->disabled(fn (Forms\Get $get) => empty($get('../../ports')) || empty($get('../../assignments')))
|
||||||
|
->prefix(function (Forms\Components\Component $component) {
|
||||||
|
$key = str($component->getStatePath())->beforeLast('.')->afterLast('.')->toString();
|
||||||
|
|
||||||
|
dump($key);
|
||||||
|
|
||||||
|
return $key;
|
||||||
|
})
|
||||||
|
->disableOptionsWhenSelectedInSiblingRepeaterItems()
|
||||||
|
->options(fn (Forms\Get $get) => $this->ports)
|
||||||
|
->required(),
|
||||||
|
),
|
||||||
|
|
||||||
Forms\Components\Textarea::make('startup')
|
Forms\Components\Textarea::make('startup')
|
||||||
->label('Startup Command')
|
->label('Startup Command')
|
||||||
->required()
|
->required()
|
||||||
@ -474,12 +529,11 @@ class EditServer extends EditRecord
|
|||||||
'md' => 4,
|
'md' => 4,
|
||||||
'lg' => 6,
|
'lg' => 6,
|
||||||
])
|
])
|
||||||
->rows(function ($state) {
|
->rows(fn ($state) => str($state)->explode("\n")->reduce(
|
||||||
return str($state)->explode("\n")->reduce(
|
fn (int $carry, $line) => $carry + floor(strlen($line) / 125), 0
|
||||||
fn (int $carry, $line) => $carry + floor(strlen($line) / 125),
|
)),
|
||||||
0
|
|
||||||
);
|
Forms\Components\Hidden::make('environment')->default([]),
|
||||||
}),
|
|
||||||
|
|
||||||
Forms\Components\Repeater::make('server_variables')
|
Forms\Components\Repeater::make('server_variables')
|
||||||
->relationship('serverVariables')
|
->relationship('serverVariables')
|
||||||
@ -523,10 +577,10 @@ class EditServer extends EditRecord
|
|||||||
$component = $component
|
$component = $component
|
||||||
->live(onBlur: true)
|
->live(onBlur: true)
|
||||||
->hintIcon('tabler-code')
|
->hintIcon('tabler-code')
|
||||||
->label(fn (ServerVariable $serverVariable) => $serverVariable->variable->name)
|
->label(fn (ServerVariable $serverVariable) => $serverVariable->variable?->name)
|
||||||
->hintIconTooltip(fn (ServerVariable $serverVariable) => $serverVariable->variable->rules)
|
->hintIconTooltip(fn (ServerVariable $serverVariable) => $serverVariable->variable?->rules)
|
||||||
->prefix(fn (ServerVariable $serverVariable) => '{{' . $serverVariable->variable->env_variable . '}}')
|
->prefix(fn (ServerVariable $serverVariable) => '{{' . $serverVariable->variable?->env_variable . '}}')
|
||||||
->helperText(fn (ServerVariable $serverVariable) => empty($serverVariable->variable->description) ? '—' : $serverVariable->variable->description);
|
->helperText(fn (ServerVariable $serverVariable) => empty($serverVariable->variable?->description) ? '—' : $serverVariable->variable->description);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $components;
|
return $components;
|
||||||
@ -740,4 +794,81 @@ class EditServer extends EditRecord
|
|||||||
->mapWithKeys(fn ($value) => [$value => $value])
|
->mapWithKeys(fn ($value) => [$value => $value])
|
||||||
->all();
|
->all();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function ports($state, Forms\Set $set)
|
||||||
|
{
|
||||||
|
$ports = collect();
|
||||||
|
foreach ($state as $portEntry) {
|
||||||
|
if (str_contains($portEntry, '-')) {
|
||||||
|
[$start, $end] = explode('-', $portEntry);
|
||||||
|
if (!is_numeric($start) || !is_numeric($end)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$start = max((int) $start, Endpoint::PORT_FLOOR);
|
||||||
|
$end = min((int) $end, Endpoint::PORT_CEIL);
|
||||||
|
for ($i = $start; $i <= $end; $i++) {
|
||||||
|
$ports->push($i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_numeric($portEntry)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$ports->push((int) $portEntry);
|
||||||
|
}
|
||||||
|
|
||||||
|
$uniquePorts = $ports->unique()->values();
|
||||||
|
if ($ports->count() > $uniquePorts->count()) {
|
||||||
|
$ports = $uniquePorts;
|
||||||
|
}
|
||||||
|
|
||||||
|
$ports = $ports->filter(fn ($port) => $port > 1024 && $port < 65535)->values();
|
||||||
|
|
||||||
|
$set('ports', $ports->all());
|
||||||
|
$this->ports = $ports->all();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function resetEggVariables(Forms\Set $set, Forms\Get $get)
|
||||||
|
{
|
||||||
|
$set('assignments', []);
|
||||||
|
|
||||||
|
$i = 0;
|
||||||
|
$this->eggDefaultPorts = [];
|
||||||
|
if (str_contains($get('startup'), '{{SERVER_PORT}}')) {
|
||||||
|
$this->eggDefaultPorts['SERVER_PORT'] = null;
|
||||||
|
$set('assignments.SERVER_PORT', ['port' => null]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$variables = $this->getRecord()->egg->variables ?? [];
|
||||||
|
$serverVariables = collect();
|
||||||
|
$this->ports = [];
|
||||||
|
foreach ($variables as $variable) {
|
||||||
|
if (str_contains($variable->rules, 'port')) {
|
||||||
|
$this->eggDefaultPorts[$variable->env_variable] = $variable->default_value;
|
||||||
|
$this->ports[] = (int) $variable->default_value;
|
||||||
|
|
||||||
|
$set("assignments.$variable->env_variable", ['port' => $i++]);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$serverVariables->add($variable->toArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
$set('ports', $this->ports);
|
||||||
|
|
||||||
|
$variables = [];
|
||||||
|
$set($path = 'server_variables', $serverVariables->sortBy(['sort'])->all());
|
||||||
|
for ($i = 0; $i < $serverVariables->count(); $i++) {
|
||||||
|
$set("$path.$i.variable_value", $serverVariables[$i]['default_value']);
|
||||||
|
$set("$path.$i.variable_id", $serverVariables[$i]['id']);
|
||||||
|
$variables[$serverVariables[$i]['env_variable']] = $serverVariables[$i]['default_value'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$set('environment', $variables);
|
||||||
|
|
||||||
|
// dump($variables, $this->ports, $this->eggDefaultPorts, $get('assignments'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user