5) { self::writeNote( "Your MySQL connect timeout is very high ({$timeout} seconds). ". "Consider reducing it by setting 'mysql.connect_timeout' in your ". "php.ini."); } self::write(" okay Trying to connect to MySQL database ". "{$conn_user}@{$conn_host}...\n"); ini_set('mysql.connect_timeout', 2); $conn_raw = new AphrontMySQLDatabaseConnection( array( 'user' => $conn_user, 'pass' => $conn_pass, 'host' => $conn_host, 'database' => null, )); try { queryfx($conn_raw, 'SELECT 1'); self::write(" okay Connection successful!\n"); } catch (AphrontQueryConnectionException $ex) { self::writeFailure(); self::write( "Setup failure! Unable to connect to MySQL database ". "'{$conn_host}' with user '{$conn_user}'. Edit Phabricator ". "configuration keys 'mysql.user', 'mysql.host' and 'mysql.pass' to ". "enable Phabricator to connect."); return; } $databases = queryfx_all($conn_raw, 'SHOW DATABASES'); $databases = ipull($databases, 'Database'); $databases = array_fill_keys($databases, true); if (empty($databases['phabricator_meta_data'])) { self::writeFailure(); self::write( "Setup failure! You haven't loaded the 'initialize.sql' file into ". "MySQL. This file initializes necessary databases. See this guide for ". "instructions:\n"); self::writeDoc('article/Configuration_Guide.html'); return; } else { self::write(" okay Databases have been initialized.\n"); } $schema_version = queryfx_one( $conn_raw, 'SELECT version FROM phabricator_meta_data.schema_version'); $schema_version = idx($schema_version, 'version', 'null'); $expect = PhabricatorSQLPatchList::getExpectedSchemaVersion(); if ($schema_version != $expect) { self::writeFailure(); self::write( "Setup failure! You haven't upgraded your database schema to the ". "latest version. Expected version is '{$expect}', but your local ". "version is '{$schema_version}'. See this guide for instructions:\n"); self::writeDoc('article/Upgrading_Schema.html'); return; } else { self::write(" okay Database schema are up to date (v{$expect}).\n"); } self::write("[OKAY] Database configuration OKAY\n"); self::writeHeader('SUCCESS!'); self::write( "Congratulations! Your setup seems mostly correct, or at least fairly ". "reasonable.\n\n". "*** NEXT STEP ***\n". "Edit your configuration file (conf/{$env}.conf.php) and remove the ". "'phabricator.setup' line to finish installation."); } public static function requireExtension($extension) { if (extension_loaded($extension)) { self::write(" okay Extension '{$extension}' installed.\n"); return true; } else { self::write("[FAIL] Extension '{$extension}' is NOT INSTALLED!\n"); return false; } } private static function writeFailure() { self::write("\n\n<<< *** FAILURE! *** >>>\n"); } private static function write($str) { echo $str; ob_flush(); flush(); // This, uh, makes it look cool. -_- usleep(40000); } private static function writeNote($note) { self::write( 'Note: '.wordwrap($note, 75, "\n ", true)."\n\n"); } public static function writeHeader($header) { $template = '>>>'.str_repeat('-', 77); $template = substr_replace( $template, ' '.$header.' ', 3, strlen($header) + 4); self::write("\n\n{$template}\n\n"); } public static function writeDoc($doc) { self::write( "\n". ' http://phabricator.com/docs/phabricator/'.$doc. "\n\n"); } }