diff --git a/.env.example b/.env.example index 45644374..4bcc8f12 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 d3e63af3..a7d602b5 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 87919ae7..7f710e62 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 35b5155f..72332c7b 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 365f40d2..7d585998 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 c5af2b69..672f2d2f 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 e81a9ba9..0a17f7e4 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 d59ca8f6..db5ec4c1 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 affe52de..95d9224e 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 7b302190..abb7cfca 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 d15a813e..8149a559 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 27788ca5..626c9d75 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 1d2109de..73c69cc5 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 4d7e77f1..b0ddc62f 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 def352b8..0a88b120 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 59662e2a..327c45aa 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 cd336f9b..3584f1f6 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 864dadba..c63bec43 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 2a5f3da9..79195f00 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 b44b96c9..1f6564d8 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 f8461e7d..2a6886f0 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 bfd97b43..c547e276 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