From ae671e6b19083943f31aa55353c4c84b140d3c4b Mon Sep 17 00:00:00 2001 From: Dane Everitt Date: Mon, 2 Oct 2017 22:51:13 -0500 Subject: [PATCH] Begin updating UI --- .env.example | 4 +-- .../Environment/AppSettingsCommand.php | 9 ++--- .../Repository/ServiceRepositoryInterface.php | 15 ++++++-- .../Controllers/Admin/ServiceController.php | 29 ++++++++++----- app/Http/Requests/Admin/AdminFormRequest.php | 11 ++++-- .../Admin/Service/ServiceFormRequest.php | 14 ++------ app/Models/Service.php | 18 +++++----- app/Models/ServiceOption.php | 27 +++++++++++--- .../Eloquent/ServiceRepository.php | 36 +++++++++++++------ .../Options/InstallScriptUpdateService.php | 2 +- .../Options/OptionCreationService.php | 24 +++++++++++-- .../Options/OptionDeletionService.php | 5 +-- .../Services/Options/OptionUpdateService.php | 2 +- .../Services/ServiceCreationService.php | 11 +++--- .../Services/ServiceDeletionService.php | 2 +- .../Services/ServiceUpdateService.php | 2 +- .../admin/services/index.blade.php | 9 ++++- .../pterodactyl/admin/services/new.blade.php | 7 ---- .../admin/services/options/new.blade.php | 13 ++++--- .../admin/services/options/view.blade.php | 11 +++--- .../pterodactyl/admin/services/view.blade.php | 27 ++++++++------ .../pterodactyl/layouts/admin.blade.php | 6 ++++ 22 files changed, 182 insertions(+), 102 deletions(-) diff --git a/.env.example b/.env.example index 45644374d..4bcc8f12c 100644 --- a/.env.example +++ b/.env.example @@ -32,6 +32,4 @@ QUEUE_HIGH=high QUEUE_STANDARD=standard QUEUE_LOW=low -SQS_KEY=aws-public -SQS_SECRET=aws-secret -SQS_QUEUE_PREFIX=aws-queue-prefix +SERVICE_AUTHOR=undefined@unknown-author.com diff --git a/app/Console/Commands/Environment/AppSettingsCommand.php b/app/Console/Commands/Environment/AppSettingsCommand.php index d3e63af37..a7d602b5f 100644 --- a/app/Console/Commands/Environment/AppSettingsCommand.php +++ b/app/Console/Commands/Environment/AppSettingsCommand.php @@ -9,7 +9,6 @@ namespace Pterodactyl\Console\Commands\Environment; -use Ramsey\Uuid\Uuid; use Illuminate\Console\Command; use Illuminate\Contracts\Console\Kernel; use Pterodactyl\Traits\Commands\EnvironmentWriterTrait; @@ -38,6 +37,7 @@ class AppSettingsCommand extends Command * @var string */ protected $signature = 'p:environment:setup + {--author= : The email that services created on this instance should be linked to.} {--url= : The URL that this Panel is running on.} {--timezone= : The timezone to use for Panel times.} {--cache= : The cache driver backend to use.} @@ -72,9 +72,10 @@ class AppSettingsCommand extends Command */ public function handle() { - if (is_null($this->config->get('pterodactyl.service.author'))) { - $this->variables['SERVICE_AUTHOR'] = Uuid::uuid4()->toString(); - } + $this->output->comment(trans('command/messages.environment.app.author_help')); + $this->variables['SERVICE_AUTHOR'] = $this->option('author') ?? $this->ask( + trans('command/messages.environment.app.author'), $this->config->get('pterodactyl.service.author', 'undefined@unknown-author.com') + ); $this->output->comment(trans('command/messages.environment.app.app_url_help')); $this->variables['APP_URL'] = $this->option('url') ?? $this->ask( diff --git a/app/Contracts/Repository/ServiceRepositoryInterface.php b/app/Contracts/Repository/ServiceRepositoryInterface.php index 87919ae7a..7f710e624 100644 --- a/app/Contracts/Repository/ServiceRepositoryInterface.php +++ b/app/Contracts/Repository/ServiceRepositoryInterface.php @@ -9,6 +9,9 @@ namespace Pterodactyl\Contracts\Repository; +use Pterodactyl\Models\Service; +use Illuminate\Support\Collection; + interface ServiceRepositoryInterface extends RepositoryInterface { /** @@ -17,7 +20,15 @@ interface ServiceRepositoryInterface extends RepositoryInterface * @param int $id * @return \Illuminate\Support\Collection */ - public function getWithOptions($id = null); + public function getWithOptions(int $id = null): Collection; + + /** + * Return a service or all services and the count of options, packs, and servers for that service. + * + * @param int|null $id + * @return \Illuminate\Support\Collection + */ + public function getWithCounts(int $id = null): Collection; /** * Return a service along with its associated options and the servers relation on those options. @@ -25,5 +36,5 @@ interface ServiceRepositoryInterface extends RepositoryInterface * @param int $id * @return mixed */ - public function getWithOptionServers($id); + public function getWithOptionServers(int $id): Service; } diff --git a/app/Http/Controllers/Admin/ServiceController.php b/app/Http/Controllers/Admin/ServiceController.php index 35b5155f6..72332c7b3 100644 --- a/app/Http/Controllers/Admin/ServiceController.php +++ b/app/Http/Controllers/Admin/ServiceController.php @@ -9,7 +9,9 @@ namespace Pterodactyl\Http\Controllers\Admin; +use Illuminate\View\View; use Pterodactyl\Models\Service; +use Illuminate\Http\RedirectResponse; use Prologue\Alerts\AlertsMessageBag; use Pterodactyl\Http\Controllers\Controller; use Pterodactyl\Services\Services\ServiceUpdateService; @@ -46,6 +48,15 @@ class ServiceController extends Controller */ protected $updateService; + /** + * ServiceController constructor. + * + * @param \Prologue\Alerts\AlertsMessageBag $alert + * @param \Pterodactyl\Services\Services\ServiceCreationService $creationService + * @param \Pterodactyl\Services\Services\ServiceDeletionService $deletionService + * @param \Pterodactyl\Contracts\Repository\ServiceRepositoryInterface $repository + * @param \Pterodactyl\Services\Services\ServiceUpdateService $updateService + */ public function __construct( AlertsMessageBag $alert, ServiceCreationService $creationService, @@ -65,10 +76,10 @@ class ServiceController extends Controller * * @return \Illuminate\View\View */ - public function index() + public function index(): View { return view('admin.services.index', [ - 'services' => $this->repository->getWithOptions(), + 'services' => $this->repository->getWithCounts(), ]); } @@ -77,7 +88,7 @@ class ServiceController extends Controller * * @return \Illuminate\View\View */ - public function create() + public function create(): View { return view('admin.services.new'); } @@ -88,7 +99,7 @@ class ServiceController extends Controller * @param int $service * @return \Illuminate\View\View */ - public function view($service) + public function view(int $service): View { return view('admin.services.view', [ 'service' => $this->repository->getWithOptionServers($service), @@ -101,7 +112,7 @@ class ServiceController extends Controller * @param \Pterodactyl\Models\Service $service * @return \Illuminate\View\View */ - public function viewFunctions(Service $service) + public function viewFunctions(Service $service): View { return view('admin.services.functions', ['service' => $service]); } @@ -114,7 +125,7 @@ class ServiceController extends Controller * * @throws \Pterodactyl\Exceptions\Model\DataValidationException */ - public function store(ServiceFormRequest $request) + public function store(ServiceFormRequest $request): RedirectResponse { $service = $this->creationService->handle($request->normalize()); $this->alert->success(trans('admin/services.notices.service_created', ['name' => $service->name]))->flash(); @@ -132,7 +143,7 @@ class ServiceController extends Controller * @throws \Pterodactyl\Exceptions\Model\DataValidationException * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException */ - public function update(ServiceFormRequest $request, Service $service) + public function update(ServiceFormRequest $request, Service $service): RedirectResponse { $this->updateService->handle($service->id, $request->normalize()); $this->alert->success(trans('admin/services.notices.service_updated'))->flash(); @@ -150,7 +161,7 @@ class ServiceController extends Controller * @throws \Pterodactyl\Exceptions\Model\DataValidationException * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException */ - public function updateFunctions(ServiceFunctionsFormRequest $request, Service $service) + public function updateFunctions(ServiceFunctionsFormRequest $request, Service $service): RedirectResponse { $this->updateService->handle($service->id, $request->normalize()); $this->alert->success(trans('admin/services.notices.functions_updated'))->flash(); @@ -166,7 +177,7 @@ class ServiceController extends Controller * * @throws \Pterodactyl\Exceptions\Service\HasActiveServersException */ - public function destroy(Service $service) + public function destroy(Service $service): RedirectResponse { $this->deletionService->handle($service->id); $this->alert->success(trans('admin/services.notices.service_deleted'))->flash(); diff --git a/app/Http/Requests/Admin/AdminFormRequest.php b/app/Http/Requests/Admin/AdminFormRequest.php index 365f40d2b..7d5859981 100644 --- a/app/Http/Requests/Admin/AdminFormRequest.php +++ b/app/Http/Requests/Admin/AdminFormRequest.php @@ -13,7 +13,12 @@ use Illuminate\Foundation\Http\FormRequest; abstract class AdminFormRequest extends FormRequest { - abstract public function rules(); + /** + * The rules to apply to the incoming form request. + * + * @return array + */ + abstract public function rules(): array; /** * Determine if the user is an admin and has permission to access this @@ -21,7 +26,7 @@ abstract class AdminFormRequest extends FormRequest * * @return bool */ - public function authorize() + public function authorize(): bool { if (is_null($this->user())) { return false; @@ -37,7 +42,7 @@ abstract class AdminFormRequest extends FormRequest * @param array $only * @return array */ - public function normalize($only = []) + public function normalize($only = []): array { return array_merge( $this->only($only), diff --git a/app/Http/Requests/Admin/Service/ServiceFormRequest.php b/app/Http/Requests/Admin/Service/ServiceFormRequest.php index c5af2b697..672f2d2f9 100644 --- a/app/Http/Requests/Admin/Service/ServiceFormRequest.php +++ b/app/Http/Requests/Admin/Service/ServiceFormRequest.php @@ -16,22 +16,12 @@ class ServiceFormRequest extends AdminFormRequest /** * @return array */ - public function rules() + public function rules(): array { - $rules = [ + return [ 'name' => 'required|string|min:1|max:255', 'description' => 'required|nullable|string', - 'folder' => 'required|regex:/^[\w.-]{1,50}$/|unique:services,folder', 'startup' => 'required|nullable|string', ]; - - if ($this->method() === 'PATCH') { - $service = $this->route()->parameter('service'); - $rules['folder'] = $rules['folder'] . ',' . $service->id; - - return $rules; - } - - return $rules; } } diff --git a/app/Models/Service.php b/app/Models/Service.php index e81a9ba90..0a17f7e42 100644 --- a/app/Models/Service.php +++ b/app/Models/Service.php @@ -31,7 +31,12 @@ class Service extends Model implements CleansAttributes, ValidableContract * * @var array */ - protected $fillable = ['name', 'author', 'description', 'folder', 'startup', 'index_file']; + protected $fillable = [ + 'name', + 'description', + 'startup', + 'index_file', + ]; /** * @var array @@ -40,7 +45,6 @@ class Service extends Model implements CleansAttributes, ValidableContract 'author' => 'required', 'name' => 'required', 'description' => 'sometimes', - 'folder' => 'required', 'startup' => 'sometimes', 'index_file' => 'required', ]; @@ -49,10 +53,9 @@ class Service extends Model implements CleansAttributes, ValidableContract * @var array */ protected static $dataIntegrityRules = [ - 'author' => 'string|size:36', + 'author' => 'email', 'name' => 'string|max:255', 'description' => 'nullable|string', - 'folder' => 'string|max:255|regex:/^[\w.-]{1,50}$/|unique:services,folder', 'startup' => 'nullable|string', 'index_file' => 'string', ]; @@ -74,12 +77,7 @@ class Service extends Model implements CleansAttributes, ValidableContract */ public function packs() { - return $this->hasManyThrough( - Pack::class, - ServiceOption::class, - 'service_id', - 'option_id' - ); + return $this->hasManyThrough(Pack::class, ServiceOption::class, 'service_id', 'option_id'); } /** diff --git a/app/Models/ServiceOption.php b/app/Models/ServiceOption.php index d59ca8f61..db5ec4c1f 100644 --- a/app/Models/ServiceOption.php +++ b/app/Models/ServiceOption.php @@ -31,7 +31,22 @@ class ServiceOption extends Model implements CleansAttributes, ValidableContract * * @var array */ - protected $guarded = ['id', 'created_at', 'updated_at']; + protected $fillable = [ + 'name', + 'description', + 'docker_image', + 'config_files', + 'config_startup', + 'config_logs', + 'config_stop', + 'config_from', + 'startup', + 'script_is_privileged', + 'script_install', + 'script_entry', + 'script_container', + 'copy_script_from', + ]; /** * Cast values to correct type. @@ -40,7 +55,9 @@ class ServiceOption extends Model implements CleansAttributes, ValidableContract */ protected $casts = [ 'service_id' => 'integer', + 'config_from' => 'integer', 'script_is_privileged' => 'boolean', + 'copy_script_from' => 'integer', ]; /** @@ -48,6 +65,7 @@ class ServiceOption extends Model implements CleansAttributes, ValidableContract */ protected static $applicationRules = [ 'service_id' => 'required', + 'author' => 'required', 'name' => 'required', 'description' => 'required', 'tag' => 'required', @@ -64,13 +82,14 @@ class ServiceOption extends Model implements CleansAttributes, ValidableContract * @var array */ protected static $dataIntegrityRules = [ - 'service_id' => 'numeric|exists:services,id', + 'service_id' => 'bail|numeric|exists:services,id', + 'author' => 'email', 'name' => 'string|max:255', 'description' => 'string', - 'tag' => 'alpha_num|max:60|unique:service_options,tag', + 'tag' => 'bail|alpha_num|max:60|unique:service_options,tag', 'docker_image' => 'string|max:255', 'startup' => 'nullable|string', - 'config_from' => 'nullable|numeric|exists:service_options,id', + 'config_from' => 'bail|nullable|numeric|exists:service_options,id', 'config_stop' => 'nullable|string|max:255', 'config_startup' => 'nullable|json', 'config_logs' => 'nullable|json', diff --git a/app/Repositories/Eloquent/ServiceRepository.php b/app/Repositories/Eloquent/ServiceRepository.php index affe52de4..95d9224e5 100644 --- a/app/Repositories/Eloquent/ServiceRepository.php +++ b/app/Repositories/Eloquent/ServiceRepository.php @@ -9,8 +9,8 @@ namespace Pterodactyl\Repositories\Eloquent; -use Webmozart\Assert\Assert; use Pterodactyl\Models\Service; +use Illuminate\Support\Collection; use Pterodactyl\Exceptions\Repository\RecordNotFoundException; use Pterodactyl\Contracts\Repository\ServiceRepositoryInterface; @@ -27,16 +27,14 @@ class ServiceRepository extends EloquentRepository implements ServiceRepositoryI /** * {@inheritdoc} */ - public function getWithOptions($id = null) + public function getWithOptions(int $id = null): Collection { - Assert::nullOrNumeric($id, 'First argument passed to getWithOptions must be null or numeric, received %s.'); - $instance = $this->getBuilder()->with('options.packs', 'options.variables'); if (! is_null($id)) { $instance = $instance->find($id, $this->getColumns()); if (! $instance) { - throw new RecordNotFoundException(); + throw new RecordNotFoundException; } return $instance; @@ -48,15 +46,33 @@ class ServiceRepository extends EloquentRepository implements ServiceRepositoryI /** * {@inheritdoc} */ - public function getWithOptionServers($id) + public function getWithCounts(int $id = null): Collection { - Assert::numeric($id, 'First argument passed to getWithOptionServers must be numeric, received %s.'); + $instance = $this->getBuilder()->withCount(['options', 'packs', 'servers']); - $instance = $this->getBuilder()->with('options.servers')->find($id, $this->getColumns()); - if (! $instance) { - throw new RecordNotFoundException(); + if (! is_null($id)) { + $instance = $instance->find($id, $this->getColumns()); + if (! $instance) { + throw new RecordNotFoundException; + } + + return $instance; } + return $instance->get($this->getColumns()); + } + + /** + * {@inheritdoc} + */ + public function getWithOptionServers(int $id): Service + { + $instance = $this->getBuilder()->with('options.servers')->find($id, $this->getColumns()); + if (! $instance) { + throw new RecordNotFoundException; + } + + /* @var Service $instance */ return $instance; } } diff --git a/app/Services/Services/Options/InstallScriptUpdateService.php b/app/Services/Services/Options/InstallScriptUpdateService.php index 7b302190e..abb7cfca1 100644 --- a/app/Services/Services/Options/InstallScriptUpdateService.php +++ b/app/Services/Services/Options/InstallScriptUpdateService.php @@ -40,7 +40,7 @@ class InstallScriptUpdateService * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException * @throws \Pterodactyl\Exceptions\Service\ServiceOption\InvalidCopyFromException */ - public function handle($option, array $data) + public function handle($option, array $data): void { if (! $option instanceof ServiceOption) { $option = $this->repository->find($option); diff --git a/app/Services/Services/Options/OptionCreationService.php b/app/Services/Services/Options/OptionCreationService.php index d15a813e4..8149a5596 100644 --- a/app/Services/Services/Options/OptionCreationService.php +++ b/app/Services/Services/Options/OptionCreationService.php @@ -9,11 +9,19 @@ namespace Pterodactyl\Services\Services\Options; +use Ramsey\Uuid\Uuid; +use Pterodactyl\Models\ServiceOption; +use Illuminate\Contracts\Config\Repository as ConfigRepository; use Pterodactyl\Contracts\Repository\ServiceOptionRepositoryInterface; use Pterodactyl\Exceptions\Service\ServiceOption\NoParentConfigurationFoundException; class OptionCreationService { + /** + * @var \Illuminate\Contracts\Config\Repository + */ + protected $config; + /** * @var \Pterodactyl\Contracts\Repository\ServiceOptionRepositoryInterface */ @@ -22,10 +30,12 @@ class OptionCreationService /** * CreationService constructor. * + * @param \Illuminate\Contracts\Config\Repository $config * @param \Pterodactyl\Contracts\Repository\ServiceOptionRepositoryInterface $repository */ - public function __construct(ServiceOptionRepositoryInterface $repository) + public function __construct(ConfigRepository $config, ServiceOptionRepositoryInterface $repository) { + $this->config = $config; $this->repository = $repository; } @@ -38,7 +48,7 @@ class OptionCreationService * @throws \Pterodactyl\Exceptions\Model\DataValidationException * @throws \Pterodactyl\Exceptions\Service\ServiceOption\NoParentConfigurationFoundException */ - public function handle(array $data) + public function handle(array $data): ServiceOption { if (! is_null(array_get($data, 'config_from'))) { $results = $this->repository->findCountWhere([ @@ -53,6 +63,14 @@ class OptionCreationService $data['config_from'] = null; } - return $this->repository->create($data); + if (count($parts = explode(':', array_get($data, 'tag'))) > 1) { + $data['tag'] = $this->config->get('pterodactyl.service.author') . ':' . trim(array_pop($parts)); + } else { + $data['tag'] = $this->config->get('pterodactyl.service.author') . ':' . trim(array_get($data, 'tag')); + } + + return $this->repository->create(array_merge($data, [ + 'uuid' => Uuid::uuid4()->toString(), + ]), true, true); } } diff --git a/app/Services/Services/Options/OptionDeletionService.php b/app/Services/Services/Options/OptionDeletionService.php index 27788ca5c..626c9d756 100644 --- a/app/Services/Services/Options/OptionDeletionService.php +++ b/app/Services/Services/Options/OptionDeletionService.php @@ -9,7 +9,6 @@ namespace Pterodactyl\Services\Services\Options; -use Webmozart\Assert\Assert; use Pterodactyl\Exceptions\Service\HasActiveServersException; use Pterodactyl\Contracts\Repository\ServerRepositoryInterface; use Pterodactyl\Contracts\Repository\ServiceOptionRepositoryInterface; @@ -50,10 +49,8 @@ class OptionDeletionService * @throws \Pterodactyl\Exceptions\Service\HasActiveServersException * @throws \Pterodactyl\Exceptions\Service\ServiceOption\HasChildrenException */ - public function handle($option) + public function handle(int $option): int { - Assert::integerish($option, 'First argument passed to handle must be integer, received %s.'); - $servers = $this->serverRepository->findCountWhere([['option_id', '=', $option]]); if ($servers > 0) { throw new HasActiveServersException(trans('exceptions.service.options.delete_has_servers')); diff --git a/app/Services/Services/Options/OptionUpdateService.php b/app/Services/Services/Options/OptionUpdateService.php index 1d2109de5..73c69cc5d 100644 --- a/app/Services/Services/Options/OptionUpdateService.php +++ b/app/Services/Services/Options/OptionUpdateService.php @@ -40,7 +40,7 @@ class OptionUpdateService * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException * @throws \Pterodactyl\Exceptions\Service\ServiceOption\NoParentConfigurationFoundException */ - public function handle($option, array $data) + public function handle($option, array $data): void { if (! $option instanceof ServiceOption) { $option = $this->repository->find($option); diff --git a/app/Services/Services/ServiceCreationService.php b/app/Services/Services/ServiceCreationService.php index 4d7e77f1a..b0ddc62fb 100644 --- a/app/Services/Services/ServiceCreationService.php +++ b/app/Services/Services/ServiceCreationService.php @@ -9,6 +9,8 @@ namespace Pterodactyl\Services\Services; +use Ramsey\Uuid\Uuid; +use Pterodactyl\Models\Service; use Pterodactyl\Traits\Services\CreatesServiceIndex; use Illuminate\Contracts\Config\Repository as ConfigRepository; use Pterodactyl\Contracts\Repository\ServiceRepositoryInterface; @@ -49,16 +51,15 @@ class ServiceCreationService * * @throws \Pterodactyl\Exceptions\Model\DataValidationException */ - public function handle(array $data) + public function handle(array $data): Service { - return $this->repository->create(array_merge([ + return $this->repository->create([ + 'uuid' => Uuid::uuid4()->toString(), 'author' => $this->config->get('pterodactyl.service.author'), - ], [ 'name' => array_get($data, 'name'), 'description' => array_get($data, 'description'), - 'folder' => array_get($data, 'folder'), 'startup' => array_get($data, 'startup'), 'index_file' => $this->getIndexScript(), - ])); + ], true, true); } } diff --git a/app/Services/Services/ServiceDeletionService.php b/app/Services/Services/ServiceDeletionService.php index def352b8d..0a88b1209 100644 --- a/app/Services/Services/ServiceDeletionService.php +++ b/app/Services/Services/ServiceDeletionService.php @@ -47,7 +47,7 @@ class ServiceDeletionService * * @throws \Pterodactyl\Exceptions\Service\HasActiveServersException */ - public function handle($service) + public function handle(int $service): int { $count = $this->serverRepository->findCountWhere([['service_id', '=', $service]]); if ($count > 0) { diff --git a/app/Services/Services/ServiceUpdateService.php b/app/Services/Services/ServiceUpdateService.php index 59662e2a5..327c45aa7 100644 --- a/app/Services/Services/ServiceUpdateService.php +++ b/app/Services/Services/ServiceUpdateService.php @@ -36,7 +36,7 @@ class ServiceUpdateService * @throws \Pterodactyl\Exceptions\Model\DataValidationException * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException */ - public function handle($service, array $data) + public function handle(int $service, array $data): void { if (! is_null(array_get($data, 'author'))) { unset($data['author']); diff --git a/resources/themes/pterodactyl/admin/services/index.blade.php b/resources/themes/pterodactyl/admin/services/index.blade.php index cd336f9b7..3584f1f63 100644 --- a/resources/themes/pterodactyl/admin/services/index.blade.php +++ b/resources/themes/pterodactyl/admin/services/index.blade.php @@ -18,6 +18,13 @@ @endsection @section('content') +
+
+
+ Services are a powerful feature of Pterodactyl Panel that allow for extreme flexibility and configuration. Please note that while powerful, modifing a service wrongly can very easily brick your servers and cause more problems. Please avoid editing our default services — those provided by support@pterodactyl.io — unless you are absolutely sure of what you are doing. +
+
+
@@ -38,7 +45,7 @@ @foreach($services as $service) - {{ $service->name }} + {{ $service->name }} {{ $service->description }} {{ $service->options_count }} {{ $service->packs_count }} diff --git a/resources/themes/pterodactyl/admin/services/new.blade.php b/resources/themes/pterodactyl/admin/services/new.blade.php index 864dadbae..c63bec43b 100644 --- a/resources/themes/pterodactyl/admin/services/new.blade.php +++ b/resources/themes/pterodactyl/admin/services/new.blade.php @@ -46,13 +46,6 @@
-
- -
- -

