From 54eaf8ab0faa679627cfe11a0c2a6d3759b204b3 Mon Sep 17 00:00:00 2001 From: notCharles Date: Sat, 13 Apr 2024 21:51:22 -0400 Subject: [PATCH 01/13] Change colums Closes https://github.com/pelican-dev/panel/issues/3 --- app/Console/Commands/Node/MakeNodeCommand.php | 6 +-- .../Admin/Nodes/NodeViewController.php | 2 +- .../Servers/ServerTransferController.php | 2 +- .../Application/Servers/ServerController.php | 2 +- .../Remote/SftpAuthenticationController.php | 2 +- .../Application/Nodes/StoreNodeRequest.php | 14 +++--- app/Models/Filters/AdminServerFilter.php | 2 +- app/Models/Filters/MultiFieldServerFilter.php | 2 +- app/Models/Node.php | 34 +++++++------- app/Models/Server.php | 6 +-- app/Notifications/AddedToServer.php | 2 +- app/Observers/SubuserObserver.php | 2 +- .../Servers/ServerCreationService.php | 4 +- .../Api/Application/NodeTransformer.php | 2 +- .../Api/Application/ServerTransformer.php | 2 +- .../Api/Client/ServerTransformer.php | 4 +- database/Factories/NodeFactory.php | 6 +-- database/Factories/ServerFactory.php | 2 +- ...dd_expires_at_column_to_api_keys_table.php | 28 ------------ .../2024_04_14_002250_update_column_names.php | 40 +++++++++++++++++ package.json | 4 +- resources/views/admin/nodes/index.blade.php | 2 +- resources/views/admin/nodes/new.blade.php | 12 ++--- .../views/admin/nodes/view/servers.blade.php | 2 +- .../views/admin/nodes/view/settings.blade.php | 8 ++-- resources/views/admin/servers/index.blade.php | 4 +- .../servers/partials/navigation.blade.php | 2 +- .../admin/servers/view/database.blade.php | 2 +- .../Api/Client/ClientControllerTest.php | 44 +++++++++---------- .../SftpAuthenticationControllerTest.php | 8 ++-- .../Servers/ServerCreationServiceTest.php | 2 +- 31 files changed, 133 insertions(+), 121 deletions(-) delete mode 100644 database/migrations/2023_02_23_191004_add_expires_at_column_to_api_keys_table.php create mode 100644 database/migrations/2024_04_14_002250_update_column_names.php diff --git a/app/Console/Commands/Node/MakeNodeCommand.php b/app/Console/Commands/Node/MakeNodeCommand.php index 6c370fa28..e92e11e7e 100644 --- a/app/Console/Commands/Node/MakeNodeCommand.php +++ b/app/Console/Commands/Node/MakeNodeCommand.php @@ -58,9 +58,9 @@ class MakeNodeCommand extends Command $data['disk'] = $this->option('maxDisk') ?? $this->ask('Enter the maximum amount of disk space'); $data['disk_overallocate'] = $this->option('overallocateDisk') ?? $this->ask('Enter the amount of memory to over allocate by, -1 will disable checking and 0 will prevent creating new server'); $data['upload_size'] = $this->option('uploadSize') ?? $this->ask('Enter the maximum filesize upload', '100'); - $data['daemonListen'] = $this->option('daemonListeningPort') ?? $this->ask('Enter the daemon listening port', '8080'); - $data['daemonSFTP'] = $this->option('daemonSFTPPort') ?? $this->ask('Enter the daemon SFTP listening port', '2022'); - $data['daemonBase'] = $this->option('daemonBase') ?? $this->ask('Enter the base folder', '/var/lib/panel/volumes'); + $data['daemon_listen'] = $this->option('daemonListeningPort') ?? $this->ask('Enter the daemon listening port', '8080'); + $data['daemon_sftp'] = $this->option('daemonSFTPPort') ?? $this->ask('Enter the daemon SFTP listening port', '2022'); + $data['daemon_base'] = $this->option('daemonBase') ?? $this->ask('Enter the base folder', '/var/lib/panel/volumes'); $node = $this->creationService->handle($data); $this->line('Successfully created a new node with the name ' . $data['name'] . ' and has an id of ' . $node->id . '.'); diff --git a/app/Http/Controllers/Admin/Nodes/NodeViewController.php b/app/Http/Controllers/Admin/Nodes/NodeViewController.php index 608d74fdd..3ab35c4e4 100644 --- a/app/Http/Controllers/Admin/Nodes/NodeViewController.php +++ b/app/Http/Controllers/Admin/Nodes/NodeViewController.php @@ -117,7 +117,7 @@ class NodeViewController extends Controller { $this->plainInject([ 'node' => Collection::wrap($node->makeVisible(['daemon_token_id', 'daemon_token'])) - ->only(['scheme', 'fqdn', 'daemonListen', 'daemon_token_id', 'daemon_token']), + ->only(['scheme', 'fqdn', 'daemon_listen', 'daemon_token_id', 'daemon_token']), ]); return view('admin.nodes.view.servers', [ diff --git a/app/Http/Controllers/Admin/Servers/ServerTransferController.php b/app/Http/Controllers/Admin/Servers/ServerTransferController.php index 9518092f1..fbfc7530e 100644 --- a/app/Http/Controllers/Admin/Servers/ServerTransferController.php +++ b/app/Http/Controllers/Admin/Servers/ServerTransferController.php @@ -68,7 +68,7 @@ class ServerTransferController extends Controller // Check if the node is viable for the transfer. $node = Node::query() - ->select(['nodes.id', 'nodes.fqdn', 'nodes.scheme', 'nodes.daemon_token', 'nodes.daemonListen', 'nodes.memory', 'nodes.disk', 'nodes.memory_overallocate', 'nodes.disk_overallocate']) + ->select(['nodes.id', 'nodes.fqdn', 'nodes.scheme', 'nodes.daemon_token', 'nodes.daemon_listen', 'nodes.memory', 'nodes.disk', 'nodes.memory_overallocate', 'nodes.disk_overallocate']) ->selectRaw('IFNULL(SUM(servers.memory), 0) as sum_memory, IFNULL(SUM(servers.disk), 0) as sum_disk') ->leftJoin('servers', 'servers.node_id', '=', 'nodes.id') ->where('nodes.id', $node_id) diff --git a/app/Http/Controllers/Api/Application/Servers/ServerController.php b/app/Http/Controllers/Api/Application/Servers/ServerController.php index e91e437e3..2d675516b 100644 --- a/app/Http/Controllers/Api/Application/Servers/ServerController.php +++ b/app/Http/Controllers/Api/Application/Servers/ServerController.php @@ -33,7 +33,7 @@ class ServerController extends ApplicationApiController public function index(GetServersRequest $request): array { $servers = QueryBuilder::for(Server::query()) - ->allowedFilters(['uuid', 'uuidShort', 'name', 'description', 'image', 'external_id']) + ->allowedFilters(['uuid', 'uuid_short', 'name', 'description', 'image', 'external_id']) ->allowedSorts(['id', 'uuid']) ->paginate($request->query('per_page') ?? 50); diff --git a/app/Http/Controllers/Api/Remote/SftpAuthenticationController.php b/app/Http/Controllers/Api/Remote/SftpAuthenticationController.php index 17fd0f6ca..af9cf97b1 100644 --- a/app/Http/Controllers/Api/Remote/SftpAuthenticationController.php +++ b/app/Http/Controllers/Api/Remote/SftpAuthenticationController.php @@ -89,7 +89,7 @@ class SftpAuthenticationController extends Controller protected function getServer(Request $request, string $uuid): Server { return Server::query() - ->where(fn ($builder) => $builder->where('uuid', $uuid)->orWhere('uuidShort', $uuid)) + ->where(fn ($builder) => $builder->where('uuid', $uuid)->orWhere('uuid_short', $uuid)) ->where('node_id', $request->attributes->get('node')->id) ->firstOr(function () use ($request) { $this->reject($request); diff --git a/app/Http/Requests/Api/Application/Nodes/StoreNodeRequest.php b/app/Http/Requests/Api/Application/Nodes/StoreNodeRequest.php index 99b98c375..fb426e3d9 100644 --- a/app/Http/Requests/Api/Application/Nodes/StoreNodeRequest.php +++ b/app/Http/Requests/Api/Application/Nodes/StoreNodeRequest.php @@ -29,11 +29,11 @@ class StoreNodeRequest extends ApplicationApiRequest 'disk', 'disk_overallocate', 'upload_size', - 'daemonListen', - 'daemonSFTP', - 'daemonBase', + 'daemon_listen', + 'daemon_sftp', + 'daemon_base', ])->mapWithKeys(function ($value, $key) { - $key = ($key === 'daemonSFTP') ? 'daemonSftp' : $key; + $key = ($key === 'daemon_sftp') ? 'daemon_sftp' : $key; return [snake_case($key) => $value]; })->toArray(); @@ -58,9 +58,9 @@ class StoreNodeRequest extends ApplicationApiRequest public function validated($key = null, $default = null): array { $response = parent::validated(); - $response['daemonListen'] = $response['daemon_listen']; - $response['daemonSFTP'] = $response['daemon_sftp']; - $response['daemonBase'] = $response['daemon_base'] ?? (new Node())->getAttribute('daemonBase'); + $response['daemon_listen'] = $response['daemon_listen']; + $response['daemon_sftp'] = $response['daemon_sftp']; + $response['daemon_base'] = $response['daemon_base'] ?? (new Node())->getAttribute('daemon_base'); unset($response['daemon_base'], $response['daemon_listen'], $response['daemon_sftp']); diff --git a/app/Models/Filters/AdminServerFilter.php b/app/Models/Filters/AdminServerFilter.php index 6e24a5b50..d3c1eea60 100644 --- a/app/Models/Filters/AdminServerFilter.php +++ b/app/Models/Filters/AdminServerFilter.php @@ -24,7 +24,7 @@ class AdminServerFilter implements Filter ->where(function (Builder $builder) use ($value) { $builder->where('servers.uuid', $value) ->orWhere('servers.uuid', 'LIKE', "$value%") - ->orWhere('servers.uuidShort', $value) + ->orWhere('servers.uuid_short', $value) ->orWhere('servers.external_id', $value) ->orWhereRaw('LOWER(users.username) LIKE ?', ["%$value%"]) ->orWhereRaw('LOWER(users.email) LIKE ?', ["$value%"]) diff --git a/app/Models/Filters/MultiFieldServerFilter.php b/app/Models/Filters/MultiFieldServerFilter.php index 39b1c2235..da3f91f6d 100644 --- a/app/Models/Filters/MultiFieldServerFilter.php +++ b/app/Models/Filters/MultiFieldServerFilter.php @@ -61,7 +61,7 @@ class MultiFieldServerFilter implements Filter ->where(function (Builder $builder) use ($value) { $builder->where('servers.uuid', $value) ->orWhere('servers.uuid', 'LIKE', "$value%") - ->orWhere('servers.uuidShort', $value) + ->orWhere('servers.uuid_short', $value) ->orWhere('servers.external_id', $value) ->orWhereRaw('LOWER(servers.name) LIKE ?', ["%$value%"]); }); diff --git a/app/Models/Node.php b/app/Models/Node.php index d1e383be1..5de40c253 100644 --- a/app/Models/Node.php +++ b/app/Models/Node.php @@ -25,9 +25,9 @@ use Illuminate\Database\Eloquent\Relations\HasManyThrough; * @property int $upload_size * @property string $daemon_token_id * @property string $daemon_token - * @property int $daemonListen - * @property int $daemonSFTP - * @property string $daemonBase + * @property int $daemon_listen + * @property int $daemon_sftp + * @property string $daemon_base * @property \Carbon\Carbon $created_at * @property \Carbon\Carbon $updated_at * @property \App\Models\Mount[]|\Illuminate\Database\Eloquent\Collection $mounts @@ -67,8 +67,8 @@ class Node extends Model 'public', 'name', 'fqdn', 'scheme', 'behind_proxy', 'memory', 'memory_overallocate', 'disk', - 'disk_overallocate', 'upload_size', 'daemonBase', - 'daemonSFTP', 'daemonListen', + 'disk_overallocate', 'upload_size', 'daemon_base', + 'daemon_sftp', 'daemon_listen', 'description', 'maintenance_mode', ]; @@ -83,9 +83,9 @@ class Node extends Model 'memory_overallocate' => 'required|numeric|min:-1', 'disk' => 'required|numeric|min:1', 'disk_overallocate' => 'required|numeric|min:-1', - 'daemonBase' => 'sometimes|required|regex:/^([\/][\d\w.\-\/]+)$/', - 'daemonSFTP' => 'required|numeric|between:1,65535', - 'daemonListen' => 'required|numeric|between:1,65535', + 'daemon_base' => 'sometimes|required|regex:/^([\/][\d\w.\-\/]+)$/', + 'daemon_sftp' => 'required|numeric|between:1,65535', + 'daemon_listen' => 'required|numeric|between:1,65535', 'maintenance_mode' => 'boolean', 'upload_size' => 'int|between:1,1024', ]; @@ -98,9 +98,9 @@ class Node extends Model 'behind_proxy' => false, 'memory_overallocate' => 0, 'disk_overallocate' => 0, - 'daemonBase' => '/var/lib/panel/volumes', - 'daemonSFTP' => 2022, - 'daemonListen' => 8080, + 'daemon_base' => '/var/lib/panel/volumes', + 'daemon_sftp' => 2022, + 'daemon_listen' => 8080, 'maintenance_mode' => false, ]; @@ -109,8 +109,8 @@ class Node extends Model return [ 'memory' => 'integer', 'disk' => 'integer', - 'daemonListen' => 'integer', - 'daemonSFTP' => 'integer', + 'daemon_listen' => 'integer', + 'daemon_sftp' => 'integer', 'behind_proxy' => 'boolean', 'public' => 'boolean', 'maintenance_mode' => 'boolean', @@ -122,7 +122,7 @@ class Node extends Model */ public function getConnectionAddress(): string { - return "$this->scheme://$this->fqdn:$this->daemonListen"; + return "$this->scheme://$this->fqdn:$this->daemon_listen"; } /** @@ -137,7 +137,7 @@ class Node extends Model 'token' => decrypt($this->daemon_token), 'api' => [ 'host' => '0.0.0.0', - 'port' => $this->daemonListen, + 'port' => $this->daemon_listen, 'ssl' => [ 'enabled' => (!$this->behind_proxy && $this->scheme === 'https'), 'cert' => '/etc/letsencrypt/live/' . Str::lower($this->fqdn) . '/fullchain.pem', @@ -146,9 +146,9 @@ class Node extends Model 'upload_limit' => $this->upload_size, ], 'system' => [ - 'data' => $this->daemonBase, + 'data' => $this->daemon_base, 'sftp' => [ - 'bind_port' => $this->daemonSFTP, + 'bind_port' => $this->daemon_sftp, ], ], 'allowed_mounts' => $this->mounts->pluck('source')->toArray(), diff --git a/app/Models/Server.php b/app/Models/Server.php index 0c43ea25b..e6322a8e1 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -21,7 +21,7 @@ use App\Exceptions\Http\Server\ServerStateConflictException; * @property int $id * @property string|null $external_id * @property string $uuid - * @property string $uuidShort + * @property string $uuid_short * @property int $node_id * @property string $name * @property string $description @@ -98,7 +98,7 @@ use App\Exceptions\Http\Server\ServerStateConflictException; * @method static \Illuminate\Database\Eloquent\Builder|Server whereThreads($value) * @method static \Illuminate\Database\Eloquent\Builder|Server whereUpdatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|Server whereUuid($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereUuidShort($value) + * @method static \Illuminate\Database\Eloquent\Builder|Server whereuuid_short($value) * * @mixin \Eloquent */ @@ -323,7 +323,7 @@ class Server extends Model public function resolveRouteBinding($value, $field = null): ?self { return match ($field) { - 'uuid' => $this->where('uuidShort', $value)->orWhere('uuid', $value)->firstOrFail(), + 'uuid' => $this->where('uuid_short', $value)->orWhere('uuid', $value)->firstOrFail(), default => $this->where('id', $value)->firstOrFail(), }; } diff --git a/app/Notifications/AddedToServer.php b/app/Notifications/AddedToServer.php index 34d46f0b2..647c33822 100644 --- a/app/Notifications/AddedToServer.php +++ b/app/Notifications/AddedToServer.php @@ -38,6 +38,6 @@ class AddedToServer extends Notification implements ShouldQueue ->greeting('Hello ' . $this->server->user . '!') ->line('You have been added as a subuser for the following server, allowing you certain control over the server.') ->line('Server Name: ' . $this->server->name) - ->action('Visit Server', url('/server/' . $this->server->uuidShort)); + ->action('Visit Server', url('/server/' . $this->server->uuid_short)); } } diff --git a/app/Observers/SubuserObserver.php b/app/Observers/SubuserObserver.php index 0acb86777..25842045c 100644 --- a/app/Observers/SubuserObserver.php +++ b/app/Observers/SubuserObserver.php @@ -27,7 +27,7 @@ class SubuserObserver $subuser->user->notify(new AddedToServer([ 'user' => $subuser->user->name_first, 'name' => $subuser->server->name, - 'uuidShort' => $subuser->server->uuidShort, + 'uuid_short' => $subuser->server->uuid_short, ])); } diff --git a/app/Services/Servers/ServerCreationService.php b/app/Services/Servers/ServerCreationService.php index d544d7d9d..cff2cb8c8 100644 --- a/app/Services/Servers/ServerCreationService.php +++ b/app/Services/Servers/ServerCreationService.php @@ -128,7 +128,7 @@ class ServerCreationService return Server::create([ 'external_id' => Arr::get($data, 'external_id'), 'uuid' => $uuid, - 'uuidShort' => substr($uuid, 0, 8), + 'uuid_short' => substr($uuid, 0, 8), 'node_id' => Arr::get($data, 'node_id'), 'name' => Arr::get($data, 'name'), 'description' => Arr::get($data, 'description') ?? '', @@ -193,7 +193,7 @@ class ServerCreationService $uuid = Uuid::uuid4()->toString(); $shortUuid = str($uuid)->substr(0, 8); - if (Server::query()->where('uuid', $uuid)->orWhere('uuidShort', $shortUuid)->exists()) { + if (Server::query()->where('uuid', $uuid)->orWhere('uuid_short', $shortUuid)->exists()) { return $this->generateUniqueUuidCombo(); } diff --git a/app/Transformers/Api/Application/NodeTransformer.php b/app/Transformers/Api/Application/NodeTransformer.php index 39bd452a3..439d5c873 100644 --- a/app/Transformers/Api/Application/NodeTransformer.php +++ b/app/Transformers/Api/Application/NodeTransformer.php @@ -31,7 +31,7 @@ class NodeTransformer extends BaseTransformer $response = collect($node->toArray())->mapWithKeys(function ($value, $key) { // I messed up early in 2016 when I named this column as poorly // as I did. This is the tragic result of my mistakes. - $key = ($key === 'daemonSFTP') ? 'daemonSftp' : $key; + $key = ($key === 'daemon_sftp') ? 'daemon_sftp' : $key; return [snake_case($key) => $value]; })->toArray(); diff --git a/app/Transformers/Api/Application/ServerTransformer.php b/app/Transformers/Api/Application/ServerTransformer.php index 4f789f99d..b315422c5 100644 --- a/app/Transformers/Api/Application/ServerTransformer.php +++ b/app/Transformers/Api/Application/ServerTransformer.php @@ -52,7 +52,7 @@ class ServerTransformer extends BaseTransformer 'id' => $server->getKey(), 'external_id' => $server->external_id, 'uuid' => $server->uuid, - 'identifier' => $server->uuidShort, + 'identifier' => $server->uuid_short, 'name' => $server->name, 'description' => $server->description, 'status' => $server->status, diff --git a/app/Transformers/Api/Client/ServerTransformer.php b/app/Transformers/Api/Client/ServerTransformer.php index 2c8ee8fe5..aece52bd5 100644 --- a/app/Transformers/Api/Client/ServerTransformer.php +++ b/app/Transformers/Api/Client/ServerTransformer.php @@ -38,7 +38,7 @@ class ServerTransformer extends BaseClientTransformer return [ 'server_owner' => $user->id === $server->owner_id, - 'identifier' => $server->uuidShort, + 'identifier' => $server->uuid_short, 'internal_id' => $server->id, 'uuid' => $server->uuid, 'name' => $server->name, @@ -46,7 +46,7 @@ class ServerTransformer extends BaseClientTransformer 'is_node_under_maintenance' => $server->node->isUnderMaintenance(), 'sftp_details' => [ 'ip' => $server->node->fqdn, - 'port' => $server->node->daemonSFTP, + 'port' => $server->node->daemon_sftp, ], 'description' => $server->description, 'limits' => [ diff --git a/database/Factories/NodeFactory.php b/database/Factories/NodeFactory.php index d8a7fff22..ccee27214 100644 --- a/database/Factories/NodeFactory.php +++ b/database/Factories/NodeFactory.php @@ -36,9 +36,9 @@ class NodeFactory extends Factory 'upload_size' => 100, 'daemon_token_id' => Str::random(Node::DAEMON_TOKEN_ID_LENGTH), 'daemon_token' => Crypt::encrypt(Str::random(Node::DAEMON_TOKEN_LENGTH)), - 'daemonListen' => 8080, - 'daemonSFTP' => 2022, - 'daemonBase' => '/var/lib/panel/volumes', + 'daemon_listen' => 8080, + 'daemon_sftp' => 2022, + 'daemon_base' => '/var/lib/panel/volumes', ]; } } diff --git a/database/Factories/ServerFactory.php b/database/Factories/ServerFactory.php index c454ca26e..3bd7931b3 100644 --- a/database/Factories/ServerFactory.php +++ b/database/Factories/ServerFactory.php @@ -24,7 +24,7 @@ class ServerFactory extends Factory { return [ 'uuid' => Uuid::uuid4()->toString(), - 'uuidShort' => Str::lower(Str::random(8)), + 'uuid_short' => Str::lower(Str::random(8)), 'name' => $this->faker->firstName(), 'description' => implode(' ', $this->faker->sentences()), 'skip_scripts' => 0, diff --git a/database/migrations/2023_02_23_191004_add_expires_at_column_to_api_keys_table.php b/database/migrations/2023_02_23_191004_add_expires_at_column_to_api_keys_table.php deleted file mode 100644 index b471550dd..000000000 --- a/database/migrations/2023_02_23_191004_add_expires_at_column_to_api_keys_table.php +++ /dev/null @@ -1,28 +0,0 @@ -timestamp('expires_at')->nullable()->after('last_used_at'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('api_keys', function (Blueprint $table) { - $table->dropColumn('expires_at'); - }); - } -}; diff --git a/database/migrations/2024_04_14_002250_update_column_names.php b/database/migrations/2024_04_14_002250_update_column_names.php new file mode 100644 index 000000000..37e7e4857 --- /dev/null +++ b/database/migrations/2024_04_14_002250_update_column_names.php @@ -0,0 +1,40 @@ +renameColumn('daemonListen', 'daemon_listen'); + $table->renameColumn('daemonBase', 'daemon_base'); + $table->renameColumn('daemonSFTP', 'daemon_sftp'); + }); + + Schema::table('servers', function (Blueprint $table) { + $table->renameColumn('uuidShort', 'uuid_short'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('nodes', function (Blueprint $table) { + $table->renameColumn('daemon_listen', 'daemonListen'); + $table->renameColumn('daemon_sftp', 'daemonSFTP'); + $table->renameColumn('daemon_base', 'daemonBase'); + }); + + Schema::table('servers', function (Blueprint $table) { + $table->renameColumn('uuid_short', 'uuidShort'); + }); + } +}; diff --git a/package.json b/package.json index 82fc4d539..11f9b9020 100644 --- a/package.json +++ b/package.json @@ -133,10 +133,10 @@ "clean": "cd public/assets && find . \\( -name \"*.js\" -o -name \"*.map\" \\) -type f -delete", "test": "jest", "lint": "eslint ./resources/scripts/**/*.{ts,tsx} --ext .ts,.tsx", - "watch": "cross-env NODE_ENV=development ./node_modules/.bin/webpack --watch --progress", + "watch": "cross-env NODE_OPTIONS='--openssl-legacy-provider' NODE_ENV=development ./node_modules/.bin/webpack --watch --progress", "build": "cross-env NODE_OPTIONS='--openssl-legacy-provider' NODE_ENV=development ./node_modules/.bin/webpack --progress", "build:production": "yarn run clean && cross-env NODE_OPTIONS='--openssl-legacy-provider' NODE_ENV=production ./node_modules/.bin/webpack --mode production", - "serve": "yarn run clean && cross-env WEBPACK_PUBLIC_PATH=/webpack@hmr/ NODE_ENV=development webpack-dev-server --host 0.0.0.0 --port 8080 --public https://panel.test --hot" + "serve": "yarn run clean && cross-env WEBPACK_PUBLIC_PATH=/webpack@hmr/ NODE_OPTIONS='--openssl-legacy-provider' NODE_ENV=development webpack-dev-server --host 0.0.0.0 --port 8080 --public https://panel.test --hot" }, "browserslist": [ "> 0.5%", diff --git a/resources/views/admin/nodes/index.blade.php b/resources/views/admin/nodes/index.blade.php index f2ff1617a..8f003d953 100644 --- a/resources/views/admin/nodes/index.blade.php +++ b/resources/views/admin/nodes/index.blade.php @@ -49,7 +49,7 @@ @foreach ($nodes as $node) - + {!! $node->maintenance_mode ? ' ' : '' !!}{{ $node->name }} {{ $node->memory }} MiB {{ $node->disk }} MiB diff --git a/resources/views/admin/nodes/new.blade.php b/resources/views/admin/nodes/new.blade.php index a51bdc189..7e2c73eff 100644 --- a/resources/views/admin/nodes/new.blade.php +++ b/resources/views/admin/nodes/new.blade.php @@ -94,8 +94,8 @@
- - + +

