mirror of
				https://github.com/pelican-dev/panel.git
				synced 2025-11-04 08:06:51 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			153 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * Pterodactyl - Panel
 | 
						|
 * Copyright (c) 2015 - 2017 Dane Everitt <dane@daneeveritt.com>.
 | 
						|
 *
 | 
						|
 * This software is licensed under the terms of the MIT license.
 | 
						|
 * https://opensource.org/licenses/MIT
 | 
						|
 */
 | 
						|
 | 
						|
namespace Pterodactyl\Console\Commands\Environment;
 | 
						|
 | 
						|
use PDOException;
 | 
						|
use Illuminate\Console\Command;
 | 
						|
use Illuminate\Contracts\Console\Kernel;
 | 
						|
use Illuminate\Database\DatabaseManager;
 | 
						|
use Pterodactyl\Traits\Commands\EnvironmentWriterTrait;
 | 
						|
use Illuminate\Contracts\Config\Repository as ConfigRepository;
 | 
						|
 | 
						|
class DatabaseSettingsCommand extends Command
 | 
						|
{
 | 
						|
    use EnvironmentWriterTrait;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var \Illuminate\Contracts\Config\Repository
 | 
						|
     */
 | 
						|
    protected $config;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var \Illuminate\Contracts\Console\Kernel
 | 
						|
     */
 | 
						|
    protected $console;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var \Illuminate\Database\DatabaseManager
 | 
						|
     */
 | 
						|
    protected $database;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    protected $description = 'Configure database settings for the Panel.';
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    protected $signature = 'p:environment:database
 | 
						|
                            {--host= : The connection address for the MySQL server.}
 | 
						|
                            {--port= : The connection port for the MySQL server.}
 | 
						|
                            {--database= : The database to use.}
 | 
						|
                            {--username= : Username to use when connecting.}
 | 
						|
                            {--password= : Password to use for this database.}';
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var array
 | 
						|
     */
 | 
						|
    protected $variables = [];
 | 
						|
 | 
						|
    /**
 | 
						|
     * DatabaseSettingsCommand constructor.
 | 
						|
     *
 | 
						|
     * @param \Illuminate\Contracts\Config\Repository $config
 | 
						|
     * @param \Illuminate\Database\DatabaseManager $database
 | 
						|
     * @param \Illuminate\Contracts\Console\Kernel $console
 | 
						|
     */
 | 
						|
    public function __construct(ConfigRepository $config, DatabaseManager $database, Kernel $console)
 | 
						|
    {
 | 
						|
        parent::__construct();
 | 
						|
 | 
						|
        $this->config = $config;
 | 
						|
        $this->console = $console;
 | 
						|
        $this->database = $database;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Handle command execution.
 | 
						|
     *
 | 
						|
     * @return int
 | 
						|
     *
 | 
						|
     * @throws \Pterodactyl\Exceptions\PterodactylException
 | 
						|
     */
 | 
						|
    public function handle()
 | 
						|
    {
 | 
						|
        $this->output->note(trans('command/messages.environment.database.host_warning'));
 | 
						|
        $this->variables['DB_HOST'] = $this->option('host') ?? $this->ask(
 | 
						|
                trans('command/messages.environment.database.host'), $this->config->get('database.connections.mysql.host', '127.0.0.1')
 | 
						|
            );
 | 
						|
 | 
						|
        $this->variables['DB_PORT'] = $this->option('port') ?? $this->ask(
 | 
						|
                trans('command/messages.environment.database.port'), $this->config->get('database.connections.mysql.port', 3306)
 | 
						|
            );
 | 
						|
 | 
						|
        $this->variables['DB_DATABASE'] = $this->option('database') ?? $this->ask(
 | 
						|
                trans('command/messages.environment.database.database'), $this->config->get('database.connections.mysql.database', 'panel')
 | 
						|
            );
 | 
						|
 | 
						|
        $this->output->note(trans('command/messages.environment.database.username_warning'));
 | 
						|
        $this->variables['DB_USERNAME'] = $this->option('username') ?? $this->ask(
 | 
						|
                trans('command/messages.environment.database.username'), $this->config->get('database.connections.mysql.username', 'pterodactyl')
 | 
						|
            );
 | 
						|
 | 
						|
        $askForMySQLPassword = true;
 | 
						|
        if (! empty($this->config->get('database.connections.mysql.password')) && $this->input->isInteractive()) {
 | 
						|
            $this->variables['DB_PASSWORD'] = $this->config->get('database.connections.mysql.password');
 | 
						|
            $askForMySQLPassword = $this->confirm(trans('command/messages.environment.database.password_defined'));
 | 
						|
        }
 | 
						|
 | 
						|
        if ($askForMySQLPassword) {
 | 
						|
            $this->variables['DB_PASSWORD'] = $this->option('password') ?? $this->secret(trans('command/messages.environment.database.password'));
 | 
						|
        }
 | 
						|
 | 
						|
        try {
 | 
						|
            $this->testMySQLConnection();
 | 
						|
        } catch (PDOException $exception) {
 | 
						|
            $this->output->error(trans('command/messages.environment.database.connection_error', ['error' => $exception->getMessage()]));
 | 
						|
            $this->output->error(trans('command/messages.environment.database.creds_not_saved'));
 | 
						|
 | 
						|
            if ($this->confirm(trans('command/messages.environment.database.try_again'))) {
 | 
						|
                $this->database->disconnect('_pterodactyl_command_test');
 | 
						|
 | 
						|
                return $this->handle();
 | 
						|
            }
 | 
						|
 | 
						|
            return 1;
 | 
						|
        }
 | 
						|
 | 
						|
        $this->writeToEnvironment($this->variables);
 | 
						|
 | 
						|
        $this->info($this->console->output());
 | 
						|
 | 
						|
        return 0;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test that we can connect to the provided MySQL instance and perform a selection.
 | 
						|
     */
 | 
						|
    private function testMySQLConnection()
 | 
						|
    {
 | 
						|
        $this->config->set('database.connections._pterodactyl_command_test', [
 | 
						|
            'driver' => 'mysql',
 | 
						|
            'host' => $this->variables['DB_HOST'],
 | 
						|
            'port' => $this->variables['DB_PORT'],
 | 
						|
            'database' => $this->variables['DB_DATABASE'],
 | 
						|
            'username' => $this->variables['DB_USERNAME'],
 | 
						|
            'password' => $this->variables['DB_PASSWORD'],
 | 
						|
            'charset' => 'utf8mb4',
 | 
						|
            'collation' => 'utf8mb4_unicode_ci',
 | 
						|
            'strict' => true,
 | 
						|
        ]);
 | 
						|
 | 
						|
        $this->database->connection('_pterodactyl_command_test')->getPdo();
 | 
						|
    }
 | 
						|
}
 |