Service are downloaded by the daemon and stored in a folder using this name. The storage location is /srv/daemon/services/{NAME} by default.

-
-
diff --git a/resources/themes/pterodactyl/admin/services/options/new.blade.php b/resources/themes/pterodactyl/admin/services/options/new.blade.php index 2a5f3da9f..79195f008 100644 --- a/resources/themes/pterodactyl/admin/services/options/new.blade.php +++ b/resources/themes/pterodactyl/admin/services/options/new.blade.php @@ -33,7 +33,7 @@
@@ -51,16 +51,19 @@
- +
+ {{ config('pterodactyl.service.author') }}: + +

This should be a unique identifer for this service option that is not used for any other service options. Must be alpha-numeric and no more than 60 characters in length.

- +

The default docker image that should be used for new servers under this service option. This can be left blank to use the parent service's defined image, and can also be changed per-server.

- +

The default statup command that should be used for new servers under this service option. This can be left blank to use the parent service's startup, and can also be changed per-server.

@@ -136,7 +139,7 @@ data: $.map(_.get(Pterodactyl.services, $(this).val() + '.options', []), function (item) { return { id: item.id, - text: item.name, + text: item.name + ' <' + item.tag + '>', }; }), }); diff --git a/resources/themes/pterodactyl/admin/services/options/view.blade.php b/resources/themes/pterodactyl/admin/services/options/view.blade.php index b44b96c9a..1f6564d81 100644 --- a/resources/themes/pterodactyl/admin/services/options/view.blade.php +++ b/resources/themes/pterodactyl/admin/services/options/view.blade.php @@ -59,17 +59,16 @@
- - -

