191 lines
7.2 KiB
PHP
191 lines
7.2 KiB
PHP
<?php
|
|
|
|
namespace Pterodactyl\Console\Commands\Environment;
|
|
|
|
use DateTimeZone;
|
|
use Illuminate\Console\Command;
|
|
use Illuminate\Contracts\Console\Kernel;
|
|
use Pterodactyl\Traits\Commands\EnvironmentWriterTrait;
|
|
|
|
class AppSettingsCommand extends Command
|
|
{
|
|
use EnvironmentWriterTrait;
|
|
|
|
public const CACHE_DRIVERS = [
|
|
'redis' => 'Redis (recommended)',
|
|
'memcached' => 'Memcached',
|
|
'file' => 'Filesystem',
|
|
];
|
|
|
|
public const SESSION_DRIVERS = [
|
|
'redis' => 'Redis (recommended)',
|
|
'memcached' => 'Memcached',
|
|
'database' => 'MySQL Database',
|
|
'file' => 'Filesystem',
|
|
'cookie' => 'Cookie',
|
|
];
|
|
|
|
public const QUEUE_DRIVERS = [
|
|
'redis' => 'Redis (recommended)',
|
|
'database' => 'MySQL Database',
|
|
'sync' => 'Sync',
|
|
];
|
|
|
|
/**
|
|
* @var \Illuminate\Contracts\Console\Kernel
|
|
*/
|
|
protected $command;
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $description = 'Configure basic environment settings for the Panel.';
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $signature = 'p:environment:setup
|
|
{--new-salt : Whether or not to generate a new salt for Hashids.}
|
|
{--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.}
|
|
{--session= : The session driver backend to use.}
|
|
{--queue= : The queue driver backend to use.}
|
|
{--redis-host= : Redis host to use for connections.}
|
|
{--redis-pass= : Password used to connect to redis.}
|
|
{--redis-port= : Port to connect to redis over.}
|
|
{--settings-ui= : Enable or disable the settings UI.}';
|
|
|
|
/**
|
|
* @var array
|
|
*/
|
|
protected $variables = [];
|
|
|
|
/**
|
|
* AppSettingsCommand constructor.
|
|
*/
|
|
public function __construct(Kernel $command)
|
|
{
|
|
parent::__construct();
|
|
|
|
$this->command = $command;
|
|
}
|
|
|
|
/**
|
|
* Handle command execution.
|
|
*
|
|
* @throws \Pterodactyl\Exceptions\PterodactylException
|
|
*/
|
|
public function handle()
|
|
{
|
|
if (empty(config('hashids.salt')) || $this->option('new-salt')) {
|
|
$this->variables['HASHIDS_SALT'] = str_random(20);
|
|
}
|
|
|
|
$this->output->comment('Provide the email address that eggs exported by this Panel should be from. This should be a valid email address.');
|
|
$this->variables['APP_SERVICE_AUTHOR'] = $this->option('author') ?? $this->ask(
|
|
'Egg Author Email',
|
|
config('pterodactyl.service.author', 'unknown@unknown.com')
|
|
);
|
|
|
|
if (!filter_var($this->variables['APP_SERVICE_AUTHOR'], FILTER_VALIDATE_EMAIL)) {
|
|
$this->output->error('The service author email provided is invalid.');
|
|
|
|
return 1;
|
|
}
|
|
|
|
$this->output->comment('The application URL MUST begin with https:// or http:// depending on if you are using SSL or not. If you do not include the scheme your emails and other content will link to the wrong location.');
|
|
$this->variables['APP_URL'] = $this->option('url') ?? $this->ask(
|
|
'Application URL',
|
|
config('app.url', 'http://example.org')
|
|
);
|
|
|
|
$this->output->comment('The timezone should match one of PHP\'s supported timezones. If you are unsure, please reference http://php.net/manual/en/timezones.php.');
|
|
$this->variables['APP_TIMEZONE'] = $this->option('timezone') ?? $this->anticipate(
|
|
'Application Timezone',
|
|
DateTimeZone::listIdentifiers(DateTimeZone::ALL),
|
|
config('app.timezone')
|
|
);
|
|
|
|
$selected = config('cache.default', 'redis');
|
|
$this->variables['CACHE_DRIVER'] = $this->option('cache') ?? $this->choice(
|
|
'Cache Driver',
|
|
self::CACHE_DRIVERS,
|
|
array_key_exists($selected, self::CACHE_DRIVERS) ? $selected : null
|
|
);
|
|
|
|
$selected = config('session.driver', 'redis');
|
|
$this->variables['SESSION_DRIVER'] = $this->option('session') ?? $this->choice(
|
|
'Session Driver',
|
|
self::SESSION_DRIVERS,
|
|
array_key_exists($selected, self::SESSION_DRIVERS) ? $selected : null
|
|
);
|
|
|
|
$selected = config('queue.default', 'redis');
|
|
$this->variables['QUEUE_CONNECTION'] = $this->option('queue') ?? $this->choice(
|
|
'Queue Driver',
|
|
self::QUEUE_DRIVERS,
|
|
array_key_exists($selected, self::QUEUE_DRIVERS) ? $selected : null
|
|
);
|
|
|
|
if (!is_null($this->option('settings-ui'))) {
|
|
$this->variables['APP_ENVIRONMENT_ONLY'] = $this->option('settings-ui') == 'true' ? 'false' : 'true';
|
|
} else {
|
|
$this->variables['APP_ENVIRONMENT_ONLY'] = $this->confirm('Enable UI based settings editor?', true) ? 'false' : 'true';
|
|
}
|
|
|
|
// Make sure session cookies are set as "secure" when using HTTPS
|
|
if (strpos($this->variables['APP_URL'], 'https://') === 0) {
|
|
$this->variables['SESSION_SECURE_COOKIE'] = 'true';
|
|
}
|
|
|
|
$this->checkForRedis();
|
|
$this->writeToEnvironment($this->variables);
|
|
|
|
$this->info($this->command->output());
|
|
}
|
|
|
|
/**
|
|
* Check if redis is selected, if so, request connection details and verify them.
|
|
*/
|
|
private function checkForRedis()
|
|
{
|
|
$items = collect($this->variables)->filter(function ($item) {
|
|
return $item === 'redis';
|
|
});
|
|
|
|
// Redis was not selected, no need to continue.
|
|
if (count($items) === 0) {
|
|
return;
|
|
}
|
|
|
|
$this->output->note('You\'ve selected the Redis driver for one or more options, please provide valid connection information below. In most cases you can use the defaults provided unless you have modified your setup.');
|
|
$this->variables['REDIS_HOST'] = $this->option('redis-host') ?? $this->ask(
|
|
'Redis Host',
|
|
config('database.redis.default.host')
|
|
);
|
|
|
|
$askForRedisPassword = true;
|
|
if (!empty(config('database.redis.default.password'))) {
|
|
$this->variables['REDIS_PASSWORD'] = config('database.redis.default.password');
|
|
$askForRedisPassword = $this->confirm('It seems a password is already defined for Redis, would you like to change it?');
|
|
}
|
|
|
|
if ($askForRedisPassword) {
|
|
$this->output->comment('By default a Redis server instance has no password as it is running locally and inaccessible to the outside world. If this is the case, simply hit enter without entering a value.');
|
|
$this->variables['REDIS_PASSWORD'] = $this->option('redis-pass') ?? $this->output->askHidden(
|
|
'Redis Password'
|
|
);
|
|
}
|
|
|
|
if (empty($this->variables['REDIS_PASSWORD'])) {
|
|
$this->variables['REDIS_PASSWORD'] = 'null';
|
|
}
|
|
|
|
$this->variables['REDIS_PORT'] = $this->option('redis-port') ?? $this->ask(
|
|
'Redis Port',
|
|
config('database.redis.default.port')
|
|
);
|
|
}
|
|
}
|