2017-09-23 02:19:57 +00:00
< ? php
namespace Pterodactyl\Console\Commands\Environment ;
use Illuminate\Console\Command ;
use Illuminate\Contracts\Console\Kernel ;
use Illuminate\Database\DatabaseManager ;
use Pterodactyl\Traits\Commands\EnvironmentWriterTrait ;
class DatabaseSettingsCommand extends Command
{
use EnvironmentWriterTrait ;
protected $description = 'Configure database settings for the Panel.' ;
protected $signature = ' p : environment : database
{ -- host = : The connection address for the MySQL server . }
2017-11-04 22:41:52 +00:00
{ -- 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 . } ' ;
2017-09-23 02:19:57 +00:00
2022-10-14 16:59:20 +00:00
protected array $variables = [];
2017-09-23 02:19:57 +00:00
/**
* DatabaseSettingsCommand constructor .
*/
2022-10-14 16:59:20 +00:00
public function __construct ( private DatabaseManager $database , private Kernel $console )
2017-09-23 02:19:57 +00:00
{
parent :: __construct ();
}
/**
* Handle command execution .
*
* @ throws \Pterodactyl\Exceptions\PterodactylException
*/
2022-10-14 16:59:20 +00:00
public function handle () : int
2017-09-23 02:19:57 +00:00
{
2022-05-12 21:53:29 +00:00
$this -> output -> note ( 'It is highly recommended to not use "localhost" as your database host as we have seen frequent socket connection issues. If you want to use a local connection you should be using "127.0.0.1".' );
2017-09-23 02:19:57 +00:00
$this -> variables [ 'DB_HOST' ] = $this -> option ( 'host' ) ? ? $this -> ask (
2022-05-12 21:53:29 +00:00
'Database Host' ,
config ( 'database.connections.mysql.host' , '127.0.0.1' )
2021-01-23 20:33:34 +00:00
);
2017-09-23 02:19:57 +00:00
$this -> variables [ 'DB_PORT' ] = $this -> option ( 'port' ) ? ? $this -> ask (
2022-05-12 21:53:29 +00:00
'Database Port' ,
config ( 'database.connections.mysql.port' , 3306 )
2021-01-23 20:33:34 +00:00
);
2017-09-23 02:19:57 +00:00
2017-11-04 22:41:52 +00:00
$this -> variables [ 'DB_DATABASE' ] = $this -> option ( 'database' ) ? ? $this -> ask (
2022-05-12 21:53:29 +00:00
'Database Name' ,
config ( 'database.connections.mysql.database' , 'panel' )
2021-01-23 20:33:34 +00:00
);
2017-09-23 02:19:57 +00:00
2022-05-12 21:53:29 +00:00
$this -> output -> note ( 'Using the "root" account for MySQL connections is not only highly frowned upon, it is also not allowed by this application. You\'ll need to have created a MySQL user for this software.' );
2017-11-04 22:41:52 +00:00
$this -> variables [ 'DB_USERNAME' ] = $this -> option ( 'username' ) ? ? $this -> ask (
2022-05-12 21:53:29 +00:00
'Database Username' ,
config ( 'database.connections.mysql.username' , 'pterodactyl' )
2021-01-23 20:33:34 +00:00
);
2017-09-23 02:19:57 +00:00
$askForMySQLPassword = true ;
2022-05-12 21:53:29 +00:00
if ( ! empty ( config ( 'database.connections.mysql.password' )) && $this -> input -> isInteractive ()) {
$this -> variables [ 'DB_PASSWORD' ] = config ( 'database.connections.mysql.password' );
$askForMySQLPassword = $this -> confirm ( 'It appears you already have a MySQL connection password defined, would you like to change it?' );
2017-09-23 02:19:57 +00:00
}
if ( $askForMySQLPassword ) {
2022-05-12 21:53:29 +00:00
$this -> variables [ 'DB_PASSWORD' ] = $this -> option ( 'password' ) ? ? $this -> secret ( 'Database Password' );
2017-09-23 02:19:57 +00:00
}
try {
$this -> testMySQLConnection ();
2023-02-23 19:30:16 +00:00
} catch ( \PDOException $exception ) {
2022-05-12 21:53:29 +00:00
$this -> output -> error ( sprintf ( 'Unable to connect to the MySQL server using the provided credentials. The error returned was "%s".' , $exception -> getMessage ()));
$this -> output -> error ( 'Your connection credentials have NOT been saved. You will need to provide valid connection information before proceeding.' );
2017-09-23 02:19:57 +00:00
2022-05-12 21:53:29 +00:00
if ( $this -> confirm ( 'Go back and try again?' )) {
2017-09-23 02:19:57 +00:00
$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 ()
{
2022-05-12 21:53:29 +00:00
config () -> set ( 'database.connections._pterodactyl_command_test' , [
2019-09-06 04:32:57 +00:00
'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 ,
2017-09-23 02:19:57 +00:00
]);
$this -> database -> connection ( '_pterodactyl_command_test' ) -> getPdo ();
}
}