This should be a unique identifer for this service option that is not used for any other service options.

+ +
- +

The default docker image that should be used for new servers under this service option. This can be left blank to use the parent service's defined image, and can also be changed per-server.

- +

The default statup command that should be used for new servers under this service option. This can be left blank to use the parent service's startup, and can also be changed per-server.

@@ -97,7 +96,7 @@

If you would like to default to settings from another option select the option from the menu above.

diff --git a/resources/themes/pterodactyl/admin/services/view.blade.php b/resources/themes/pterodactyl/admin/services/view.blade.php index f8461e7d2..2a6886f01 100644 --- a/resources/themes/pterodactyl/admin/services/view.blade.php +++ b/resources/themes/pterodactyl/admin/services/view.blade.php @@ -44,22 +44,18 @@
- +
+
-
- -
- -

Service are downloaded by the daemon and stored in a folder using this name. The storage location is /srv/daemon/services/{NAME} by default.

-
-
@@ -67,10 +63,21 @@

The default start command to use when running options under this service. This command can be modified per-option and should include the executable to be called in the container.

+
+ +
+ +
+
+
+ +
+ +
+
@@ -86,7 +93,7 @@
- + diff --git a/resources/themes/pterodactyl/layouts/admin.blade.php b/resources/themes/pterodactyl/layouts/admin.blade.php index bfd97b439..c547e2762 100644 --- a/resources/themes/pterodactyl/layouts/admin.blade.php +++ b/resources/themes/pterodactyl/layouts/admin.blade.php @@ -197,6 +197,12 @@ }); @endif + + @show
NameName Description Tag Servers