mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-25 16:22:43 +01:00
Move database configuration into new-style setup checks
Summary: Port the database checks over. Test Plan: Triggered all the checks via intentional misconfiguration. Reviewers: chad, btrahan Reviewed By: btrahan CC: aran Maniphest Tasks: T2228 Differential Revision: https://secure.phabricator.com/D4590
This commit is contained in:
parent
27ec272057
commit
72ec4f7a6f
4 changed files with 89 additions and 72 deletions
|
@ -1214,6 +1214,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorSetupCheck' => 'applications/config/check/PhabricatorSetupCheck.php',
|
'PhabricatorSetupCheck' => 'applications/config/check/PhabricatorSetupCheck.php',
|
||||||
'PhabricatorSetupCheckAPC' => 'applications/config/check/PhabricatorSetupCheckAPC.php',
|
'PhabricatorSetupCheckAPC' => 'applications/config/check/PhabricatorSetupCheckAPC.php',
|
||||||
'PhabricatorSetupCheckBaseURI' => 'applications/config/check/PhabricatorSetupCheckBaseURI.php',
|
'PhabricatorSetupCheckBaseURI' => 'applications/config/check/PhabricatorSetupCheckBaseURI.php',
|
||||||
|
'PhabricatorSetupCheckDatabase' => 'applications/config/check/PhabricatorSetupCheckDatabase.php',
|
||||||
'PhabricatorSetupCheckExtensions' => 'applications/config/check/PhabricatorSetupCheckExtensions.php',
|
'PhabricatorSetupCheckExtensions' => 'applications/config/check/PhabricatorSetupCheckExtensions.php',
|
||||||
'PhabricatorSetupCheckExtraConfig' => 'applications/config/check/PhabricatorSetupCheckExtraConfig.php',
|
'PhabricatorSetupCheckExtraConfig' => 'applications/config/check/PhabricatorSetupCheckExtraConfig.php',
|
||||||
'PhabricatorSetupCheckFacebook' => 'applications/config/check/PhabricatorSetupCheckFacebook.php',
|
'PhabricatorSetupCheckFacebook' => 'applications/config/check/PhabricatorSetupCheckFacebook.php',
|
||||||
|
@ -2580,6 +2581,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorSettingsPanelSearchPreferences' => 'PhabricatorSettingsPanel',
|
'PhabricatorSettingsPanelSearchPreferences' => 'PhabricatorSettingsPanel',
|
||||||
'PhabricatorSetupCheckAPC' => 'PhabricatorSetupCheck',
|
'PhabricatorSetupCheckAPC' => 'PhabricatorSetupCheck',
|
||||||
'PhabricatorSetupCheckBaseURI' => 'PhabricatorSetupCheck',
|
'PhabricatorSetupCheckBaseURI' => 'PhabricatorSetupCheck',
|
||||||
|
'PhabricatorSetupCheckDatabase' => 'PhabricatorSetupCheck',
|
||||||
'PhabricatorSetupCheckExtensions' => 'PhabricatorSetupCheck',
|
'PhabricatorSetupCheckExtensions' => 'PhabricatorSetupCheck',
|
||||||
'PhabricatorSetupCheckExtraConfig' => 'PhabricatorSetupCheck',
|
'PhabricatorSetupCheckExtraConfig' => 'PhabricatorSetupCheck',
|
||||||
'PhabricatorSetupCheckFacebook' => 'PhabricatorSetupCheck',
|
'PhabricatorSetupCheckFacebook' => 'PhabricatorSetupCheck',
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhabricatorSetupCheckDatabase extends PhabricatorSetupCheck {
|
||||||
|
|
||||||
|
public function getExecutionOrder() {
|
||||||
|
// This must run after basic PHP checks, but before most other checks.
|
||||||
|
return 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function executeChecks() {
|
||||||
|
$conf = PhabricatorEnv::newObjectFromConfig('mysql.configuration-provider');
|
||||||
|
$conn_user = $conf->getUser();
|
||||||
|
$conn_pass = $conf->getPassword();
|
||||||
|
$conn_host = $conf->getHost();
|
||||||
|
|
||||||
|
ini_set('mysql.connect_timeout', 2);
|
||||||
|
|
||||||
|
$conn_raw = PhabricatorEnv::newObjectFromConfig(
|
||||||
|
'mysql.implementation',
|
||||||
|
array(
|
||||||
|
array(
|
||||||
|
'user' => $conn_user,
|
||||||
|
'pass' => $conn_pass,
|
||||||
|
'host' => $conn_host,
|
||||||
|
'database' => null,
|
||||||
|
),
|
||||||
|
));
|
||||||
|
|
||||||
|
try {
|
||||||
|
queryfx($conn_raw, 'SELECT 1');
|
||||||
|
} catch (AphrontQueryConnectionException $ex) {
|
||||||
|
$message = pht(
|
||||||
|
"Unable to connect to MySQL!\n\n".
|
||||||
|
"%s\n\n".
|
||||||
|
"Make sure Phabricator and MySQL are correctly configured.",
|
||||||
|
$ex->getMessage());
|
||||||
|
|
||||||
|
$this->newIssue('mysql.connect')
|
||||||
|
->setName(pht('Can Not Connect to MySQL'))
|
||||||
|
->setMessage($message)
|
||||||
|
->setIsFatal(true)
|
||||||
|
->addPhabricatorConfig('mysql.host')
|
||||||
|
->addPhabricatorConfig('mysql.user')
|
||||||
|
->addPhabricatorConfig('mysql.pass');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$engines = queryfx_all($conn_raw, 'SHOW ENGINES');
|
||||||
|
$engines = ipull($engines, 'Support', 'Engine');
|
||||||
|
|
||||||
|
$innodb = idx($engines, 'InnoDB');
|
||||||
|
if ($innodb != 'YES' && $innodb != 'DEFAULT') {
|
||||||
|
$message = pht(
|
||||||
|
"The 'InnoDB' engine is not available in MySQL. Enable InnoDB in ".
|
||||||
|
"your MySQL configuration.".
|
||||||
|
"\n\n".
|
||||||
|
"(If you aleady created tables, MySQL incorrectly used some other ".
|
||||||
|
"engine to create them. You need to convert them or drop and ".
|
||||||
|
"reinitialize them.)");
|
||||||
|
|
||||||
|
$this->newIssue('mysql.innodb')
|
||||||
|
->setName(pht('MySQL InnoDB Engine Not Available'))
|
||||||
|
->setMessage($message)
|
||||||
|
->setIsFatal(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$namespace = PhabricatorEnv::getEnvConfig('storage.default-namespace');
|
||||||
|
|
||||||
|
$databases = queryfx_all($conn_raw, 'SHOW DATABASES');
|
||||||
|
$databases = ipull($databases, 'Database', 'Database');
|
||||||
|
|
||||||
|
if (empty($databases[$namespace.'_meta_data'])) {
|
||||||
|
$message = pht(
|
||||||
|
'Run the storage upgrade script to setup Phabricator\'s database '.
|
||||||
|
'schema.');
|
||||||
|
|
||||||
|
$this->newIssue('storage.upgrade')
|
||||||
|
->setName(pht('Setup MySQL Schema'))
|
||||||
|
->setMessage($message)
|
||||||
|
->setIsFatal(true)
|
||||||
|
->addCommand('<tt>phabricator/ $</tt> ./bin/storage upgrade');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -43,76 +43,6 @@ final class PhabricatorSetup {
|
||||||
|
|
||||||
self::write("[OKAY] Basic configuration OKAY\n");
|
self::write("[OKAY] Basic configuration OKAY\n");
|
||||||
|
|
||||||
self::writeHeader("MySQL DATABASE & STORAGE CONFIGURATION");
|
|
||||||
|
|
||||||
$conf = PhabricatorEnv::newObjectFromConfig('mysql.configuration-provider');
|
|
||||||
$conn_user = $conf->getUser();
|
|
||||||
$conn_pass = $conf->getPassword();
|
|
||||||
$conn_host = $conf->getHost();
|
|
||||||
|
|
||||||
self::write(" okay Trying to connect to MySQL database ".
|
|
||||||
"{$conn_user}@{$conn_host}...\n");
|
|
||||||
|
|
||||||
ini_set('mysql.connect_timeout', 2);
|
|
||||||
|
|
||||||
$conn_raw = PhabricatorEnv::newObjectFromConfig(
|
|
||||||
'mysql.implementation',
|
|
||||||
array(
|
|
||||||
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) {
|
|
||||||
$message = $ex->getMessage();
|
|
||||||
self::writeFailure();
|
|
||||||
self::write(
|
|
||||||
"Setup failure! MySQL exception: {$message} \n".
|
|
||||||
"Edit Phabricator configuration keys 'mysql.user', ".
|
|
||||||
"'mysql.host' and 'mysql.pass' to enable Phabricator ".
|
|
||||||
"to connect.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$engines = queryfx_all($conn_raw, 'SHOW ENGINES');
|
|
||||||
$engines = ipull($engines, 'Support', 'Engine');
|
|
||||||
|
|
||||||
$innodb = idx($engines, 'InnoDB');
|
|
||||||
if ($innodb != 'YES' && $innodb != 'DEFAULT') {
|
|
||||||
self::writeFailure();
|
|
||||||
self::write(
|
|
||||||
"Setup failure! The 'InnoDB' engine is not available. Enable ".
|
|
||||||
"InnoDB in your MySQL configuration. If you already created tables, ".
|
|
||||||
"MySQL incorrectly used some other engine. You need to convert ".
|
|
||||||
"them or drop and reinitialize them.");
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
self::write(" okay InnoDB is available.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
$namespace = PhabricatorEnv::getEnvConfig('storage.default-namespace');
|
|
||||||
|
|
||||||
$databases = queryfx_all($conn_raw, 'SHOW DATABASES');
|
|
||||||
$databases = ipull($databases, 'Database', 'Database');
|
|
||||||
if (empty($databases[$namespace.'_meta_data'])) {
|
|
||||||
self::writeFailure();
|
|
||||||
self::write(
|
|
||||||
"Setup failure! You haven't run 'bin/storage upgrade'. See this ".
|
|
||||||
"article for instructions:\n");
|
|
||||||
self::writeDoc('article/Configuration_Guide.html');
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
self::write(" okay Databases have been initialized.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
self::write("[OKAY] Database and storage configuration OKAY\n");
|
|
||||||
|
|
||||||
self::writeHeader('SUCCESS!');
|
self::writeHeader('SUCCESS!');
|
||||||
self::write(
|
self::write(
|
||||||
"Congratulations! Your setup seems mostly correct, or at least fairly ".
|
"Congratulations! Your setup seems mostly correct, or at least fairly ".
|
||||||
|
|
|
@ -204,8 +204,8 @@ abstract class PhabricatorBaseEnglishTranslation
|
||||||
),
|
),
|
||||||
|
|
||||||
'Run these %d command(s):' => array(
|
'Run these %d command(s):' => array(
|
||||||
'Run this %d command:',
|
'Run this command:',
|
||||||
'Run these %d commands:',
|
'Run these commands:',
|
||||||
),
|
),
|
||||||
|
|
||||||
'Install these %d PHP extension(s):' => array(
|
'Install these %d PHP extension(s):' => array(
|
||||||
|
|
Loading…
Reference in a new issue