Enter the directory where server files should be stored. If you use OVH you should check your partition scheme. You may need to use /home/daemon-data to have enough space.

@@ -137,12 +137,12 @@
- - + +
- - + +

The daemon runs its own SFTP management container and does not use the SSHd process on the main physical server. Do not use the same port that you have assigned for your physical server's SSH process. If you will be running the daemon behind CloudFlare® you should set the daemon port to 8443 to allow websocket proxying over SSL.

diff --git a/resources/views/admin/nodes/view/servers.blade.php b/resources/views/admin/nodes/view/servers.blade.php index e443dc749..4b190cf2e 100644 --- a/resources/views/admin/nodes/view/servers.blade.php +++ b/resources/views/admin/nodes/view/servers.blade.php @@ -44,7 +44,7 @@ @foreach($servers as $server) - {{ $server->uuidShort }} + {{ $server->uuid_short }} {{ $server->name }} {{ $server->user->username }} {{ $server->egg->name }} diff --git a/resources/views/admin/nodes/view/settings.blade.php b/resources/views/admin/nodes/view/settings.blade.php index 56c06873c..72dc9de5d 100644 --- a/resources/views/admin/nodes/view/settings.blade.php +++ b/resources/views/admin/nodes/view/settings.blade.php @@ -174,15 +174,15 @@
- +
- +
- +
- +
diff --git a/resources/views/admin/servers/index.blade.php b/resources/views/admin/servers/index.blade.php index 0cc89e597..65f40c85b 100644 --- a/resources/views/admin/servers/index.blade.php +++ b/resources/views/admin/servers/index.blade.php @@ -43,7 +43,7 @@ @foreach ($servers as $server) - + {{ $server->name }} {{ $server->uuid }} {{ $server->user->username }} @@ -61,7 +61,7 @@ @endif - + @endforeach diff --git a/resources/views/admin/servers/partials/navigation.blade.php b/resources/views/admin/servers/partials/navigation.blade.php index 2f74d514e..c1285249e 100644 --- a/resources/views/admin/servers/partials/navigation.blade.php +++ b/resources/views/admin/servers/partials/navigation.blade.php @@ -32,7 +32,7 @@ Delete
  • - +
  • diff --git a/resources/views/admin/servers/view/database.blade.php b/resources/views/admin/servers/view/database.blade.php index 385ce0f3f..05aed3d94 100644 --- a/resources/views/admin/servers/view/database.blade.php +++ b/resources/views/admin/servers/view/database.blade.php @@ -19,7 +19,7 @@
    - Database passwords can be viewed when visiting this server on the front-end. + Database passwords can be viewed when visiting this server on the front-end.
    diff --git a/tests/Integration/Api/Client/ClientControllerTest.php b/tests/Integration/Api/Client/ClientControllerTest.php index 50a150a9d..29805711f 100644 --- a/tests/Integration/Api/Client/ClientControllerTest.php +++ b/tests/Integration/Api/Client/ClientControllerTest.php @@ -33,7 +33,7 @@ class ClientControllerTest extends ClientApiIntegrationTestCase $response->assertOk(); $response->assertJsonPath('object', 'list'); $response->assertJsonPath('data.0.object', Server::RESOURCE_NAME); - $response->assertJsonPath('data.0.attributes.identifier', $servers[0]->uuidShort); + $response->assertJsonPath('data.0.attributes.identifier', $servers[0]->uuid_short); $response->assertJsonPath('data.0.attributes.server_owner', true); $response->assertJsonPath('meta.pagination.total', 1); $response->assertJsonPath('meta.pagination.per_page', 50); @@ -52,7 +52,7 @@ class ClientControllerTest extends ClientApiIntegrationTestCase /** @var \App\Models\Server[] $servers */ $servers = [ $this->createServerModel(['user_id' => $users[0]->id, 'name' => 'Julia']), - $this->createServerModel(['user_id' => $users[1]->id, 'uuidShort' => '12121212', 'name' => 'Janice']), + $this->createServerModel(['user_id' => $users[1]->id, 'uuid_short' => '12121212', 'name' => 'Janice']), $this->createServerModel(['user_id' => $users[1]->id, 'uuid' => '88788878-12356789', 'external_id' => 'ext123', 'name' => 'Julia']), $this->createServerModel(['user_id' => $users[1]->id, 'uuid' => '88788878-abcdefgh', 'name' => 'Jennifer']), ]; @@ -60,39 +60,39 @@ class ClientControllerTest extends ClientApiIntegrationTestCase $this->actingAs($users[1])->getJson('/api/client?filter[*]=Julia') ->assertOk() ->assertJsonCount(1, 'data') - ->assertJsonPath('data.0.attributes.identifier', $servers[2]->uuidShort); + ->assertJsonPath('data.0.attributes.identifier', $servers[2]->uuid_short); $this->actingAs($users[1])->getJson('/api/client?filter[*]=ext123') ->assertOk() ->assertJsonCount(1, 'data') - ->assertJsonPath('data.0.attributes.identifier', $servers[2]->uuidShort); + ->assertJsonPath('data.0.attributes.identifier', $servers[2]->uuid_short); $this->actingAs($users[1])->getJson('/api/client?filter[*]=ext123') ->assertOk() ->assertJsonCount(1, 'data') - ->assertJsonPath('data.0.attributes.identifier', $servers[2]->uuidShort); + ->assertJsonPath('data.0.attributes.identifier', $servers[2]->uuid_short); $this->actingAs($users[1])->getJson('/api/client?filter[*]=12121212') ->assertOk() ->assertJsonCount(1, 'data') - ->assertJsonPath('data.0.attributes.identifier', $servers[1]->uuidShort); + ->assertJsonPath('data.0.attributes.identifier', $servers[1]->uuid_short); $this->actingAs($users[1])->getJson('/api/client?filter[*]=88788878') ->assertOk() ->assertJsonCount(2, 'data') - ->assertJsonPath('data.0.attributes.identifier', $servers[2]->uuidShort) - ->assertJsonPath('data.1.attributes.identifier', $servers[3]->uuidShort); + ->assertJsonPath('data.0.attributes.identifier', $servers[2]->uuid_short) + ->assertJsonPath('data.1.attributes.identifier', $servers[3]->uuid_short); $this->actingAs($users[1])->getJson('/api/client?filter[*]=88788878-abcd') ->assertOk() ->assertJsonCount(1, 'data') - ->assertJsonPath('data.0.attributes.identifier', $servers[3]->uuidShort); + ->assertJsonPath('data.0.attributes.identifier', $servers[3]->uuid_short); $this->actingAs($users[0])->getJson('/api/client?filter[*]=Julia&type=admin-all') ->assertOk() ->assertJsonCount(2, 'data') - ->assertJsonPath('data.0.attributes.identifier', $servers[0]->uuidShort) - ->assertJsonPath('data.1.attributes.identifier', $servers[2]->uuidShort); + ->assertJsonPath('data.0.attributes.identifier', $servers[0]->uuid_short) + ->assertJsonPath('data.1.attributes.identifier', $servers[2]->uuid_short); } /** @@ -118,24 +118,24 @@ class ClientControllerTest extends ClientApiIntegrationTestCase $this->actingAs($user)->getJson('/api/client?filter[*]=192.168.1.1') ->assertOk() ->assertJsonCount(2, 'data') - ->assertJsonPath('data.0.attributes.identifier', $server->uuidShort) - ->assertJsonPath('data.1.attributes.identifier', $server2->uuidShort); + ->assertJsonPath('data.0.attributes.identifier', $server->uuid_short) + ->assertJsonPath('data.1.attributes.identifier', $server2->uuid_short); $this->actingAs($user)->getJson('/api/client?filter[*]=192.168.1.1:25565') ->assertOk() ->assertJsonCount(1, 'data') - ->assertJsonPath('data.0.attributes.identifier', $server->uuidShort); + ->assertJsonPath('data.0.attributes.identifier', $server->uuid_short); $this->actingAs($user)->getJson('/api/client?filter[*]=:25570') ->assertOk() ->assertJsonCount(1, 'data') - ->assertJsonPath('data.0.attributes.identifier', $server2->uuidShort); + ->assertJsonPath('data.0.attributes.identifier', $server2->uuid_short); $this->actingAs($user)->getJson('/api/client?filter[*]=:255') ->assertOk() ->assertJsonCount(2, 'data') - ->assertJsonPath('data.0.attributes.identifier', $server->uuidShort) - ->assertJsonPath('data.1.attributes.identifier', $server2->uuidShort); + ->assertJsonPath('data.0.attributes.identifier', $server->uuid_short) + ->assertJsonPath('data.1.attributes.identifier', $server2->uuid_short); } /** @@ -164,9 +164,9 @@ class ClientControllerTest extends ClientApiIntegrationTestCase $response->assertOk(); $response->assertJsonCount(2, 'data'); $response->assertJsonPath('data.0.attributes.server_owner', true); - $response->assertJsonPath('data.0.attributes.identifier', $servers[0]->uuidShort); + $response->assertJsonPath('data.0.attributes.identifier', $servers[0]->uuid_short); $response->assertJsonPath('data.1.attributes.server_owner', false); - $response->assertJsonPath('data.1.attributes.identifier', $servers[1]->uuidShort); + $response->assertJsonPath('data.1.attributes.identifier', $servers[1]->uuid_short); } /** @@ -195,7 +195,7 @@ class ClientControllerTest extends ClientApiIntegrationTestCase $response->assertOk(); $response->assertJsonCount(1, 'data'); $response->assertJsonPath('data.0.attributes.server_owner', true); - $response->assertJsonPath('data.0.attributes.identifier', $servers[0]->uuidShort); + $response->assertJsonPath('data.0.attributes.identifier', $servers[0]->uuid_short); } /** @@ -248,9 +248,9 @@ class ClientControllerTest extends ClientApiIntegrationTestCase $response->assertJsonCount(2, 'data'); $response->assertJsonPath('data.0.attributes.server_owner', false); - $response->assertJsonPath('data.0.attributes.identifier', $servers[2]->uuidShort); + $response->assertJsonPath('data.0.attributes.identifier', $servers[2]->uuid_short); $response->assertJsonPath('data.1.attributes.server_owner', false); - $response->assertJsonPath('data.1.attributes.identifier', $servers[3]->uuidShort); + $response->assertJsonPath('data.1.attributes.identifier', $servers[3]->uuid_short); } /** diff --git a/tests/Integration/Api/Remote/SftpAuthenticationControllerTest.php b/tests/Integration/Api/Remote/SftpAuthenticationControllerTest.php index f460ecc50..7b572b435 100644 --- a/tests/Integration/Api/Remote/SftpAuthenticationControllerTest.php +++ b/tests/Integration/Api/Remote/SftpAuthenticationControllerTest.php @@ -141,7 +141,7 @@ class SftpAuthenticationControllerTest extends IntegrationTestCase $this->setAuthorization($server->node); $this->postJson('/api/remote/sftp/auth', [ - 'username' => $user->username . '.' . $server->uuidShort, + 'username' => $user->username . '.' . $server->uuid_short, 'password' => 'foobar', ]) ->assertForbidden() @@ -171,7 +171,7 @@ class SftpAuthenticationControllerTest extends IntegrationTestCase $this->setAuthorization($server->node); $data = [ - 'username' => $user->username . '.' . $server->uuidShort, + 'username' => $user->username . '.' . $server->uuid_short, 'password' => 'foobar', ]; @@ -186,7 +186,7 @@ class SftpAuthenticationControllerTest extends IntegrationTestCase ->assertJsonPath('permissions.0', '*'); $this->setAuthorization(); - $data['username'] = $user->username . '.' . $this->server->uuidShort; + $data['username'] = $user->username . '.' . $this->server->uuid_short; $this->post('/api/remote/sftp/auth', $data) ->assertOk() @@ -218,7 +218,7 @@ class SftpAuthenticationControllerTest extends IntegrationTestCase */ protected function getUsername(bool $long = false): string { - return $this->user->username . '.' . ($long ? $this->server->uuid : $this->server->uuidShort); + return $this->user->username . '.' . ($long ? $this->server->uuid : $this->server->uuid_short); } /** diff --git a/tests/Integration/Services/Servers/ServerCreationServiceTest.php b/tests/Integration/Services/Servers/ServerCreationServiceTest.php index 2f974aa5e..8d3df350a 100644 --- a/tests/Integration/Services/Servers/ServerCreationServiceTest.php +++ b/tests/Integration/Services/Servers/ServerCreationServiceTest.php @@ -118,7 +118,7 @@ class ServerCreationServiceTest extends IntegrationTestCase $this->assertInstanceOf(Server::class, $response); $this->assertNotNull($response->uuid); - $this->assertSame($response->uuidShort, substr($response->uuid, 0, 8)); + $this->assertSame($response->uuid_short, substr($response->uuid, 0, 8)); $this->assertSame($egg->id, $response->egg_id); $this->assertCount(2, $response->variables); $this->assertSame('123', $response->variables[0]->server_value); From 0814b82b7ec35f447e588f8115ca3cc8e9db93af Mon Sep 17 00:00:00 2001 From: notCharles Date: Sun, 14 Apr 2024 15:23:03 -0400 Subject: [PATCH 02/13] pint --- database/migrations/2024_04_14_002250_update_column_names.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/migrations/2024_04_14_002250_update_column_names.php b/database/migrations/2024_04_14_002250_update_column_names.php index 37e7e4857..42871776c 100644 --- a/database/migrations/2024_04_14_002250_update_column_names.php +++ b/database/migrations/2024_04_14_002250_update_column_names.php @@ -18,7 +18,7 @@ return new class extends Migration }); Schema::table('servers', function (Blueprint $table) { - $table->renameColumn('uuidShort', 'uuid_short'); + $table->renameColumn('uuidShort', 'uuid_short'); }); } From 6118ed91fa38ee2db4244f8835f25b0aa13510fb Mon Sep 17 00:00:00 2001 From: notCharles Date: Sun, 14 Apr 2024 15:23:15 -0400 Subject: [PATCH 03/13] oops, readd this --- ...dd_expires_at_column_to_api_keys_table.php | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 database/migrations/2023_02_23_191004_add_expires_at_column_to_api_keys_table.php diff --git a/database/migrations/2023_02_23_191004_add_expires_at_column_to_api_keys_table.php b/database/migrations/2023_02_23_191004_add_expires_at_column_to_api_keys_table.php new file mode 100644 index 000000000..b471550dd --- /dev/null +++ b/database/migrations/2023_02_23_191004_add_expires_at_column_to_api_keys_table.php @@ -0,0 +1,28 @@ +timestamp('expires_at')->nullable()->after('last_used_at'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('api_keys', function (Blueprint $table) { + $table->dropColumn('expires_at'); + }); + } +}; From dc8d7aa3da2a0f2513097db1c0b42ed479a58222 Mon Sep 17 00:00:00 2001 From: notCharles Date: Sun, 14 Apr 2024 20:53:50 -0400 Subject: [PATCH 04/13] Fix mariadb? --- database/migrations/2024_04_14_002250_update_column_names.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/database/migrations/2024_04_14_002250_update_column_names.php b/database/migrations/2024_04_14_002250_update_column_names.php index 42871776c..21303f36b 100644 --- a/database/migrations/2024_04_14_002250_update_column_names.php +++ b/database/migrations/2024_04_14_002250_update_column_names.php @@ -11,6 +11,10 @@ return new class extends Migration */ public function up(): void { + Schema::table('nodes', function (Blueprint $table) { + $table->string('daemonBase', 191)->default(null)->change(); + }); + Schema::table('nodes', function (Blueprint $table) { $table->renameColumn('daemonListen', 'daemon_listen'); $table->renameColumn('daemonBase', 'daemon_base'); From fa46f78fd5d42ea7a6742b5c6bc6f3c487926cdd Mon Sep 17 00:00:00 2001 From: Boy132 Date: Thu, 18 Apr 2024 20:47:42 +0200 Subject: [PATCH 05/13] update dockerfile to php 8.3 add php intl extension change to official nodejs image and to nodejs 21 --- .github/docker/entrypoint.sh | 2 +- Dockerfile | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/docker/entrypoint.sh b/.github/docker/entrypoint.sh index 9cd4c9b0f..7f4de80cd 100644 --- a/.github/docker/entrypoint.sh +++ b/.github/docker/entrypoint.sh @@ -1,7 +1,7 @@ #!/bin/ash -e cd /app -mkdir -p /var/log/panel/logs/ /var/log/supervisord/ /var/log/nginx/ /var/log/php7/ \ +mkdir -p /var/log/panel/logs/ /var/log/supervisord/ /var/log/nginx/ /var/log/php8/ \ && chmod 777 /var/log/panel/logs/ \ && ln -s /app/storage/logs/ /var/log/panel/ diff --git a/Dockerfile b/Dockerfile index 95d0fefe2..1c3c34a62 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ # Build the assets that are needed for the frontend. This build stage is then discarded # since we won't need NodeJS anymore in the future. This Docker image ships a final production # level distribution -FROM --platform=$TARGETOS/$TARGETARCH mhart/alpine-node:14 +FROM --platform=$TARGETOS/$TARGETARCH node:21-alpine WORKDIR /app COPY . ./ RUN yarn install --frozen-lockfile \ @@ -10,13 +10,13 @@ RUN yarn install --frozen-lockfile \ # Stage 1: # Build the actual container with all of the needed PHP dependencies that will run the application. -FROM --platform=$TARGETOS/$TARGETARCH php:8.1-fpm-alpine +FROM --platform=$TARGETOS/$TARGETARCH php:8.3-fpm-alpine WORKDIR /app COPY . ./ COPY --from=0 /app/public/assets ./public/assets -RUN apk add --no-cache --update ca-certificates dcron curl git supervisor tar unzip nginx libpng-dev libxml2-dev libzip-dev certbot certbot-nginx \ +RUN apk add --no-cache --update ca-certificates dcron curl git supervisor tar unzip nginx libpng-dev libxml2-dev libzip-dev icu-dev certbot certbot-nginx \ && docker-php-ext-configure zip \ - && docker-php-ext-install bcmath gd pdo_mysql zip \ + && docker-php-ext-install bcmath gd intl pdo_mysql zip \ && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \ && cp .env.example .env \ && mkdir -p bootstrap/cache/ storage/logs storage/framework/sessions storage/framework/views storage/framework/cache \ From 01f89d7855c2c1fbadbcdfa0bf4c8a8f9ae50462 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Sun, 21 Apr 2024 15:14:13 +0200 Subject: [PATCH 06/13] add nodejs 21 to build workflow --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index be1b59369..4bbbae1fd 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [18] + node-version: [18, 21] steps: - name: Code Checkout uses: actions/checkout@v4 From 85f7bf30b90036eb706c07b59a9e845e0d18b9dc Mon Sep 17 00:00:00 2001 From: notCharles Date: Sun, 21 Apr 2024 14:08:40 -0400 Subject: [PATCH 07/13] fix daemon_base --- app/Models/Node.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Models/Node.php b/app/Models/Node.php index 5de40c253..2d242e966 100644 --- a/app/Models/Node.php +++ b/app/Models/Node.php @@ -98,7 +98,7 @@ class Node extends Model 'behind_proxy' => false, 'memory_overallocate' => 0, 'disk_overallocate' => 0, - 'daemon_base' => '/var/lib/panel/volumes', + 'daemon_base' => '/var/lib/pelican/volumes', 'daemon_sftp' => 2022, 'daemon_listen' => 8080, 'maintenance_mode' => false, From ba7a5d5126ea5e85dcf4b3b0dfaaab1252a9ff98 Mon Sep 17 00:00:00 2001 From: Lance Pioch Date: Sun, 21 Apr 2024 14:17:32 -0400 Subject: [PATCH 08/13] Be explicit about this being a string --- app/Models/User.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Models/User.php b/app/Models/User.php index 33905ae55..b50dba9f0 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -177,7 +177,7 @@ class User extends Model implements AuthenticatableContract, AuthorizableContrac protected static function booted(): void { static::creating(function (self $user) { - $user->uuid = Str::uuid(); + $user->uuid = Str::uuid()->toString(); return true; }); From 3ad622dd697fc879239d3c836692ac0058dcaef0 Mon Sep 17 00:00:00 2001 From: Lance Pioch Date: Sun, 21 Apr 2024 15:16:03 -0400 Subject: [PATCH 09/13] Add new completed language --- app/Traits/Helpers/AvailableLanguages.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Traits/Helpers/AvailableLanguages.php b/app/Traits/Helpers/AvailableLanguages.php index c4bf74966..53b45c5a6 100644 --- a/app/Traits/Helpers/AvailableLanguages.php +++ b/app/Traits/Helpers/AvailableLanguages.php @@ -21,6 +21,7 @@ trait AvailableLanguages 'ja', 'nl', 'pl', + 'sk', 'ru', 'tr', ]; From 9baaff53cd734f61755f737aebc11f79d3e7c251 Mon Sep 17 00:00:00 2001 From: notCharles Date: Sun, 21 Apr 2024 15:27:05 -0400 Subject: [PATCH 10/13] Update node allocation page --- .../Resources/NodeResource/Pages/EditNode.php | 73 +++++++++++++++++-- 1 file changed, 67 insertions(+), 6 deletions(-) diff --git a/app/Filament/Resources/NodeResource/Pages/EditNode.php b/app/Filament/Resources/NodeResource/Pages/EditNode.php index ff0b6eaef..65553abd2 100644 --- a/app/Filament/Resources/NodeResource/Pages/EditNode.php +++ b/app/Filament/Resources/NodeResource/Pages/EditNode.php @@ -3,12 +3,12 @@ namespace App\Filament\Resources\NodeResource\Pages; use App\Filament\Resources\NodeResource; -use App\Models\Allocation; use App\Models\Node; use Filament\Actions; use Filament\Forms; use Filament\Forms\Components\Tabs; use Filament\Resources\Pages\EditRecord; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\HtmlString; use Webbingbrasil\FilamentCopyActions\Forms\Actions\CopyAction; @@ -91,6 +91,52 @@ class EditNode extends EditRecord 'md' => 1, 'lg' => 1, ]) + ->live() + ->afterStateUpdated(function ($state, Forms\Set $set) { + $ports = collect(); + $update = false; + foreach ($state as $portEntry) { + if (!str_contains($portEntry, '-')) { + if (is_numeric($portEntry)) { + $ports->push((int) $portEntry); + + continue; + } + + // Do not add non numerical ports + $update = true; + + continue; + } + + $update = true; + [$start, $end] = explode('-', $portEntry); + if (!is_numeric($start) || !is_numeric($end)) { + continue; + } + + $start = max((int) $start, 0); + $end = min((int) $end, 2 ** 16 - 1); + for ($i = $start; $i <= $end; $i++) { + $ports->push($i); + } + } + + $uniquePorts = $ports->unique()->values(); + if ($ports->count() > $uniquePorts->count()) { + $update = true; + $ports = $uniquePorts; + } + + $sortedPorts = $ports->sort()->values(); + if ($sortedPorts->all() !== $ports->all()) { + $update = true; + $ports = $sortedPorts; + } + if ($update) { + $set('port', $ports->all()); + } + }) ->placeholder('25565') ->helperText('Individual ports or port ranges here separated by spaces') ->splitKeys(['Tab', ' ']), @@ -108,6 +154,15 @@ class EditNode extends EditRecord Forms\Components\Repeater::make('allocations') ->orderColumn('server_id') ->columnSpan(4) + ->collapsible()->collapsed() + ->itemLabel(function (array $state) { + $host = $state['ip'] . ':' . $state['port']; + if ($state['ip_alias']) { + return $state['ip_alias'] ." ($host)"; + } + + return $host; + }) ->columns([ 'default' => 1, 'sm' => 3, @@ -133,7 +188,7 @@ class EditNode extends EditRecord 'default' => 1, 'sm' => 1, 'md' => 1, - 'lg' => 1, + 'lg' => 2, ]) ->minValue(0) ->maxValue(65535) @@ -147,15 +202,21 @@ class EditNode extends EditRecord 'lg' => 3, ]) ->label('Alias'), - Forms\Components\TextInput::make('server') + Forms\Components\Select::make('server') ->columnSpan([ 'default' => 1, 'sm' => 1, 'md' => 2, - 'lg' => 3, + 'lg' => 2, ]) - ->formatStateUsing(fn (Allocation $allocation) => $allocation->server?->name) - ->activeUrl(true) + ->searchable() + ->preload() + ->relationship( + 'server', + 'name', + fn (Builder $query, Forms\Get $get) => $query + ->where('node_id', $get('node_id')), + ) ->placeholder('Not assigned'), ]), ]), From 145568237c74e9cf69929e86da0ed0254a100f79 Mon Sep 17 00:00:00 2001 From: notCharles Date: Sun, 21 Apr 2024 15:50:46 -0400 Subject: [PATCH 11/13] Rename columns --- app/Console/Commands/Node/MakeNodeCommand.php | 2 +- app/Filament/Resources/NodeResource.php | 6 +++--- app/Filament/Resources/NodeResource/Pages/CreateNode.php | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/Console/Commands/Node/MakeNodeCommand.php b/app/Console/Commands/Node/MakeNodeCommand.php index e92e11e7e..002b36b78 100644 --- a/app/Console/Commands/Node/MakeNodeCommand.php +++ b/app/Console/Commands/Node/MakeNodeCommand.php @@ -60,7 +60,7 @@ class MakeNodeCommand extends Command $data['upload_size'] = $this->option('uploadSize') ?? $this->ask('Enter the maximum filesize upload', '100'); $data['daemon_listen'] = $this->option('daemonListeningPort') ?? $this->ask('Enter the daemon listening port', '8080'); $data['daemon_sftp'] = $this->option('daemonSFTPPort') ?? $this->ask('Enter the daemon SFTP listening port', '2022'); - $data['daemon_base'] = $this->option('daemonBase') ?? $this->ask('Enter the base folder', '/var/lib/panel/volumes'); + $data['daemon_base'] = $this->option('daemonBase') ?? $this->ask('Enter the base folder', '/var/lib/pelican/volumes'); $node = $this->creationService->handle($data); $this->line('Successfully created a new node with the name ' . $data['name'] . ' and has an id of ' . $node->id . '.'); diff --git a/app/Filament/Resources/NodeResource.php b/app/Filament/Resources/NodeResource.php index f07b85fac..92599c666 100644 --- a/app/Filament/Resources/NodeResource.php +++ b/app/Filament/Resources/NodeResource.php @@ -43,17 +43,17 @@ class NodeResource extends Resource ->required() ->integer() ->default(100), - Forms\Components\TextInput::make('daemonListen') + Forms\Components\TextInput::make('daemon_listen') ->required() ->integer() ->label('Daemon Port') ->default(8080), - Forms\Components\TextInput::make('daemonSFTP') + Forms\Components\TextInput::make('daemon_sftp') ->required() ->integer() ->label('Daemon SFTP Port') ->default(2022), - Forms\Components\TextInput::make('daemonBase') + Forms\Components\TextInput::make('daemon_base') ->required() ->maxLength(191) ->default('/home/daemon-files'), diff --git a/app/Filament/Resources/NodeResource/Pages/CreateNode.php b/app/Filament/Resources/NodeResource/Pages/CreateNode.php index 4427bea4e..1da210fe9 100644 --- a/app/Filament/Resources/NodeResource/Pages/CreateNode.php +++ b/app/Filament/Resources/NodeResource/Pages/CreateNode.php @@ -113,7 +113,7 @@ class CreateNode extends CreateRecord 'lg' => 1, ]), - Forms\Components\TextInput::make('daemonListen') + Forms\Components\TextInput::make('daemon_listen') ->columnSpan([ 'default' => 1, 'sm' => 1, From dfaff50ca14cd26b37530969ff6990f4b02ebe9c Mon Sep 17 00:00:00 2001 From: Lance Pioch Date: Sun, 21 Apr 2024 15:57:15 -0400 Subject: [PATCH 12/13] Fix egg variable saving --- app/Filament/Resources/EggResource.php | 24 +++++++++++++++++++----- app/Models/EggVariable.php | 2 +- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/app/Filament/Resources/EggResource.php b/app/Filament/Resources/EggResource.php index 62e105cc0..7c5ce79a1 100644 --- a/app/Filament/Resources/EggResource.php +++ b/app/Filament/Resources/EggResource.php @@ -77,23 +77,37 @@ class EggResource extends Resource ->label('Log Configuration') ->helperText('This should be a JSON representation of where log files are stored, and whether or not the daemon should be creating custom logs.'), ]), - Forms\Components\Tabs\Tab::make('Variables') + Forms\Components\Tabs\Tab::make('Egg Variables') ->columnSpanFull() // ->columns(2) ->schema([ - Forms\Components\Repeater::make('Blah') + Forms\Components\Repeater::make('variables') ->grid(3) ->relationship('variables') ->name('name') ->columns(1) ->columnSpan(1) ->itemLabel(fn (array $state) => $state['name']) + ->mutateRelationshipDataBeforeCreateUsing(function (array $data): array { + $data['default_value'] ??= ''; + $data['description'] ??= ''; + $data['rules'] ??= ''; + + return $data; + }) + ->mutateRelationshipDataBeforeSaveUsing(function (array $data): array { + $data['default_value'] ??= ''; + $data['description'] ??= ''; + $data['rules'] ??= ''; + + return $data; + }) ->schema([ - Forms\Components\TextInput::make('name')->live()->maxLength(191)->columnSpanFull(), + Forms\Components\TextInput::make('name')->live()->maxLength(191)->columnSpanFull()->required(), Forms\Components\Textarea::make('description')->columnSpanFull(), - Forms\Components\TextInput::make('env_variable')->maxLength(191), + Forms\Components\TextInput::make('env_variable')->maxLength(191)->required(), Forms\Components\TextInput::make('default_value')->maxLength(191), - Forms\Components\Textarea::make('rules')->rows(3)->columnSpanFull()->required(), + Forms\Components\Textarea::make('rules')->rows(3)->columnSpanFull(), ]), ]), Forms\Components\Tabs\Tab::make('Install Script') diff --git a/app/Models/EggVariable.php b/app/Models/EggVariable.php index 6df7c53b9..fceba3d8c 100644 --- a/app/Models/EggVariable.php +++ b/app/Models/EggVariable.php @@ -56,7 +56,7 @@ class EggVariable extends Model 'default_value' => 'string', 'user_viewable' => 'boolean', 'user_editable' => 'boolean', - 'rules' => 'required|string', + 'rules' => 'string', ]; protected $attributes = [ From 788056d55d7d1b7e3b6ebfa5af0726142588a1ad Mon Sep 17 00:00:00 2001 From: Lance Pioch Date: Sun, 21 Apr 2024 16:18:13 -0400 Subject: [PATCH 13/13] Small updates --- app/Filament/Resources/EggResource.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/app/Filament/Resources/EggResource.php b/app/Filament/Resources/EggResource.php index 7c5ce79a1..13c234d04 100644 --- a/app/Filament/Resources/EggResource.php +++ b/app/Filament/Resources/EggResource.php @@ -103,9 +103,18 @@ class EggResource extends Resource return $data; }) ->schema([ - Forms\Components\TextInput::make('name')->live()->maxLength(191)->columnSpanFull()->required(), + Forms\Components\TextInput::make('name') + ->live() + ->debounce(1000) + ->maxLength(191) + ->columnSpanFull() + ->afterStateUpdated(fn (Forms\Set $set, $state) => $set('env_variable', str($state)->trim()->snake()->upper())) + ->required(), Forms\Components\Textarea::make('description')->columnSpanFull(), - Forms\Components\TextInput::make('env_variable')->maxLength(191)->required(), + Forms\Components\TextInput::make('env_variable') + ->label('Environment Variable') + ->maxLength(191) + ->required(), Forms\Components\TextInput::make('default_value')->maxLength(191), Forms\Components\Textarea::make('rules')->rows(3)->columnSpanFull(), ]),