diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -1629,6 +1629,7 @@ 'PhabricatorConfigKeySchema' => 'applications/config/schema/PhabricatorConfigKeySchema.php', 'PhabricatorConfigListController' => 'applications/config/controller/PhabricatorConfigListController.php', 'PhabricatorConfigLocalSource' => 'infrastructure/env/PhabricatorConfigLocalSource.php', + 'PhabricatorConfigManagementCheckWorkflow' => 'applications/config/management/PhabricatorConfigManagementCheckWorkflow.php', 'PhabricatorConfigManagementDeleteWorkflow' => 'applications/config/management/PhabricatorConfigManagementDeleteWorkflow.php', 'PhabricatorConfigManagementGetWorkflow' => 'applications/config/management/PhabricatorConfigManagementGetWorkflow.php', 'PhabricatorConfigManagementListWorkflow' => 'applications/config/management/PhabricatorConfigManagementListWorkflow.php', @@ -5192,6 +5193,7 @@ 'PhabricatorConfigKeySchema' => 'PhabricatorConfigStorageSchema', 'PhabricatorConfigListController' => 'PhabricatorConfigController', 'PhabricatorConfigLocalSource' => 'PhabricatorConfigProxySource', + 'PhabricatorConfigManagementCheckWorkflow' => 'PhabricatorConfigManagementWorkflow', 'PhabricatorConfigManagementDeleteWorkflow' => 'PhabricatorConfigManagementWorkflow', 'PhabricatorConfigManagementGetWorkflow' => 'PhabricatorConfigManagementWorkflow', 'PhabricatorConfigManagementListWorkflow' => 'PhabricatorConfigManagementWorkflow', diff --git a/src/applications/config/check/PhabricatorAuthSetupCheck.php b/src/applications/config/check/PhabricatorAuthSetupCheck.php --- a/src/applications/config/check/PhabricatorAuthSetupCheck.php +++ b/src/applications/config/check/PhabricatorAuthSetupCheck.php @@ -6,7 +6,7 @@ return self::GROUP_IMPORTANT; } - protected function executeChecks() { + protected function executeCommonChecks() { // NOTE: We're not actually building these providers. Building providers // can require additional configuration to be present (e.g., to build // redirect and login URIs using `phabricator.base-uri`) and it won't diff --git a/src/applications/config/check/PhabricatorBaseURISetupCheck.php b/src/applications/config/check/PhabricatorBaseURISetupCheck.php --- a/src/applications/config/check/PhabricatorBaseURISetupCheck.php +++ b/src/applications/config/check/PhabricatorBaseURISetupCheck.php @@ -6,7 +6,7 @@ return self::GROUP_IMPORTANT; } - protected function executeChecks() { + protected function executeWebChecks() { $base_uri = PhabricatorEnv::getEnvConfig('phabricator.base-uri'); $host_header = AphrontRequest::getHTTPHeader('Host'); diff --git a/src/applications/config/check/PhabricatorBinariesSetupCheck.php b/src/applications/config/check/PhabricatorBinariesSetupCheck.php --- a/src/applications/config/check/PhabricatorBinariesSetupCheck.php +++ b/src/applications/config/check/PhabricatorBinariesSetupCheck.php @@ -6,7 +6,7 @@ return self::GROUP_OTHER; } - protected function executeChecks() { + protected function executeCommonChecks() { if (phutil_is_windows()) { $bin_name = 'where'; } else { diff --git a/src/applications/config/check/PhabricatorCacheSetupCheck.php b/src/applications/config/check/PhabricatorCacheSetupCheck.php --- a/src/applications/config/check/PhabricatorCacheSetupCheck.php +++ b/src/applications/config/check/PhabricatorCacheSetupCheck.php @@ -6,7 +6,7 @@ return self::GROUP_OTHER; } - protected function executeChecks() { + protected function executeWebChecks() { $code_cache = PhabricatorOpcodeCacheSpec::getActiveCacheSpec(); $data_cache = PhabricatorDataCacheSpec::getActiveCacheSpec(); diff --git a/src/applications/config/check/PhabricatorDaemonsSetupCheck.php b/src/applications/config/check/PhabricatorDaemonsSetupCheck.php --- a/src/applications/config/check/PhabricatorDaemonsSetupCheck.php +++ b/src/applications/config/check/PhabricatorDaemonsSetupCheck.php @@ -6,7 +6,7 @@ return self::GROUP_IMPORTANT; } - protected function executeChecks() { + protected function executeCommonChecks() { $task_daemon = id(new PhabricatorDaemonLogQuery()) ->setViewer(PhabricatorUser::getOmnipotentUser()) diff --git a/src/applications/config/check/PhabricatorDatabaseSetupCheck.php b/src/applications/config/check/PhabricatorDatabaseSetupCheck.php --- a/src/applications/config/check/PhabricatorDatabaseSetupCheck.php +++ b/src/applications/config/check/PhabricatorDatabaseSetupCheck.php @@ -11,7 +11,7 @@ return 0.5; } - protected function executeChecks() { + protected function executeCommonChecks() { $conf = PhabricatorEnv::newObjectFromConfig('mysql.configuration-provider'); $conn_user = $conf->getUser(); $conn_pass = $conf->getPassword(); diff --git a/src/applications/config/check/PhabricatorElasticSearchSetupCheck.php b/src/applications/config/check/PhabricatorElasticSearchSetupCheck.php --- a/src/applications/config/check/PhabricatorElasticSearchSetupCheck.php +++ b/src/applications/config/check/PhabricatorElasticSearchSetupCheck.php @@ -6,7 +6,7 @@ return self::GROUP_OTHER; } - protected function executeChecks() { + protected function executeCommonChecks() { if (!$this->shouldUseElasticSearchEngine()) { return; } diff --git a/src/applications/config/check/PhabricatorExtensionsSetupCheck.php b/src/applications/config/check/PhabricatorExtensionsSetupCheck.php --- a/src/applications/config/check/PhabricatorExtensionsSetupCheck.php +++ b/src/applications/config/check/PhabricatorExtensionsSetupCheck.php @@ -10,7 +10,7 @@ return 0; } - protected function executeChecks() { + protected function executeCommonChecks() { // TODO: Make 'mbstring' and 'iconv' soft requirements. // TODO: Make 'curl' a soft requirement. diff --git a/src/applications/config/check/PhabricatorExtraConfigSetupCheck.php b/src/applications/config/check/PhabricatorExtraConfigSetupCheck.php --- a/src/applications/config/check/PhabricatorExtraConfigSetupCheck.php +++ b/src/applications/config/check/PhabricatorExtraConfigSetupCheck.php @@ -6,7 +6,7 @@ return self::GROUP_OTHER; } - protected function executeChecks() { + protected function executeCommonChecks() { $ancient_config = self::getAncientConfig(); $all_keys = PhabricatorEnv::getAllConfigKeys(); diff --git a/src/applications/config/check/PhabricatorFileinfoSetupCheck.php b/src/applications/config/check/PhabricatorFileinfoSetupCheck.php --- a/src/applications/config/check/PhabricatorFileinfoSetupCheck.php +++ b/src/applications/config/check/PhabricatorFileinfoSetupCheck.php @@ -6,7 +6,7 @@ return self::GROUP_OTHER; } - protected function executeChecks() { + protected function executeCommonChecks() { if (!extension_loaded('fileinfo')) { $message = pht( "The '%s' extension is not installed. Without '%s', ". diff --git a/src/applications/config/check/PhabricatorGDSetupCheck.php b/src/applications/config/check/PhabricatorGDSetupCheck.php --- a/src/applications/config/check/PhabricatorGDSetupCheck.php +++ b/src/applications/config/check/PhabricatorGDSetupCheck.php @@ -6,7 +6,7 @@ return self::GROUP_OTHER; } - protected function executeChecks() { + protected function executeCommonChecks() { if (!extension_loaded('gd')) { $message = pht( "The '%s' extension is not installed. Without '%s', support, ". diff --git a/src/applications/config/check/PhabricatorImagemagickSetupCheck.php b/src/applications/config/check/PhabricatorImagemagickSetupCheck.php --- a/src/applications/config/check/PhabricatorImagemagickSetupCheck.php +++ b/src/applications/config/check/PhabricatorImagemagickSetupCheck.php @@ -6,7 +6,7 @@ return self::GROUP_OTHER; } - protected function executeChecks() { + protected function executeCommonChecks() { $imagemagick = PhabricatorEnv::getEnvConfig('files.enable-imagemagick'); if ($imagemagick) { if (!Filesystem::binaryExists('convert')) { diff --git a/src/applications/config/check/PhabricatorInvalidConfigSetupCheck.php b/src/applications/config/check/PhabricatorInvalidConfigSetupCheck.php --- a/src/applications/config/check/PhabricatorInvalidConfigSetupCheck.php +++ b/src/applications/config/check/PhabricatorInvalidConfigSetupCheck.php @@ -6,7 +6,7 @@ return self::GROUP_OTHER; } - protected function executeChecks() { + protected function executeCommonChecks() { $groups = PhabricatorApplicationConfigOptions::loadAll(); foreach ($groups as $group) { $options = $group->getOptions(); diff --git a/src/applications/config/check/PhabricatorMailSetupCheck.php b/src/applications/config/check/PhabricatorMailSetupCheck.php --- a/src/applications/config/check/PhabricatorMailSetupCheck.php +++ b/src/applications/config/check/PhabricatorMailSetupCheck.php @@ -6,7 +6,7 @@ return self::GROUP_OTHER; } - protected function executeChecks() { + protected function executeCommonChecks() { $adapter = PhabricatorEnv::getEnvConfig('metamta.mail-adapter'); switch ($adapter) { diff --git a/src/applications/config/check/PhabricatorMySQLSetupCheck.php b/src/applications/config/check/PhabricatorMySQLSetupCheck.php --- a/src/applications/config/check/PhabricatorMySQLSetupCheck.php +++ b/src/applications/config/check/PhabricatorMySQLSetupCheck.php @@ -19,7 +19,7 @@ return $value; } - protected function executeChecks() { + protected function executeCommonChecks() { $max_allowed_packet = self::loadRawConfigValue('max_allowed_packet'); // This primarily supports setting the filesize limit for MySQL to 8MB, diff --git a/src/applications/config/check/PhabricatorPHPConfigSetupCheck.php b/src/applications/config/check/PhabricatorPHPConfigSetupCheck.php --- a/src/applications/config/check/PhabricatorPHPConfigSetupCheck.php +++ b/src/applications/config/check/PhabricatorPHPConfigSetupCheck.php @@ -10,7 +10,7 @@ return 0; } - protected function executeChecks() { + protected function executeCommonChecks() { $safe_mode = ini_get('safe_mode'); if ($safe_mode) { $message = pht( diff --git a/src/applications/config/check/PhabricatorPathSetupCheck.php b/src/applications/config/check/PhabricatorPathSetupCheck.php --- a/src/applications/config/check/PhabricatorPathSetupCheck.php +++ b/src/applications/config/check/PhabricatorPathSetupCheck.php @@ -6,7 +6,7 @@ return self::GROUP_OTHER; } - protected function executeChecks() { + protected function executeCommonChecks() { // NOTE: We've already appended `environment.append-paths`, so we don't // need to explicitly check for it. $path = getenv('PATH'); diff --git a/src/applications/config/check/PhabricatorPygmentSetupCheck.php b/src/applications/config/check/PhabricatorPygmentSetupCheck.php --- a/src/applications/config/check/PhabricatorPygmentSetupCheck.php +++ b/src/applications/config/check/PhabricatorPygmentSetupCheck.php @@ -6,7 +6,7 @@ return self::GROUP_OTHER; } - protected function executeChecks() { + protected function executeCommonChecks() { $pygment = PhabricatorEnv::getEnvConfig('pygments.enabled'); if ($pygment) { diff --git a/src/applications/config/check/PhabricatorRepositoriesSetupCheck.php b/src/applications/config/check/PhabricatorRepositoriesSetupCheck.php --- a/src/applications/config/check/PhabricatorRepositoriesSetupCheck.php +++ b/src/applications/config/check/PhabricatorRepositoriesSetupCheck.php @@ -6,7 +6,7 @@ return self::GROUP_OTHER; } - protected function executeChecks() { + protected function executeCommonChecks() { $cluster_services = id(new AlmanacServiceQuery()) ->setViewer(PhabricatorUser::getOmnipotentUser()) diff --git a/src/applications/config/check/PhabricatorSecuritySetupCheck.php b/src/applications/config/check/PhabricatorSecuritySetupCheck.php --- a/src/applications/config/check/PhabricatorSecuritySetupCheck.php +++ b/src/applications/config/check/PhabricatorSecuritySetupCheck.php @@ -6,7 +6,7 @@ return self::GROUP_OTHER; } - protected function executeChecks() { + protected function executeCommonChecks() { // This checks for a version of bash with the "Shellshock" vulnerability. // For details, see T6185. diff --git a/src/applications/config/check/PhabricatorSetupCheck.php b/src/applications/config/check/PhabricatorSetupCheck.php --- a/src/applications/config/check/PhabricatorSetupCheck.php +++ b/src/applications/config/check/PhabricatorSetupCheck.php @@ -4,7 +4,9 @@ private $issues; - abstract protected function executeChecks(); + protected function executeCommandLineChecks() {} + protected function executeCommonChecks() {} + protected function executeWebChecks() {} const GROUP_OTHER = 'other'; const GROUP_MYSQL = 'mysql'; @@ -42,7 +44,14 @@ final public function runSetupChecks() { $this->issues = array(); - $this->executeChecks(); + + $this->executeCommonChecks(); + + if (php_sapi_name() == 'cli') { + $this->executeCommandLineChecks(); + } else { + $this->executeWebChecks(); + } } final public static function getOpenSetupIssueKeys() { diff --git a/src/applications/config/check/PhabricatorStorageSetupCheck.php b/src/applications/config/check/PhabricatorStorageSetupCheck.php --- a/src/applications/config/check/PhabricatorStorageSetupCheck.php +++ b/src/applications/config/check/PhabricatorStorageSetupCheck.php @@ -6,10 +6,7 @@ return self::GROUP_OTHER; } - /** - * @phutil-external-symbol class PhabricatorStartup - */ - protected function executeChecks() { + protected function executeCommonChecks() { $engines = PhabricatorFileStorageEngine::loadWritableChunkEngines(); $chunk_engine_active = (bool)$engines; @@ -34,7 +31,12 @@ ->setName(pht('Large File Storage Not Configured')) ->setMessage($message); } + } + /** + * @phutil-external-symbol class PhabricatorStartup + */ + protected function executeWebChecks() { $post_max_size = ini_get('post_max_size'); if ($post_max_size && ((int)$post_max_size > 0)) { $post_max_bytes = phutil_parse_bytes($post_max_size); @@ -66,6 +68,10 @@ // held in memory in the raw and as a query string. $need_bytes = (64 * 1024 * 1024); + if (!class_exists('PhabricatorStartup', false)) { + return; + } + $memory_limit = PhabricatorStartup::getOldMemoryLimit(); if ($memory_limit && ((int)$memory_limit > 0)) { $memory_limit_bytes = phutil_parse_bytes($memory_limit); diff --git a/src/applications/config/check/PhabricatorTimezoneSetupCheck.php b/src/applications/config/check/PhabricatorTimezoneSetupCheck.php --- a/src/applications/config/check/PhabricatorTimezoneSetupCheck.php +++ b/src/applications/config/check/PhabricatorTimezoneSetupCheck.php @@ -6,7 +6,7 @@ return self::GROUP_OTHER; } - protected function executeChecks() { + protected function executeCommonChecks() { $php_value = ini_get('date.timezone'); if ($php_value) { $old = date_default_timezone_get(); diff --git a/src/applications/config/management/PhabricatorConfigManagementCheckWorkflow.php b/src/applications/config/management/PhabricatorConfigManagementCheckWorkflow.php new file mode 100644 --- /dev/null +++ b/src/applications/config/management/PhabricatorConfigManagementCheckWorkflow.php @@ -0,0 +1,35 @@ +setName('check') + ->setExamples('**check**') + ->setSynopsis(pht('Execute setup checks.')); + } + + public function execute(PhutilArgumentParser $args) { + $issues = PhabricatorSetupCheck::runAllChecks(); + + $table = id(new PhutilConsoleTable()) + ->addColumn('name', array('title' => pht('Name'))) + ->addColumn('group', array('title' => pht('Group'))) + ->addColumn('isFatal', array('title' => pht('Fatal'))) + ->addColumn('isIgnored', array('title' => pht('Ignored'))); + + foreach ($issues as $issue) { + $table->addRow(array( + 'name' => $issue->getName(), + 'group' => $issue->getGroup(), + 'isFatal' => $issue->getIsFatal() ? pht('Yes') : pht('No'), + 'isIgnored' => $issue->getIsIgnored() ? pht('Yes') : pht('No'), + )); + } + + $table->draw(); + return count($issues) - count(mfilter($issues, 'getIsIgnored')); + } + +}