Change colums

Closes https://github.com/pelican-dev/panel/issues/3
This commit is contained in:
notCharles 2024-04-13 21:51:22 -04:00
parent 7c575205d3
commit 54eaf8ab0f
31 changed files with 133 additions and 121 deletions

View File

@ -58,9 +58,9 @@ class MakeNodeCommand extends Command
$data['disk'] = $this->option('maxDisk') ?? $this->ask('Enter the maximum amount of disk space'); $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['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['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['daemon_listen'] = $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['daemon_sftp'] = $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_base'] = $this->option('daemonBase') ?? $this->ask('Enter the base folder', '/var/lib/panel/volumes');
$node = $this->creationService->handle($data); $node = $this->creationService->handle($data);
$this->line('Successfully created a new node with the name ' . $data['name'] . ' and has an id of ' . $node->id . '.'); $this->line('Successfully created a new node with the name ' . $data['name'] . ' and has an id of ' . $node->id . '.');

View File

@ -117,7 +117,7 @@ class NodeViewController extends Controller
{ {
$this->plainInject([ $this->plainInject([
'node' => Collection::wrap($node->makeVisible(['daemon_token_id', 'daemon_token'])) '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', [ return view('admin.nodes.view.servers', [

View File

@ -68,7 +68,7 @@ class ServerTransferController extends Controller
// Check if the node is viable for the transfer. // Check if the node is viable for the transfer.
$node = Node::query() $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') ->selectRaw('IFNULL(SUM(servers.memory), 0) as sum_memory, IFNULL(SUM(servers.disk), 0) as sum_disk')
->leftJoin('servers', 'servers.node_id', '=', 'nodes.id') ->leftJoin('servers', 'servers.node_id', '=', 'nodes.id')
->where('nodes.id', $node_id) ->where('nodes.id', $node_id)

View File

@ -33,7 +33,7 @@ class ServerController extends ApplicationApiController
public function index(GetServersRequest $request): array public function index(GetServersRequest $request): array
{ {
$servers = QueryBuilder::for(Server::query()) $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']) ->allowedSorts(['id', 'uuid'])
->paginate($request->query('per_page') ?? 50); ->paginate($request->query('per_page') ?? 50);

View File

@ -89,7 +89,7 @@ class SftpAuthenticationController extends Controller
protected function getServer(Request $request, string $uuid): Server protected function getServer(Request $request, string $uuid): Server
{ {
return Server::query() 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) ->where('node_id', $request->attributes->get('node')->id)
->firstOr(function () use ($request) { ->firstOr(function () use ($request) {
$this->reject($request); $this->reject($request);

View File

@ -29,11 +29,11 @@ class StoreNodeRequest extends ApplicationApiRequest
'disk', 'disk',
'disk_overallocate', 'disk_overallocate',
'upload_size', 'upload_size',
'daemonListen', 'daemon_listen',
'daemonSFTP', 'daemon_sftp',
'daemonBase', 'daemon_base',
])->mapWithKeys(function ($value, $key) { ])->mapWithKeys(function ($value, $key) {
$key = ($key === 'daemonSFTP') ? 'daemonSftp' : $key; $key = ($key === 'daemon_sftp') ? 'daemon_sftp' : $key;
return [snake_case($key) => $value]; return [snake_case($key) => $value];
})->toArray(); })->toArray();
@ -58,9 +58,9 @@ class StoreNodeRequest extends ApplicationApiRequest
public function validated($key = null, $default = null): array public function validated($key = null, $default = null): array
{ {
$response = parent::validated(); $response = parent::validated();
$response['daemonListen'] = $response['daemon_listen']; $response['daemon_listen'] = $response['daemon_listen'];
$response['daemonSFTP'] = $response['daemon_sftp']; $response['daemon_sftp'] = $response['daemon_sftp'];
$response['daemonBase'] = $response['daemon_base'] ?? (new Node())->getAttribute('daemonBase'); $response['daemon_base'] = $response['daemon_base'] ?? (new Node())->getAttribute('daemon_base');
unset($response['daemon_base'], $response['daemon_listen'], $response['daemon_sftp']); unset($response['daemon_base'], $response['daemon_listen'], $response['daemon_sftp']);

View File

@ -24,7 +24,7 @@ class AdminServerFilter implements Filter
->where(function (Builder $builder) use ($value) { ->where(function (Builder $builder) use ($value) {
$builder->where('servers.uuid', $value) $builder->where('servers.uuid', $value)
->orWhere('servers.uuid', 'LIKE', "$value%") ->orWhere('servers.uuid', 'LIKE', "$value%")
->orWhere('servers.uuidShort', $value) ->orWhere('servers.uuid_short', $value)
->orWhere('servers.external_id', $value) ->orWhere('servers.external_id', $value)
->orWhereRaw('LOWER(users.username) LIKE ?', ["%$value%"]) ->orWhereRaw('LOWER(users.username) LIKE ?', ["%$value%"])
->orWhereRaw('LOWER(users.email) LIKE ?', ["$value%"]) ->orWhereRaw('LOWER(users.email) LIKE ?', ["$value%"])

View File

@ -61,7 +61,7 @@ class MultiFieldServerFilter implements Filter
->where(function (Builder $builder) use ($value) { ->where(function (Builder $builder) use ($value) {
$builder->where('servers.uuid', $value) $builder->where('servers.uuid', $value)
->orWhere('servers.uuid', 'LIKE', "$value%") ->orWhere('servers.uuid', 'LIKE', "$value%")
->orWhere('servers.uuidShort', $value) ->orWhere('servers.uuid_short', $value)
->orWhere('servers.external_id', $value) ->orWhere('servers.external_id', $value)
->orWhereRaw('LOWER(servers.name) LIKE ?', ["%$value%"]); ->orWhereRaw('LOWER(servers.name) LIKE ?', ["%$value%"]);
}); });

View File

@ -25,9 +25,9 @@ use Illuminate\Database\Eloquent\Relations\HasManyThrough;
* @property int $upload_size * @property int $upload_size
* @property string $daemon_token_id * @property string $daemon_token_id
* @property string $daemon_token * @property string $daemon_token
* @property int $daemonListen * @property int $daemon_listen
* @property int $daemonSFTP * @property int $daemon_sftp
* @property string $daemonBase * @property string $daemon_base
* @property \Carbon\Carbon $created_at * @property \Carbon\Carbon $created_at
* @property \Carbon\Carbon $updated_at * @property \Carbon\Carbon $updated_at
* @property \App\Models\Mount[]|\Illuminate\Database\Eloquent\Collection $mounts * @property \App\Models\Mount[]|\Illuminate\Database\Eloquent\Collection $mounts
@ -67,8 +67,8 @@ class Node extends Model
'public', 'name', 'public', 'name',
'fqdn', 'scheme', 'behind_proxy', 'fqdn', 'scheme', 'behind_proxy',
'memory', 'memory_overallocate', 'disk', 'memory', 'memory_overallocate', 'disk',
'disk_overallocate', 'upload_size', 'daemonBase', 'disk_overallocate', 'upload_size', 'daemon_base',
'daemonSFTP', 'daemonListen', 'daemon_sftp', 'daemon_listen',
'description', 'maintenance_mode', 'description', 'maintenance_mode',
]; ];
@ -83,9 +83,9 @@ class Node extends Model
'memory_overallocate' => 'required|numeric|min:-1', 'memory_overallocate' => 'required|numeric|min:-1',
'disk' => 'required|numeric|min:1', 'disk' => 'required|numeric|min:1',
'disk_overallocate' => 'required|numeric|min:-1', 'disk_overallocate' => 'required|numeric|min:-1',
'daemonBase' => 'sometimes|required|regex:/^([\/][\d\w.\-\/]+)$/', 'daemon_base' => 'sometimes|required|regex:/^([\/][\d\w.\-\/]+)$/',
'daemonSFTP' => 'required|numeric|between:1,65535', 'daemon_sftp' => 'required|numeric|between:1,65535',
'daemonListen' => 'required|numeric|between:1,65535', 'daemon_listen' => 'required|numeric|between:1,65535',
'maintenance_mode' => 'boolean', 'maintenance_mode' => 'boolean',
'upload_size' => 'int|between:1,1024', 'upload_size' => 'int|between:1,1024',
]; ];
@ -98,9 +98,9 @@ class Node extends Model
'behind_proxy' => false, 'behind_proxy' => false,
'memory_overallocate' => 0, 'memory_overallocate' => 0,
'disk_overallocate' => 0, 'disk_overallocate' => 0,
'daemonBase' => '/var/lib/panel/volumes', 'daemon_base' => '/var/lib/panel/volumes',
'daemonSFTP' => 2022, 'daemon_sftp' => 2022,
'daemonListen' => 8080, 'daemon_listen' => 8080,
'maintenance_mode' => false, 'maintenance_mode' => false,
]; ];
@ -109,8 +109,8 @@ class Node extends Model
return [ return [
'memory' => 'integer', 'memory' => 'integer',
'disk' => 'integer', 'disk' => 'integer',
'daemonListen' => 'integer', 'daemon_listen' => 'integer',
'daemonSFTP' => 'integer', 'daemon_sftp' => 'integer',
'behind_proxy' => 'boolean', 'behind_proxy' => 'boolean',
'public' => 'boolean', 'public' => 'boolean',
'maintenance_mode' => 'boolean', 'maintenance_mode' => 'boolean',
@ -122,7 +122,7 @@ class Node extends Model
*/ */
public function getConnectionAddress(): string 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), 'token' => decrypt($this->daemon_token),
'api' => [ 'api' => [
'host' => '0.0.0.0', 'host' => '0.0.0.0',
'port' => $this->daemonListen, 'port' => $this->daemon_listen,
'ssl' => [ 'ssl' => [
'enabled' => (!$this->behind_proxy && $this->scheme === 'https'), 'enabled' => (!$this->behind_proxy && $this->scheme === 'https'),
'cert' => '/etc/letsencrypt/live/' . Str::lower($this->fqdn) . '/fullchain.pem', 'cert' => '/etc/letsencrypt/live/' . Str::lower($this->fqdn) . '/fullchain.pem',
@ -146,9 +146,9 @@ class Node extends Model
'upload_limit' => $this->upload_size, 'upload_limit' => $this->upload_size,
], ],
'system' => [ 'system' => [
'data' => $this->daemonBase, 'data' => $this->daemon_base,
'sftp' => [ 'sftp' => [
'bind_port' => $this->daemonSFTP, 'bind_port' => $this->daemon_sftp,
], ],
], ],
'allowed_mounts' => $this->mounts->pluck('source')->toArray(), 'allowed_mounts' => $this->mounts->pluck('source')->toArray(),

View File

@ -21,7 +21,7 @@ use App\Exceptions\Http\Server\ServerStateConflictException;
* @property int $id * @property int $id
* @property string|null $external_id * @property string|null $external_id
* @property string $uuid * @property string $uuid
* @property string $uuidShort * @property string $uuid_short
* @property int $node_id * @property int $node_id
* @property string $name * @property string $name
* @property string $description * @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 whereThreads($value)
* @method static \Illuminate\Database\Eloquent\Builder|Server whereUpdatedAt($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 whereUuid($value)
* @method static \Illuminate\Database\Eloquent\Builder|Server whereUuidShort($value) * @method static \Illuminate\Database\Eloquent\Builder|Server whereuuid_short($value)
* *
* @mixin \Eloquent * @mixin \Eloquent
*/ */
@ -323,7 +323,7 @@ class Server extends Model
public function resolveRouteBinding($value, $field = null): ?self public function resolveRouteBinding($value, $field = null): ?self
{ {
return match ($field) { 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(), default => $this->where('id', $value)->firstOrFail(),
}; };
} }

View File

@ -38,6 +38,6 @@ class AddedToServer extends Notification implements ShouldQueue
->greeting('Hello ' . $this->server->user . '!') ->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('You have been added as a subuser for the following server, allowing you certain control over the server.')
->line('Server Name: ' . $this->server->name) ->line('Server Name: ' . $this->server->name)
->action('Visit Server', url('/server/' . $this->server->uuidShort)); ->action('Visit Server', url('/server/' . $this->server->uuid_short));
} }
} }

View File

@ -27,7 +27,7 @@ class SubuserObserver
$subuser->user->notify(new AddedToServer([ $subuser->user->notify(new AddedToServer([
'user' => $subuser->user->name_first, 'user' => $subuser->user->name_first,
'name' => $subuser->server->name, 'name' => $subuser->server->name,
'uuidShort' => $subuser->server->uuidShort, 'uuid_short' => $subuser->server->uuid_short,
])); ]));
} }

View File

@ -128,7 +128,7 @@ class ServerCreationService
return Server::create([ return Server::create([
'external_id' => Arr::get($data, 'external_id'), 'external_id' => Arr::get($data, 'external_id'),
'uuid' => $uuid, 'uuid' => $uuid,
'uuidShort' => substr($uuid, 0, 8), 'uuid_short' => substr($uuid, 0, 8),
'node_id' => Arr::get($data, 'node_id'), 'node_id' => Arr::get($data, 'node_id'),
'name' => Arr::get($data, 'name'), 'name' => Arr::get($data, 'name'),
'description' => Arr::get($data, 'description') ?? '', 'description' => Arr::get($data, 'description') ?? '',
@ -193,7 +193,7 @@ class ServerCreationService
$uuid = Uuid::uuid4()->toString(); $uuid = Uuid::uuid4()->toString();
$shortUuid = str($uuid)->substr(0, 8); $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(); return $this->generateUniqueUuidCombo();
} }

View File

@ -31,7 +31,7 @@ class NodeTransformer extends BaseTransformer
$response = collect($node->toArray())->mapWithKeys(function ($value, $key) { $response = collect($node->toArray())->mapWithKeys(function ($value, $key) {
// I messed up early in 2016 when I named this column as poorly // I messed up early in 2016 when I named this column as poorly
// as I did. This is the tragic result of my mistakes. // 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]; return [snake_case($key) => $value];
})->toArray(); })->toArray();

View File

@ -52,7 +52,7 @@ class ServerTransformer extends BaseTransformer
'id' => $server->getKey(), 'id' => $server->getKey(),
'external_id' => $server->external_id, 'external_id' => $server->external_id,
'uuid' => $server->uuid, 'uuid' => $server->uuid,
'identifier' => $server->uuidShort, 'identifier' => $server->uuid_short,
'name' => $server->name, 'name' => $server->name,
'description' => $server->description, 'description' => $server->description,
'status' => $server->status, 'status' => $server->status,

View File

@ -38,7 +38,7 @@ class ServerTransformer extends BaseClientTransformer
return [ return [
'server_owner' => $user->id === $server->owner_id, 'server_owner' => $user->id === $server->owner_id,
'identifier' => $server->uuidShort, 'identifier' => $server->uuid_short,
'internal_id' => $server->id, 'internal_id' => $server->id,
'uuid' => $server->uuid, 'uuid' => $server->uuid,
'name' => $server->name, 'name' => $server->name,
@ -46,7 +46,7 @@ class ServerTransformer extends BaseClientTransformer
'is_node_under_maintenance' => $server->node->isUnderMaintenance(), 'is_node_under_maintenance' => $server->node->isUnderMaintenance(),
'sftp_details' => [ 'sftp_details' => [
'ip' => $server->node->fqdn, 'ip' => $server->node->fqdn,
'port' => $server->node->daemonSFTP, 'port' => $server->node->daemon_sftp,
], ],
'description' => $server->description, 'description' => $server->description,
'limits' => [ 'limits' => [

View File

@ -36,9 +36,9 @@ class NodeFactory extends Factory
'upload_size' => 100, 'upload_size' => 100,
'daemon_token_id' => Str::random(Node::DAEMON_TOKEN_ID_LENGTH), 'daemon_token_id' => Str::random(Node::DAEMON_TOKEN_ID_LENGTH),
'daemon_token' => Crypt::encrypt(Str::random(Node::DAEMON_TOKEN_LENGTH)), 'daemon_token' => Crypt::encrypt(Str::random(Node::DAEMON_TOKEN_LENGTH)),
'daemonListen' => 8080, 'daemon_listen' => 8080,
'daemonSFTP' => 2022, 'daemon_sftp' => 2022,
'daemonBase' => '/var/lib/panel/volumes', 'daemon_base' => '/var/lib/panel/volumes',
]; ];
} }
} }

View File

@ -24,7 +24,7 @@ class ServerFactory extends Factory
{ {
return [ return [
'uuid' => Uuid::uuid4()->toString(), 'uuid' => Uuid::uuid4()->toString(),
'uuidShort' => Str::lower(Str::random(8)), 'uuid_short' => Str::lower(Str::random(8)),
'name' => $this->faker->firstName(), 'name' => $this->faker->firstName(),
'description' => implode(' ', $this->faker->sentences()), 'description' => implode(' ', $this->faker->sentences()),
'skip_scripts' => 0, 'skip_scripts' => 0,

View File

@ -1,28 +0,0 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
return new class() extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('api_keys', function (Blueprint $table) {
$table->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');
});
}
};

View File

@ -0,0 +1,40 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('nodes', function (Blueprint $table) {
$table->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');
});
}
};

View File

@ -133,10 +133,10 @@
"clean": "cd public/assets && find . \\( -name \"*.js\" -o -name \"*.map\" \\) -type f -delete", "clean": "cd public/assets && find . \\( -name \"*.js\" -o -name \"*.map\" \\) -type f -delete",
"test": "jest", "test": "jest",
"lint": "eslint ./resources/scripts/**/*.{ts,tsx} --ext .ts,.tsx", "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": "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", "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": [ "browserslist": [
"> 0.5%", "> 0.5%",

View File

@ -49,7 +49,7 @@
</tr> </tr>
@foreach ($nodes as $node) @foreach ($nodes as $node)
<tr> <tr>
<td class="text-center text-muted left-icon" data-action="ping" data-secret="{{ $node->getDecryptedKey() }}" data-location="{{ $node->scheme }}://{{ $node->fqdn }}:{{ $node->daemonListen }}/api/system"><i class="fa fa-fw fa-refresh fa-spin"></i></td> <td class="text-center text-muted left-icon" data-action="ping" data-secret="{{ $node->getDecryptedKey() }}" data-location="{{ $node->scheme }}://{{ $node->fqdn }}:{{ $node->daemon_listen }}/api/system"><i class="fa fa-fw fa-refresh fa-spin"></i></td>
<td>{!! $node->maintenance_mode ? '<span class="label label-warning"><i class="fa fa-wrench"></i></span> ' : '' !!}<a href="{{ route('admin.nodes.view', $node->id) }}">{{ $node->name }}</a></td> <td>{!! $node->maintenance_mode ? '<span class="label label-warning"><i class="fa fa-wrench"></i></span> ' : '' !!}<a href="{{ route('admin.nodes.view', $node->id) }}">{{ $node->name }}</a></td>
<td>{{ $node->memory }} MiB</td> <td>{{ $node->memory }} MiB</td>
<td>{{ $node->disk }} MiB</td> <td>{{ $node->disk }} MiB</td>

View File

@ -94,8 +94,8 @@
<div class="box-body"> <div class="box-body">
<div class="row"> <div class="row">
<div class="form-group col-md-6"> <div class="form-group col-md-6">
<label for="pDaemonBase" class="form-label">Daemon Server File Directory</label> <label for="pdaemon_base" class="form-label">Daemon Server File Directory</label>
<input type="text" name="daemonBase" id="pDaemonBase" class="form-control" value="/var/lib/panel/volumes" /> <input type="text" name="daemon_base" id="pdaemon_base" class="form-control" value="/var/lib/panel/volumes" />
<p class="text-muted small">Enter the directory where server files should be stored. <strong>If you use OVH you should check your partition scheme. You may need to use <code>/home/daemon-data</code> to have enough space.</strong></p> <p class="text-muted small">Enter the directory where server files should be stored. <strong>If you use OVH you should check your partition scheme. You may need to use <code>/home/daemon-data</code> to have enough space.</strong></p>
</div> </div>
<div class="form-group col-md-6"> <div class="form-group col-md-6">
@ -137,12 +137,12 @@
</div> </div>
<div class="row"> <div class="row">
<div class="form-group col-md-6"> <div class="form-group col-md-6">
<label for="pDaemonListen" class="form-label">Daemon Port</label> <label for="pdaemon_listen" class="form-label">Daemon Port</label>
<input type="text" name="daemonListen" class="form-control" id="pDaemonListen" value="8080" /> <input type="text" name="daemon_listen" class="form-control" id="pdaemon_listen" value="8080" />
</div> </div>
<div class="form-group col-md-6"> <div class="form-group col-md-6">
<label for="pDaemonSFTP" class="form-label">Daemon SFTP Port</label> <label for="pdaemon_sftp" class="form-label">Daemon SFTP Port</label>
<input type="text" name="daemonSFTP" class="form-control" id="pDaemonSFTP" value="2022" /> <input type="text" name="daemon_sftp" class="form-control" id="pdaemon_sftp" value="2022" />
</div> </div>
<div class="col-md-12"> <div class="col-md-12">
<p class="text-muted small">The daemon runs its own SFTP management container and does not use the SSHd process on the main physical server. <Strong>Do not use the same port that you have assigned for your physical server's SSH process.</strong> If you will be running the daemon behind CloudFlare&reg; you should set the daemon port to <code>8443</code> to allow websocket proxying over SSL.</p> <p class="text-muted small">The daemon runs its own SFTP management container and does not use the SSHd process on the main physical server. <Strong>Do not use the same port that you have assigned for your physical server's SSH process.</strong> If you will be running the daemon behind CloudFlare&reg; you should set the daemon port to <code>8443</code> to allow websocket proxying over SSL.</p>

View File

@ -44,7 +44,7 @@
</tr> </tr>
@foreach($servers as $server) @foreach($servers as $server)
<tr data-server="{{ $server->uuid }}"> <tr data-server="{{ $server->uuid }}">
<td><code>{{ $server->uuidShort }}</code></td> <td><code>{{ $server->uuid_short }}</code></td>
<td><a href="{{ route('admin.servers.view', $server->id) }}">{{ $server->name }}</a></td> <td><a href="{{ route('admin.servers.view', $server->id) }}">{{ $server->name }}</a></td>
<td><a href="{{ route('admin.users.view', $server->owner_id) }}">{{ $server->user->username }}</a></td> <td><a href="{{ route('admin.users.view', $server->owner_id) }}">{{ $server->user->username }}</a></td>
<td><a href="{{ route('admin.eggs.view', $server->egg) }}">{{ $server->egg->name }}</a></td> <td><a href="{{ route('admin.eggs.view', $server->egg) }}">{{ $server->egg->name }}</a></td>

View File

@ -174,15 +174,15 @@
<div class="col-xs-12"> <div class="col-xs-12">
<div class="row"> <div class="row">
<div class="form-group col-md-6"> <div class="form-group col-md-6">
<label for="daemonListen" class="control-label"><span class="label label-warning"><i class="fa fa-power-off"></i></span> Daemon Port</label> <label for="daemon_listen" class="control-label"><span class="label label-warning"><i class="fa fa-power-off"></i></span> Daemon Port</label>
<div> <div>
<input type="text" name="daemonListen" class="form-control" value="{{ old('daemonListen', $node->daemonListen) }}"/> <input type="text" name="daemon_listen" class="form-control" value="{{ old('daemon_listen', $node->daemon_listen) }}"/>
</div> </div>
</div> </div>
<div class="form-group col-md-6"> <div class="form-group col-md-6">
<label for="daemonSFTP" class="control-label"><span class="label label-warning"><i class="fa fa-power-off"></i></span> Daemon SFTP Port</label> <label for="daemon_sftp" class="control-label"><span class="label label-warning"><i class="fa fa-power-off"></i></span> Daemon SFTP Port</label>
<div> <div>
<input type="text" name="daemonSFTP" class="form-control" value="{{ old('daemonSFTP', $node->daemonSFTP) }}"/> <input type="text" name="daemon_sftp" class="form-control" value="{{ old('daemon_sftp', $node->daemon_sftp) }}"/>
</div> </div>
</div> </div>
</div> </div>

View File

@ -43,7 +43,7 @@
<th></th> <th></th>
</tr> </tr>
@foreach ($servers as $server) @foreach ($servers as $server)
<tr data-server="{{ $server->uuidShort }}"> <tr data-server="{{ $server->uuid_short }}">
<td><a href="{{ route('admin.servers.view', $server->id) }}">{{ $server->name }}</a></td> <td><a href="{{ route('admin.servers.view', $server->id) }}">{{ $server->name }}</a></td>
<td><code title="{{ $server->uuid }}">{{ $server->uuid }}</code></td> <td><code title="{{ $server->uuid }}">{{ $server->uuid }}</code></td>
<td><a href="{{ route('admin.users.view', $server->user->id) }}">{{ $server->user->username }}</a></td> <td><a href="{{ route('admin.users.view', $server->user->id) }}">{{ $server->user->username }}</a></td>
@ -61,7 +61,7 @@
@endif @endif
</td> </td>
<td class="text-center"> <td class="text-center">
<a class="btn btn-xs btn-default" href="/server/{{ $server->uuidShort }}"><i class="fa fa-wrench"></i></a> <a class="btn btn-xs btn-default" href="/server/{{ $server->uuid_short }}"><i class="fa fa-wrench"></i></a>
</td> </td>
</tr> </tr>
@endforeach @endforeach

View File

@ -32,7 +32,7 @@
<a href="{{ route('admin.servers.view.delete', $server->id) }}">Delete</a> <a href="{{ route('admin.servers.view.delete', $server->id) }}">Delete</a>
</li> </li>
<li class="tab-success"> <li class="tab-success">
<a href="/server/{{ $server->uuidShort }}" target="_blank"><i class="fa fa-external-link"></i></a> <a href="/server/{{ $server->uuid_short }}" target="_blank"><i class="fa fa-external-link"></i></a>
</li> </li>
</ul> </ul>
</div> </div>

View File

@ -19,7 +19,7 @@
<div class="row"> <div class="row">
<div class="col-sm-7"> <div class="col-sm-7">
<div class="alert alert-info"> <div class="alert alert-info">
Database passwords can be viewed when <a href="/server/{{ $server->uuidShort }}/databases">visiting this server</a> on the front-end. Database passwords can be viewed when <a href="/server/{{ $server->uuid_short }}/databases">visiting this server</a> on the front-end.
</div> </div>
<div class="box box-primary"> <div class="box box-primary">
<div class="box-header with-border"> <div class="box-header with-border">

View File

@ -33,7 +33,7 @@ class ClientControllerTest extends ClientApiIntegrationTestCase
$response->assertOk(); $response->assertOk();
$response->assertJsonPath('object', 'list'); $response->assertJsonPath('object', 'list');
$response->assertJsonPath('data.0.object', Server::RESOURCE_NAME); $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('data.0.attributes.server_owner', true);
$response->assertJsonPath('meta.pagination.total', 1); $response->assertJsonPath('meta.pagination.total', 1);
$response->assertJsonPath('meta.pagination.per_page', 50); $response->assertJsonPath('meta.pagination.per_page', 50);
@ -52,7 +52,7 @@ class ClientControllerTest extends ClientApiIntegrationTestCase
/** @var \App\Models\Server[] $servers */ /** @var \App\Models\Server[] $servers */
$servers = [ $servers = [
$this->createServerModel(['user_id' => $users[0]->id, 'name' => 'Julia']), $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-12356789', 'external_id' => 'ext123', 'name' => 'Julia']),
$this->createServerModel(['user_id' => $users[1]->id, 'uuid' => '88788878-abcdefgh', 'name' => 'Jennifer']), $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') $this->actingAs($users[1])->getJson('/api/client?filter[*]=Julia')
->assertOk() ->assertOk()
->assertJsonCount(1, 'data') ->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') $this->actingAs($users[1])->getJson('/api/client?filter[*]=ext123')
->assertOk() ->assertOk()
->assertJsonCount(1, 'data') ->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') $this->actingAs($users[1])->getJson('/api/client?filter[*]=ext123')
->assertOk() ->assertOk()
->assertJsonCount(1, 'data') ->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') $this->actingAs($users[1])->getJson('/api/client?filter[*]=12121212')
->assertOk() ->assertOk()
->assertJsonCount(1, 'data') ->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') $this->actingAs($users[1])->getJson('/api/client?filter[*]=88788878')
->assertOk() ->assertOk()
->assertJsonCount(2, 'data') ->assertJsonCount(2, 'data')
->assertJsonPath('data.0.attributes.identifier', $servers[2]->uuidShort) ->assertJsonPath('data.0.attributes.identifier', $servers[2]->uuid_short)
->assertJsonPath('data.1.attributes.identifier', $servers[3]->uuidShort); ->assertJsonPath('data.1.attributes.identifier', $servers[3]->uuid_short);
$this->actingAs($users[1])->getJson('/api/client?filter[*]=88788878-abcd') $this->actingAs($users[1])->getJson('/api/client?filter[*]=88788878-abcd')
->assertOk() ->assertOk()
->assertJsonCount(1, 'data') ->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') $this->actingAs($users[0])->getJson('/api/client?filter[*]=Julia&type=admin-all')
->assertOk() ->assertOk()
->assertJsonCount(2, 'data') ->assertJsonCount(2, 'data')
->assertJsonPath('data.0.attributes.identifier', $servers[0]->uuidShort) ->assertJsonPath('data.0.attributes.identifier', $servers[0]->uuid_short)
->assertJsonPath('data.1.attributes.identifier', $servers[2]->uuidShort); ->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') $this->actingAs($user)->getJson('/api/client?filter[*]=192.168.1.1')
->assertOk() ->assertOk()
->assertJsonCount(2, 'data') ->assertJsonCount(2, 'data')
->assertJsonPath('data.0.attributes.identifier', $server->uuidShort) ->assertJsonPath('data.0.attributes.identifier', $server->uuid_short)
->assertJsonPath('data.1.attributes.identifier', $server2->uuidShort); ->assertJsonPath('data.1.attributes.identifier', $server2->uuid_short);
$this->actingAs($user)->getJson('/api/client?filter[*]=192.168.1.1:25565') $this->actingAs($user)->getJson('/api/client?filter[*]=192.168.1.1:25565')
->assertOk() ->assertOk()
->assertJsonCount(1, 'data') ->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') $this->actingAs($user)->getJson('/api/client?filter[*]=:25570')
->assertOk() ->assertOk()
->assertJsonCount(1, 'data') ->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') $this->actingAs($user)->getJson('/api/client?filter[*]=:255')
->assertOk() ->assertOk()
->assertJsonCount(2, 'data') ->assertJsonCount(2, 'data')
->assertJsonPath('data.0.attributes.identifier', $server->uuidShort) ->assertJsonPath('data.0.attributes.identifier', $server->uuid_short)
->assertJsonPath('data.1.attributes.identifier', $server2->uuidShort); ->assertJsonPath('data.1.attributes.identifier', $server2->uuid_short);
} }
/** /**
@ -164,9 +164,9 @@ class ClientControllerTest extends ClientApiIntegrationTestCase
$response->assertOk(); $response->assertOk();
$response->assertJsonCount(2, 'data'); $response->assertJsonCount(2, 'data');
$response->assertJsonPath('data.0.attributes.server_owner', true); $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.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->assertOk();
$response->assertJsonCount(1, 'data'); $response->assertJsonCount(1, 'data');
$response->assertJsonPath('data.0.attributes.server_owner', true); $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->assertJsonCount(2, 'data');
$response->assertJsonPath('data.0.attributes.server_owner', false); $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.server_owner', false);
$response->assertJsonPath('data.1.attributes.identifier', $servers[3]->uuidShort); $response->assertJsonPath('data.1.attributes.identifier', $servers[3]->uuid_short);
} }
/** /**

View File

@ -141,7 +141,7 @@ class SftpAuthenticationControllerTest extends IntegrationTestCase
$this->setAuthorization($server->node); $this->setAuthorization($server->node);
$this->postJson('/api/remote/sftp/auth', [ $this->postJson('/api/remote/sftp/auth', [
'username' => $user->username . '.' . $server->uuidShort, 'username' => $user->username . '.' . $server->uuid_short,
'password' => 'foobar', 'password' => 'foobar',
]) ])
->assertForbidden() ->assertForbidden()
@ -171,7 +171,7 @@ class SftpAuthenticationControllerTest extends IntegrationTestCase
$this->setAuthorization($server->node); $this->setAuthorization($server->node);
$data = [ $data = [
'username' => $user->username . '.' . $server->uuidShort, 'username' => $user->username . '.' . $server->uuid_short,
'password' => 'foobar', 'password' => 'foobar',
]; ];
@ -186,7 +186,7 @@ class SftpAuthenticationControllerTest extends IntegrationTestCase
->assertJsonPath('permissions.0', '*'); ->assertJsonPath('permissions.0', '*');
$this->setAuthorization(); $this->setAuthorization();
$data['username'] = $user->username . '.' . $this->server->uuidShort; $data['username'] = $user->username . '.' . $this->server->uuid_short;
$this->post('/api/remote/sftp/auth', $data) $this->post('/api/remote/sftp/auth', $data)
->assertOk() ->assertOk()
@ -218,7 +218,7 @@ class SftpAuthenticationControllerTest extends IntegrationTestCase
*/ */
protected function getUsername(bool $long = false): string 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);
} }
/** /**

View File

@ -118,7 +118,7 @@ class ServerCreationServiceTest extends IntegrationTestCase
$this->assertInstanceOf(Server::class, $response); $this->assertInstanceOf(Server::class, $response);
$this->assertNotNull($response->uuid); $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->assertSame($egg->id, $response->egg_id);
$this->assertCount(2, $response->variables); $this->assertCount(2, $response->variables);
$this->assertSame('123', $response->variables[0]->server_value); $this->assertSame('123', $response->variables[0]->server_value);